Поделиться через


Массовое копирование из переменных приложения

Массовое копирование можно производить напрямую из переменных программы. После выделения переменных для хранения данных для строки и вызова 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" не существует. Отправлять данные можно только от приложения на сервер.

См. также:

Выполнение операций массового копирования (ODBC)