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


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

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

См. также

Основные понятия

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