Logo Host-telecom.com — профессиональный хостинг в Европе! Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Хостинг + Certum Commercial SSL и домен в подарок

VPS: SSD, KVM, бесплатные бэкапы и администрирование 24/7

Бесплатный перенос сайта + подарки к новоселью

хостинг сайтов ГиперХост — хостинг сайтов который Вы искали.

Виртуальный хостинг, Аренда VPS серверов, рация доменных имен, SSL сертификаты

💰 Самые низкие цены на домены

🔒 Отличный хостинг на SSD c бесплатными SSL

💻 Огромнейший выбор dedicated выделенных серверов

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

2004 г

MySQL: Руководство по ODBC и MyODBC. Версия 1.0. 20 апреля 2004 г.

Алексей Паутов,
Все о MySQL на русском: http://www.botik.ru/~rldp/mysql.htm, ftp://ftp.botik.ru/rented/rldp/www/pub
Russian LDP: http://www.botik.ru/~rldp, ftp://ftp.botik.ru/rented/rldp

содержание

6 Дополнительная информация по MyODBC

6.1 Типы данных в MyODBC

Следующая таблица иллюстрирует, как драйвер отображает типы данных сервера к заданным по умолчанию SQL и C-типам данных:

Тип на сервере SQL-тип C-тип
tinyint SQL_TINYINT SQL_C_STINYINT
tinyint unsigned SQL_TINYINT SQL_C_UTINYINT
bigint SQL_BIGINT SQL_C_SBIGINT
bigint unsigned SQL_BIGINT SQL_C_UBIGINT
long varbinary SQL_LONGVARBINARY SQL_C_BINARY
blob SQL_VARBINARY SQL_C_BINARY
longblob SQL_VARBINARY SQL_C_BINARY
tinyblob SQL_BINARY SQL_C_BINARY
mediumblob SQL_LONGVARBINARY SQL_C_BINARY
long varchar SQL_LONGVARCHAR SQL_C_CHAR
text SQL_LONGVARCHAR SQL_C_CHAR
mediumtext SQL_LONGVARCHAR SQL_C_CHAR
char SQL_CHAR SQL_C_CHAR
numeric SQL_NUMERIC SQL_C_CHAR
decimal SQL_DECIMAL SQL_C_CHAR
integer SQL_INTEGER SQL_C_SLONG
integer unsigned SQL_INTEGER SQL_C_ULONG
int SQL_INTEGER SQL_C_SLONG
int unsigned SQL_INTEGER SQL_C_ULONG
mediumint SQL_INTEGER SQL_C_SLONG
mediumint unsigned SQL_INTEGER SQL_C_ULONG
smallint SQL_SMALLINT SQL_C_SSHORT
smallint unsigned SQL_SMALLINT SQL_C_USHORT
real SQL_FLOAT SQL_C_DOUBLE
double SQL_FLOAT SQL_C_DOUBLE
float SQL_REAL SQL_C_FLOAT
double prec SQL_DOUBLE SQL_C_DOUBLE
date SQL_DATE SQL_C_DATE
time SQL_TIME SQL_C_TIME
year SQL_SMALLINT SQL_C_SHORT
datetime SQL_TIMESTAMP SQL_C_TIMESTAMP
timestamp SQL_TIMESTAMP SQL_C_TIMESTAMP
text SQL_VARCHAR SQL_C_CHAR
varchar SQL_VARCHAR SQL_C_CHAR
enum SQL_VARCHAR SQL_C_CHAR
set SQL_VARCHAR SQL_C_CHAR
6.2 Коды ошибок MyODBC

Следующая таблица вносит в список коды ошибок, возвращаемые драйвером кроме ошибок сервера.

