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