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


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

Массовое копирование можно производить напрямую из переменных программы. После выделения переменных для хранения данных для строки и вызова bcp_init для запуска массового копирования вызовите bcp_bind для каждого столбца, чтобы указать расположение и формат переменной программы, связанной с столбцом. Заполните каждую переменную данными, а затем вызовите bcp_sendrow для отправки одной строки данных на сервер. Повторите процесс заполнения переменных и вызова bcp_sendrow до отправки всех строк на сервер, а затем вызовите bcp_done, чтобы указать, что операция завершена.

Параметр pData bcp_bindсодержит адрес переменной, привязанной к столбцу. Данные каждого столбца можно сохранить двумя способами:

  • выделить одну переменную для хранения данных;

  • выделить переменную признака, сопровождаемую переменной данных.

Переменная признака определяет длину данных столбцов переменной длины, а также значения типа 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 определяются в sqlncli.h для использования с функцией ODBC bcp_bind .

Функции массового копирования данных поддерживают не все типы данных ODBC C. Например, функции массового копирования не поддерживают структуру ODBC SQL_C_TYPE_TIMESTAMP, поэтому используйте SQLBindCol или SQLGetData для преобразования данных ODBC SQL_TYPE_TIMESTAMP в переменную SQL_C_CHAR. Если вы используете bcp_bind с параметром типа SQLCHARACTER для привязки переменной к столбцу даты и времени SQL Server, функции массового копирования преобразуют предложение escape-метки времени в символьной переменной в соответствующий формат datetime.

В следующей таблице перечислены рекомендуемые типы данных, которые следует использовать в сопоставлении с типом данных SQL ODBC с типом данных 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

изменение символов

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 десятичное

dec

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 десятичное

dec
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 Изображение
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 data types. Чтобы предотвратить потерю значений данных при переносе этих типов данных, создайте таблицу 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 в любое время, когда необходимо изменить адрес переменной данных, первоначально указанной в параметре pData bcp_bind. Приложение может использовать функцию bcp_collen в любое время, когда необходимо изменить длину данных, указанную в параметре bcp_bindcbData.

Невозможно считывать данные из SQL Server в переменные программы с помощью массового копирования; Нет ничего подобного функции "bcp_readrow". Отправлять данные можно только от приложения на сервер.

См. также

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