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


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

Массовое копирование можно производить напрямую из переменных программы. После распределения переменных для хранения данных строки и вызова 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. При использовании двух других методов, укажите для cbData значение SQL_VARLEN_DATA. Если все значения данных, указанных для столбца, являются значениями типа NULL, укажите для cbData значение SQL_NULL_DATA.

  • Используйте переменные индикатора. При каждом перемещении нового значения в переменную данных следует сохранять длину значения в переменной индикатора. При использовании двух других методов укажите для cbIndicator значение 0.

  • Используйте указатели-ограничители. Загрузите параметр bcp_bindpTerm с адресом битового шаблона, который прерывает данные. При использовании двух других методов укажите для pTerm значение типа NULL.

Все эти три метода могут использоваться в одном вызове bcp_bind. В этом случае используется спецификация, которая приводит к копированию самого малого объема данных.

Параметр bcp_bindtype использует идентификаторы типа данных DB-Library, а не ODBC. Идентификаторы типа данных DB-Library определяются в файле sqlncli.h для использования с функцией ODBC bcp_bind.

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

В следующей таблице перечислены типы данных, рекомендуемые для использования в сопоставлении типа данных ODBC SQL с типом данных SQL Server.

Тип данных ODBC SQL

Тип данных ODBC C

Параметр bcp_bind type

Тип данных 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

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

decimal

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

binary varying

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 и неподписанные типы данных smallint и int. Для предотвращения потери значений данных при миграции этих типов данных создайте таблицу SQL Server со следующим наибольшим типом данных integer. Для предотвращения последующего добавления пользователями значений, находящихся за пределами диапазона, разрешенного исходными типом данных, примените к столбцу 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». Отправлять данные можно только от приложения на сервер.