Массовое копирование из переменных приложения
Массовое копирование можно производить напрямую из переменных программы. После выделения переменных для хранения данных для строки и вызова bcp_init для запуска массового копирования вызовите bcp_bind для каждого столбца, чтобы указать расположение и формат переменной программы, связанной со столбцом. Заполните каждую переменную данными, а затем вызовите bcp_sendrow , чтобы отправить одну строку данных на сервер. Повторите процесс заполнения переменных и вызова bcp_sendrow , пока все строки не будут отправлены на сервер, а затем вызовите bcp_done , чтобы указать, что операция завершена.
Параметр bcp_bindpData содержит адрес переменной, привязанной к столбцу. Данные каждого столбца можно сохранить двумя способами:
выделить одну переменную для хранения данных;
выделить переменную признака, сопровождаемую переменной данных.
Переменная признака определяет длину данных столбцов переменной длины, а также значения типа NULL, если они разрешены столбцом. Если используется только переменная данных, то адрес этой переменной сохраняется в параметре bcp_bindpData . Если используется переменная индикатора, адрес переменной индикатора сохраняется в параметре bcp_bindpData . Функции массового копирования вычисляют расположение переменной данных, добавляя параметры bcp_bindcbIndicator и pData .
bcp_bind поддерживает три метода для работы с данными переменной длины:
Используйте cbData только с переменной данных. Поместите длину данных в cbData. При каждом изменении длины данных для массового копирования вызовите bcp_collenдля сброса cbData. Если используется один из двух других методов, укажите SQL_VARLEN_DATA для cbData. Если все значения данных, предоставляемые для столбца, имеют значение NULL, укажите SQL_NULL_DATA для cbData.
Используйте переменные признака. При каждом перемещении нового значения в переменную данных следует сохранять длину значения в переменной признака. Если используется один из двух других методов, укажите 0 для cbIndicator.
Используйте указатели признака конца. Загрузите параметр bcp_bindpTerm с адресом битового шаблона, который завершает данные. Если используется один из двух других методов, укажите значение NULL для pTerm.
Все три этих метода можно использовать в одном bcp_bind вызове. В этом случае используется спецификация, которая приводит к наименьшим объемам копируемых данных.
Параметр типа bcp_bind использует DB-Library идентификаторы типов данных, а не идентификаторы типов данных ODBC. DB-Library идентификаторы типов данных определяются в sqlncli.h для использования с функцией bcp_bind ODBC.
Функции массового копирования данных поддерживают не все типы данных ODBC C. Например, функции массового копирования не поддерживают структуру ODBC SQL_C_TYPE_TIMESTAMP, поэтому используйте SQLBindCol или SQLGetData для преобразования данных ODBC SQL_TYPE_TIMESTAMP в переменную SQL_C_CHAR. Если затем использовать bcp_bind с параметром типа SQLCHARACTER для привязки переменной к SQL Server столбцу datetime, функции массового копирования преобразуют предложение escape-метки времени в символьной переменной в правильный формат datetime.
В следующей таблице перечислены рекомендуемые типы данных, которые следует использовать при сопоставлении типа данных ODBC SQL с типом данных SQL Server.
Тип данных ODBC SQL | Тип данных ODBC C | параметр типа bcp_bind | Тип данных SQL Server |
---|---|---|---|
SQL_CHAR | SQL_C_CHAR | SQLCHARACTER | character char |
SQL_VARCHAR | SQL_C_CHAR | SQLCHARACTER | varchar character varying char varying sysname |
SQL_LONGVARCHAR | SQL_C_CHAR | SQLCHARACTER | text |
SQL_WCHAR | SQL_C_WCHAR | SQLNCHAR | nchar |
SQL_WVARCHAR | SQL_C_WCHAR | SQLNVARCHAR | nvarchar |
SQL_WLONGVARCHAR | SQL_C_WCHAR | SQLNTEXT | ntext |
SQL_DECIMAL | SQL_C_CHAR | SQLCHARACTER | decimal Декабря money smallmoney |
SQL_NUMERIC | SQL_C_NUMERIC | SQLNUMERICN | numeric |
SQL_BIT | SQL_C_BIT | SQLBIT | bit |
SQL_TINYINT (подписанный) | SQL_C_SSHORT | SQLINT2 | smallint |
SQL_TINYINT (неподписанный) | SQL_C_UTINYINT | SQLINT1 | tinyint |
SQL_SMALL_INT (подписанный) | SQL_C_SSHORT | SQLINT2 | smallint |
SQL_SMALL_INT (неподписанный) | SQL_C_SLONG | SQLINT4 | int integer |
SQL_INTEGER (подписанный) | SQL_C_SLONG | SQLINT4 | int integer |
SQL_INTEGER (неподписанный) | SQL_C_CHAR | SQLCHARACTER | decimal Декабря |
SQL_BIGINT (подписанный и неподписанный) | SQL_C_CHAR | SQLCHARACTER | bigint |
SQL_REAL | SQL_C_FLOAT | SQLFLT4 | real |
SQL_FLOAT | SQL_C_DOUBLE | SQLFLT8 | float |
SQL_DOUBLE | SQL_C_DOUBLE | SQLFLT8 | float |
SQL_BINARY | SQL_C_BINARY | SQLBINARY | binary timestamp |
SQL_VARBINARY | SQL_C_BINARY | SQLBINARY | varbinary переменная двоичного файла |
SQL_LONGVARBINARY | SQL_C_BINARY | SQLBINARY | image |
SQL_TYPE_DATE | SQL_C_CHAR | SQLCHARACTER | datetime smalldatetime |
SQL_TYPE_TIME | SQL_C_CHAR | SQLCHARACTER | datetime smalldatetime |
SQL_TYPE_TIMESTAMP | SQL_C_CHAR | SQLCHARACTER | datetime smalldatetime |
SQL_GUID | SQL_C_GUID | SQLUNIQUEID | uniqueidentifier |
SQL_INTERVAL_ | SQL_C_CHAR | SQLCHARACTER | char |
SQL Server не имеет подписанных типов данных tinyint, unsigned smallint или unsigned int. Чтобы предотвратить потерю значений данных при переносе этих типов данных, создайте SQL Server таблицу со следующим по величине целочисленным типом данных. Чтобы пользователи не могли добавлять значения за пределы диапазона, разрешенного исходным типом данных, примените правило к столбцу SQL Server, чтобы ограничить допустимые значения диапазоном, поддерживаемым типом данных в исходном источнике:
CREATE TABLE Sample_Ints(STinyIntCol SMALLINT,
USmallIntCol INT)
GO
CREATE RULE STinyInt_Rule
AS
@range >= -128 AND @range <= 127
GO
CREATE RULE USmallInt_Rule
AS
@range >= 0 AND @range <= 65535
GO
sp_bindrule STinyInt_Rule, 'Sample_Ints.STinyIntCol'
GO
sp_bindrule USmallInt_Rule, 'Sample_Ints.USmallIntCol'
GO
SQL Server не поддерживает типы данных интервала напрямую. Однако приложение может хранить интервальные escape-последовательности в виде строк символов в столбце SQL Server символов. Приложение может считывать их для последующего использования, но их нельзя использовать в инструкциях Transact-SQL.
Функции массового копирования можно использовать для быстрой загрузки данных в SQL Server, которые были считаны из источника данных ODBC. Используйте SQLBindCol для привязки столбцов результированного набора к переменным программы, а затем используйте bcp_bind для привязки тех же программных переменных к операции массового копирования. Вызов SQLFetchScroll или SQLFetch затем извлекает строку данных из источника данных ODBC в переменные программы, а вызов bcp_sendrow массово копирует данные из переменных программы в SQL Server .
Приложение может использовать функцию bcp_colptr в любое время, когда ему потребуется изменить адрес переменной данных, первоначально указанный в параметре bcp_bindpData . Приложение может использовать функцию bcp_collen в любое время, когда ему потребуется изменить длину данных, первоначально указанную в параметре bcp_bindcbData .
Невозможно считывать данные из SQL Server в переменные программы с помощью массового копирования. Функция "bcp_readrow" не существует. Отправлять данные можно только от приложения на сервер.