Код ошибки SQLSTATE 2< /STRONG> SQLSTATE 3 Сообщение
500 01000 01000 Общее предупреждение.
501 01004 01004 Данные для строки подрезаны справа.
502 01S02 01S02 Измененное значение Option.
503 01S03 01S03 Никакие строки не изменены.
504 01S04 01S04 Больше, чем одна модифицируемая/удаляемая строка.
505 01S06 01S06 Пытаетесь выбирать данные прежде, чем набор результатов возвратил первый набор строк.
506 07001 07002 SQLBindParameter не используемый для всех параметров.
507 07005 07005 Подготовленная инструкция не специфична для курсора.
508 07009 07009 Недопустимый дескрипторный индекс.
509 08002 08002 Имя подключения занято.
510 08003 08003 Подключение не существует.
511 24000 24000 Недопустимое состояние курсора.
512 25000 25000 Недопустимое состояние транзакции.
513 25S01 25S01 Неизвестное состояние транзакции.
514 34000 34000 Недопустимое имя курсора.
515 S1000 HY000 Общая ошибка драйвера.
516 S1001 HY001 Ошибка распределения памяти.
517 S1002 HY002 Недопустимый номер столбца.
518 S1003 HY003 Недопустимый тип буфера прикладных программ.
519 S1004 HY004 Недопустимый SQL-тип данных.
520 S1009 HY009 Недопустимое использование null.
521 S1010 HY010 Функциональная ошибка последовательности.
522 S1011 HY011 Атрибут не может быть установлен в настоящий момент.
523 S1012 HY012 Недопустимый код операции транзакции.
524 S1013 HY013 Ошибка управления памятью.
525 S1015 HY015 Никакое имя курсора недоступно.
526 S1024 HY024 Недопустимое значение атрибута.
527 S1090 HY090 Недопустимая длина строки или буфера.
528 S1091 HY091 Недопустимый дескрипторный идентификатор поля.
529 S1092 HY092 Недопустимый идентификатор атрибута или опции.
530 S1093 HY093 Недопустимый номер параметра.
531 S1095 HY095 Функциональный тип вне диапазона.
532 S1106 HY106 Тип выборки вне диапазона.
533 S1117 HY117 Значение строки вне диапазона.
534 S1109 HY109 Недопустимая позиция курсора.
535 S1C00 HYC00 Факультативное свойство не выполнено.
0 21S01 21S01 Число столбцов не соответствует значению.
0 23000 23000 Нарушение ограничения целостности.
0 42000 42000 Ошибка синтаксиса или нарушение прав доступа в системе.
0 42S02 42S02 Основная таблица или представление не найдено.
0 42S12 42S12 Индекс не найден.
0 42S21 42S21 Столбец уже существует.
0 42S22 42S22 Столбец не найден.
0 08S01 08S01 Сбой связи.
6.3 MyODBC с VB: ADO, DAO и RDO

Эта глава содержит простые примеры использования MySQL ODBC 3.51 с ADO, DAO и RDO.

6.3.1 ADO: rs.addNew, rs.delete и rs.update

Следующий пример для ADO (ActiveX Data Objects) создает таблицу my_ado и показывает использование rs.addNew, rs.delete и rs.update.

