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