Массовое копирование из переменных приложения
Массовое копирование можно производить напрямую из переменных программы. После распределения переменных для хранения данных строки и вызова функции bcp_init для запуска массового копирования вызовите функцию bcp_bind для каждого столбца, чтобы указать расположение и формат переменной программы, которую нужно связать со столбцом. Заполните каждую переменную данными и вызовите функцию bcp_sendrow, чтобы отправить одну строку данных на сервер. Повторяйте процесс заполнения переменных и вызова функции bcp_sendrow до тех пор, пока все строки не будут отправлены на сервер. После этого вызовите функцию bcp_done, чтобы указать завершение операции.
Параметр pData функции bcp_bind содержит адрес переменной, привязанной к столбцу. Данные каждого столбца можно сохранить двумя способами:
выделить одну переменную для хранения данных;
выделить переменную признака, сопровождаемую переменной данных.
Переменная признака определяет длину данных столбцов переменной длины, а также значения типа NULL, если они разрешены столбцом. При использовании только переменной данных адрес этой переменной хранится в параметре pData функции bcp_bind. При использовании только переменной признака адрес этой переменной хранится в параметре pData функции bcp_bind. Функции массового копирования вычисляют расположение переменной данных путем добавления параметров cbIndicator и pData функции bcp_bind.
Функция bcp_bind поддерживает три метода работы с данными переменной длины.
Используйте параметр cbData только с переменной данных. Поместите длину данных в параметр cbData. При каждом изменении длины данных, над которыми необходимо выполнить операцию массового копирования, вызовите функцию bcp_collen для сброса параметра cbData. При использовании двух других методов укажите для параметра cbData значение SQL_VARLEN_DATA. Если все значения данных, указанных для столбца, являются значениями типа NULL, укажите для параметра cbData значение SQL_NULL_DATA.
Используйте переменные признака. При каждом перемещении нового значения в переменную данных следует сохранять длину значения в переменной признака. При использовании двух других методов укажите для параметра cbIndicator значение 0.
Используйте указатели признака конца. Загрузите параметр pTerm функции bcp_bind с адресом битового шаблона, который прерывает данные. При использовании двух других методов укажите для параметра pTerm значение типа NULL.
Все эти три метода могут использоваться в одном вызове функции bcp_bind. В этом случае используется спецификация, которая приводит к копированию самого малого объема данных.
Параметр type функции bcp_bind использует идентификаторы типа данных 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 Server datetime функции массового копирования преобразуют предложение экранирования отметки времени внутри символьной переменной в правильный формат datetime.
В следующей таблице перечислены типы данных, рекомендуемые для использования в сопоставлении типа данных ODBC SQL с типом данных SQL Server.
Тип данных ODBC SQL |
Тип данных ODBC C |
Параметр type функции 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 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 не поддерживает напрямую типы данных интервала. Однако приложение может сохранять управляющие последовательности интервала в виде символьных строк в символьном столбце SQL Server. Приложение может считывать их для дальнейшего использования, но они не могут использоваться в инструкциях Transact-SQL.
Функции массового копирования могут использоваться для быстрой загрузки данных в SQL Server, который был считан из источника данных ODBC. Используйте SQLBindCol для привязки столбцов результирующего набора к переменным программы и затем функцию bcp_bind для привязки тех же переменных программы к операции массового копирования. Вызов функции SQLFetchScroll или SQLFetch производит выборку строк данных из источника данных ODBC в переменные программы, а вызов bcp_sendrow производит массовое копирование данных из переменных программы в SQL Server.
Приложение может использовать функцию bcp_colptr для изменения адреса переменной данных, первоначально указанного в параметре bcp_bind pData. Приложение может использовать функцию bcp_collen для изменения длины данных, первоначально указанной в параметре bcp_bind cbData.
С помощью операции массового копирования нельзя считать данные из SQL Server в переменные программы. Она не похожа на функцию «bcp_readrow». Отправлять данные можно только от приложения на сервер.