Private Sub myodbc_ado_Click()
  Dim conn As ADODB.Connection
  Dim rs As ADODB.Recordset
  Dim fld As ADODB.Field
  Dim sql As String

  'connect to MySQL server using MySQL ODBC 3.51 Driver
  Set conn = New ADODB.Connection
  conn.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};"_
                        & "SERVER=localhost;"_
                        & " DATABASE=test;"_
                        & "UID=venu;PWD=venu; OPTION=35"
  conn.Open
  'create table
  conn.Execute "DROP TABLE IF EXISTS my_ado"
  conn.Execute "CREATE TABLE my_ado(id int not null primary key,
                name varchar(20)," _
                & "txt text, dt date, tm time, ts timestamp)"
  'direct insert
  conn.Execute "INSERT INTO my_ado(id,name,txt) values(1,100,'venu')"
  conn.Execute "INSERT INTO my_ado(id,name,txt) values(2,200,'MySQL')"
  conn.Execute "INSERT INTO my_ado(id,name,txt) values(3,300,'Delete')"
  Set rs = New ADODB.Recordset
  rs.CursorLocation = adUseServer
  'fetch the initial table ..
  rs.Open "SELECT * FROM my_ado", conn
    Debug.Print rs.RecordCount
    rs.MoveFirst
    Debug.Print String(50, "-") & "Initial my_ado Result Set "
                       & String(50, "-")
    For Each fld In rs.Fields
      Debug.Print fld.Name,
      Next
      Debug.Print
      Do Until rs.EOF
      For Each fld In rs.Fields
      Debug.Print fld.Value,
      Next
      rs.MoveNext
      Debug.Print
    Loop
  rs.Close
  'rs insert
  rs.Open "select * from my_ado", conn, adOpenDynamic, adLockOptimistic
  rs.AddNew
  rs!Name = "Monty"
  rs!txt = "Insert row"
  rs.Update
  rs.Close
  'rs update
  rs.Open "SELECT * FROM my_ado"
  rs!Name = "update"
  rs!txt = "updated-row"
  rs.Update
  rs.Close
  'rs update second time..
  rs.Open "SELECT * FROM my_ado"
  rs!Name = "update"
  rs!txt = "updated-second-time"
  rs.Update
  rs.Close
  'rs delete
  rs.Open "SELECT * FROM my_ado"
  rs.MoveNext
  rs.MoveNext
  rs.Delete
  rs.Close
  'fetch the updated table ..
  rs.Open "SELECT * FROM my_ado", conn
    Debug.Print rs.RecordCount
    rs.MoveFirst
    Debug.Print String(50, "-") & "Updated my_ado Result Set "
                       & String(50, "-")
    For Each fld In rs.Fields
      Debug.Print fld.Name,
      Next
      Debug.Print
      Do Until rs.EOF
      For Each fld In rs.Fields
      Debug.Print fld.Value,
      Next
      rs.MoveNext
      Debug.Print
    Loop
  rs.Close
  conn.Close
End Sub

6.3.2 DAO: rs.addNew, rs.update и прокрутка

Следующий пример для DAO (Data Access Objects) создает таблицу my_dao и показывает использование rs.addNew, rs.update, а также прокрутку (скроллинг) набора результатов.

Private Sub myodbc_dao_Click()
  Dim ws As Workspace
  Dim conn As Connection
  Dim queryDef As queryDef
  Dim str As String

  'connect to MySQL using MySQL ODBC 3.51 Driver
  Set ws = DBEngine.CreateWorkspace("", "venu", "venu", dbUseODBC)
  str = "odbc;DRIVER={MySQL ODBC 3.51 Driver};"_
                      & "SERVER=localhost;"_
                      & " DATABASE=test;"_
                      & "UID=venu;PWD=venu; OPTION=35"
  Set conn = ws.OpenConnection("test", dbDriverNoPrompt, False, str)
  'Create table my_dao
  Set queryDef = conn.CreateQueryDef("", "drop table if exists my_dao")
  queryDef.Execute
  Set queryDef = conn.CreateQueryDef("", "create table my_dao(Id
                 INT AUTO_INCREMENT PRIMARY KEY, " _
                 & "Ts TIMESTAMP(14) NOT NULL,Name varchar(20),
                 Id2 INT)")
  queryDef.Execute
  'Insert new records using rs.addNew
  Set rs = conn.OpenRecordset("my_dao")
  Dim i As Integer
    For i = 10 To 15
    rs.AddNew
    rs!Name = "insert record" & i
    rs!Id2 = i
    rs.Update
    Next i
    rs.Close
  'rs update..
  Set rs = conn.OpenRecordset("my_dao")
  rs.Edit
  rs!Name = "updated-string"
  rs.Update
  rs.Close
  'fetch the table back...
  Set rs = conn.OpenRecordset("my_dao", dbOpenDynamic)
  str = "Results:"
  rs.MoveFirst
  While Not rs.EOF
  str = " " & rs!Id & " , " & rs!Name & ", "
        & rs!Ts & ", " & rs!Id2
  Debug.Print "DATA:" & str
  rs.MoveNext
  Wend
  'rs Scrolling
  rs.MoveFirst
  str = " FIRST ROW: " & rs!Id & " , " & rs!Name & ", "
        & rs!Ts & ", " & rs!Id2
  Debug.Print str
  rs.MoveLast
  str = " LAST ROW: " & rs!Id & " , " & rs!Name & ", "
        & rs!Ts & ", " & rs!Id2
  Debug.Print str
  rs.MovePrevious
  str = " LAST-1 ROW: " & rs!Id & " , " & rs!Name & ", "
        & rs!Ts & ", " & rs!Id2
  Debug.Print str
  'free all resources
  rs.Close
  queryDef.Close
  conn.Close
  ws.Close
End Sub

6.3.3 RDO: rs.addNew и rs.update

Следующий пример для RDO (Remote Data Objects) создает таблицу my_rdo и показывает использование rs.addNew и rs.update.

Dim rs As rdoResultset
  Dim cn As New rdoConnection
  Dim cl As rdoColumn
  Dim SQL As String

  'cn.Connect = "DSN=test;"
  cn.Connect = "DRIVER={MySQL ODBC 3.51 Driver};"_
                       & "SERVER=localhost;"_
                       & " DATABASE=test;"_
                       & "UID=venu;PWD=venu; OPTION=35"
  cn.CursorDriver = rdUseOdbc
  cn.EstablishConnection rdDriverPrompt
  'drop table my_rdo
  SQL = "drop table if exists my_rdo"
  cn.Execute SQL, rdExecDirect
  'create table my_rdo
  SQL = "create table my_rdo(id int, name varchar(20))"
  cn.Execute SQL, rdExecDirect
  'insert - direct
  SQL = "insert into my_rdo values (100,'venu')"
  cn.Execute SQL, rdExecDirect
  SQL = "insert into my_rdo values (200,'MySQL')"
  cn.Execute SQL, rdExecDirect
  'rs insert
  SQL = "select * from my_rdo"
  Set rs = cn.OpenResultset(SQL, rdOpenStatic, rdConcurRowVer, rdExecDirect)
  rs.AddNew
  rs!id = 300
  rs!Name = "Insert1"
  rs.Update
  rs.Close
  'rs insert
  SQL = "select * from my_rdo"
  Set rs = cn.OpenResultset(SQL, rdOpenStatic, rdConcurRowVer, rdExecDirect)
  rs.AddNew
  rs!id = 400
  rs!Name = "Insert 2"
  rs.Update
  rs.Close
  'rs update
  SQL = "select * from my_rdo"
  Set rs = cn.OpenResultset(SQL, rdOpenStatic, rdConcurRowVer, rdExecDirect)
  rs.Edit
  rs!id = 999
  rs!Name = "updated"
  rs.Update
  rs.Close
  'fetch back...
  SQL = "select * from my_rdo"
  Set rs = cn.OpenResultset(SQL, rdOpenStatic, rdConcurRowVer, rdExecDirect)
  Do Until rs.EOF
  For Each cl In rs.rdoColumns
      Debug.Print cl.Value,
    Next
    rs.MoveNext
    Debug.Print
    Loop
  Debug.Print "Row count="; rs.RowCount
  'close
  rs.Close
  cn.Close
End Sub

6.4 MyODBC и Microsoft .NET

Эта глава содержит простые примеры, чтобы показать использование драйверов MyODBC с ODBC.NET.

6.4.1 ODBC.NET: CSHARP(C#)

Следующий пример создает таблицу my_odbc_net и показывает использование в C#.

/**
 * @sample  : mycon.cs
 * @purpose : Demo sample for ODBC.NET using MyODBC or MyODBC 3.51
 * @author  : Venu, venu@mysql.com
 *
 * (C) Copyright MySQL AB, 1995-2002
 *
**/

/* build command
  *
  *  csc /t:exe
  *      /out:mycon.exe mycon.cs
  *      /r:Microsoft.Data.Odbc.dll
 */
using Console = System.Console;
using Microsoft.Data.Odbc;

namespace myodbc3
{
  class mycon
  {
    static void Main(string[] args)
    {
      try
      {
        //Connection string for MyODBC 2.50
        /*string MyConString = "DRIVER={MySQL};" + "SERVER=localhost;" +
                               "DATABASE=test;" + "UID=venu;" +
                               "PASSWORD=venu;" + "OPTION=3";
        */
        //Connection string for MyODBC 3.51
        string MyConString = "DRIVER={MySQL ODBC 3.51 Driver};" +
                             "SERVER=localhost;" + "DATABASE=test;" +
                             "UID=venu;" + "PASSWORD=venu;" + "OPTION=3";
        //Connect to MySQL using MyODBC
        OdbcConnection MyConnection = new OdbcConnection(MyConString);
        MyConnection.Open();
        Console.WriteLine("\n !!! success, connected successfully !!!\n");
        //Display connection information
        Console.WriteLine("Connection Information:");
        Console.WriteLine("\tConnection String:" +
                          MyConnection.ConnectionString);
        Console.WriteLine("\tConnection Timeout:" +
                          MyConnection.ConnectionTimeout);
        Console.WriteLine("\tDatabase:" + MyConnection.Database);
        Console.WriteLine("\tDataSource:" + MyConnection.DataSource);
        Console.WriteLine("\tDriver:" + MyConnection.Driver);
        Console.WriteLine("\tServerVersion:" + MyConnection.ServerVersion);
        //Create a sample table
        OdbcCommand MyCommand = new OdbcCommand("DROP TABLE IF EXISTS
                                                my_odbc_net",MyConnection);
        MyCommand.ExecuteNonQuery();
        MyCommand.CommandText = "CREATE TABLE my_odbc_net(id int, name
                                varchar(20), idb bigint)";
        MyCommand.ExecuteNonQuery();
        //Insert
        MyCommand.CommandText = "INSERT INTO my_odbc_net VALUES(10,'venu',
                                300)";
        Console.WriteLine("INSERT, Total rows affected:" +
                          MyCommand.ExecuteNonQuery());;
        //Insert
        MyCommand.CommandText = "INSERT INTO my_odbc_net
                                VALUES(20,'mysql',400)";
        Console.WriteLine("INSERT, Total rows affected:" +
                          MyCommand.ExecuteNonQuery());
        //Insert
        MyCommand.CommandText = "INSERT INTO my_odbc_net
                                VALUES(20,'mysql',500)";
        Console.WriteLine("INSERT, Total rows affected:" +
                          MyCommand.ExecuteNonQuery());
        //Update
        MyCommand.CommandText = "UPDATE my_odbc_net SET id=999 WHERE id=20";
        Console.WriteLine("Update, Total rows affected:" +
                          MyCommand.ExecuteNonQuery());
        //COUNT(*)
        MyCommand.CommandText = "SELECT COUNT(*) as TRows FROM my_odbc_net";
        Console.WriteLine("Total Rows:" + MyCommand.ExecuteScalar());
        //Fetch
        MyCommand.CommandText = "SELECT * FROM my_odbc_net";
        OdbcDataReader MyDataReader;
        MyDataReader =  MyCommand.ExecuteReader();
        while (MyDataReader.Read())
        {
          if (string.Compare(MyConnection.Driver,"myodbc3.dll") == 0) {
             Console.WriteLine("Data:" + MyDataReader.GetInt32(0) + " " +
                               MyDataReader.GetString(1) + " " +
                               MyDataReader.GetInt64(2));
          }
          else
          {
            Console.WriteLine("Data:" + MyDataReader.GetInt32(0) + " " +
                              MyDataReader.GetString(1) + " " +
                              MyDataReader.GetInt32(2));
                              // BIGINTs not supported by MyODBC
          }
        }
        // Close all resources
        MyDataReader.Close();
        MyConnection.Close();
      }
      catch (OdbcException MyOdbcException)  // Catch any ODBC exception ..
      {
        for (int i=0; i < MyOdbcException.Errors.Count; i++)
        {
          Console.Write("ERROR #" + i + "\n" +
            "Message: " + MyOdbcException.Errors[i].Message + "\n" +
            "Native: " + MyOdbcException.Errors[i].NativeError.ToString() +
            "\n" + "Source: " + MyOdbcException.Errors[i].Source + "\n" +
            "SQL: " + MyOdbcException.Errors[i].SQLState + "\n");
        }
      }
    }
  }
}

6.4.2 ODBC.NET: VB

Следующий пример создает таблицу my_vb_net и показывает использование в VB.

' @sample  : myvb.vb
' @purpose : Demo sample for ODBC.NET using MyODBC or MyODBC 3.51
' @author  : Venu, venu@mysql.com
'
' (C) Copyright MySQL AB, 1995-2002
'
' build command
'
' vbc /target:exe
'     /out:myvb.exe
'     /r:Microsoft.Data.Odbc.dll
'     /r:System.dll
'     /r:System.Data.dll
Imports Microsoft.Data.Odbc
Imports System

Module myvb
  Sub Main()
    Try
      'MyODBC 3.51 connection string
      Dim MyConString As String = "DRIVER={MySQL ODBC 3.51 Driver};" & _
          "SERVER=localhost;" & _
          "DATABASE=test;" & _
          "UID=venu;" & _
          "PASSWORD=venu;" & _
          "OPTION=3;"
      'Connection
      Dim MyConnection As New OdbcConnection(MyConString)
      MyConnection.Open()
      Console.WriteLine("Connection State::" &
                        MyConnection.State.ToString)
      'Drop
      Console.WriteLine ("Dropping table")
      Dim MyCommand As New OdbcCommand()
      MyCommand.Connection = MyConnection
      MyCommand.CommandText = "DROP TABLE IF EXISTS my_vb_net"
      MyCommand.ExecuteNonQuery()
      'Create
      Console.WriteLine ("Creating....")
      MyCommand.CommandText = "CREATE TABLE my_vb_net(id int,
                              name varchar(30))"
      MyCommand.ExecuteNonQuery()
      'Insert
      MyCommand.CommandText = "INSERT INTO my_vb_net VALUES(10,'venu')"
      Console.WriteLine("INSERT, Total rows affected:" &
                        MyCommand.ExecuteNonQuery())
      'Insert
      MyCommand.CommandText = "INSERT INTO my_vb_net VALUES(20,'mysql')"
      Console.WriteLine("INSERT, Total rows affected:" &
                        MyCommand.ExecuteNonQuery())
      'Insert
      MyCommand.CommandText = "INSERT INTO my_vb_net VALUES(20,'mysql')"
      Console.WriteLine("INSERT, Total rows affected:" &
                        MyCommand.ExecuteNonQuery())
      'Insert
      MyCommand.CommandText = "INSERT INTO my_vb_net(id) VALUES(30)"
      Console.WriteLine("INSERT, Total rows affected:" &
                        MyCommand.ExecuteNonQuery())
      'Update
      MyCommand.CommandText = "UPDATE my_vb_net SET id=999 WHERE id=20"
      Console.WriteLine("Update, Total rows affected:" &
                        MyCommand.ExecuteNonQuery())
      'COUNT(*)
      MyCommand.CommandText = "SELECT COUNT(*) as TRows FROM my_vb_net"
      Console.WriteLine("Total Rows:" & MyCommand.ExecuteScalar())
      'Select
      Console.WriteLine ("Select * FROM my_vb_net")
      MyCommand.CommandText = "SELECT * FROM my_vb_net"
      Dim MyDataReader As OdbcDataReader
      MyDataReader = MyCommand.ExecuteReader
      While MyDataReader.Read
        If MyDataReader("name") Is DBNull.Value Then
           Console.WriteLine("id = " & CStr(MyDataReader("id")) &
                             "  name = " & "NULL")
        Else Console.WriteLine("id = " & CStr(MyDataReader("id")) &
                               "  name = " & CStr(MyDataReader("name")))
        End If
      End While
      'Catch ODBC Exception
      Catch MyOdbcException As OdbcException
        Dim i As Integer
        Console.WriteLine (MyOdbcException.ToString)
      'Catch program exception
      Catch MyException As Exception
        Console.WriteLine (MyException.ToString)
    End Try
  End Sub
End Module

6.5 Авторы

Это разработчики, которые работают в MySQL AB полный рабочий день над драйверами MyODBC и MyODBC 3.51.

содержание       назад       вперед

Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

ATLEX Выделенные серверы: в Европе / в России.

Виртуальные серверы: в Европе / в России.

Партнерская программа

Новости мира IT:

Архив новостей

Последние комментарии:

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 985 1945361
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...