bcp_init
Инициализирует операцию массового копирования.
Синтаксис
RETCODE bcp_init (
HDBC hdbc,
LPCTSTR szTable,
LPCTSTR szDataFile,
LPCTSTR szErrorFile,
INT eDirection);
Arguments
hdbc
Дескриптор соединения ODBC с поддержкой массового копирования.szTable
Имя таблицы базы данных, в которую (или из которой) выполняется копирование. Это имя также может включать имя базы данных или владельца. Например, pubs.gracie.titles, pubs..titles, gracie.titles и titles являются допустимыми именами таблиц.Если параметр eDirection имеет значение DB_OUT, то параметр szTable может быть именем представления базы данных.
Если параметр eDirection имеет значение DB_OUT, а инструкция SELECT указывается с помощью функции bcp_control перед вызовом функции bcp_exec, параметр szTable функции bcp_init необходимо установить в значение NULL.
szDataFile
Имя пользовательского файла, в который или из которого выполняется копирование. Если копирование данных происходит напрямую из переменных с помощью функции bcp_sendrow, установите параметр szDataFile в значение NULL.szErrorFile
Имя файла ошибок, заполняемого сообщениями о ходе работы, сообщениями об ошибках и копиями строк, которые по каким-либо причинам не могут быть скопированы из пользовательского файла в таблицу. Если в качестве параметра szErrorFile передается значение NULL, файл ошибок не используется.eDirection
Направление копирования (DB_IN или DB_OUT). Значение DB_IN указывает на копирование из переменных программы или пользовательского файла в таблицу. Значение DB_OUT указывает на копирование из таблицы базы данных в пользовательский файл. Если используется значение DB_OUT, необходимо указать имя пользовательского файла.
Возвращаемое значение
SUCCEED или FAIL.
Замечания
Перед вызовом любой другой функции массового копирования вызовите функцию bcp_init. Функция bcp_init выполняет необходимую инициализацию массового копирования данных между рабочей станцией и SQL Server.
Функция bcp_init должна указываться с включенным дескриптором соединения ODBC для использования с функциями массового копирования. Чтобы включить дескриптор, используйте функцию SQLSetConnectAttr с параметром SQL_COPT_SS_BCP, установленным в значение SQL_BCP_ON, для выделенного (но не подключенного) дескриптора соединения. Попытка назначения атрибута для подключенного дескриптора приведет к ошибке.
После указания файла данных функция bcp_init проверяет структуру исходной или целевой таблицы базы данных, а не файла данных. Функция bcp_init определяет формат данных для файла данных на основе каждого столбца таблицы или представления базы данных либо результирующего набора инструкции SELECT. Эта спецификация включает тип данных каждого столбца, присутствие или отсутствие длины и допустимости значений NULL и строки байтов признака конца, а также ширину для типов данных с фиксированной длиной. Функция bcp_init устанавливает эти значения следующим образом.
Указанный тип данных представляет собой тип данных столбца в таблице базы данных, представлении или результирующем наборе SELECT. Тип данных ограничивается собственными типами данных SQL Server, указанными в файле sqlncli.h. Сами данные представляются в машинной форме. То есть данные из столбца типа данных integer представлены четырехбайтовой последовательностью с обратным или прямым порядком следования байт, в зависимости от компьютера, на котором был создан данный файл данных.
Если тип данных базы данных имеет фиксированную длину, то для данных файла данных также задается фиксированная длина. Функции массового копирования, обрабатывающие данные (например, bcp_exec), анализируют строки данных, ожидая, что длина данных в файле данных будет идентична длине данных, указанной в списке столбцов таблицы или представления базы данных либо инструкции SELECT. Например, данные для столбца базы данных, определенного как char(13), должны содержать 13 символов для каждой строки данных в файле. Данные фиксированной длины могут быть обозначены префиксом с признаком значения NULL, если столбец базы данных допускает значения NULL.
После определения последовательности байт, служащей признаком конца, ее длина устанавливается в значение 0.
При копировании в SQL Server файл данных должен содержать данные для каждого столбца таблицы базы данных. При копировании на SQL Server данные из всех столбцов в таблице, представлении или результирующем наборе инструкции SELECT базы данных копируются в файл данных.
При копировании в SQL Server порядковый номер столбца в файле данных должен совпадать с порядковым номером столбца таблицы базы данных. При копировании из SQL Server функция bcp_exec размещает данные на основе порядкового номера столбца в таблице базы данных.
Если тип данных базы данных имеет переменную длину (например, varbinary(22)) или столбец базы данных может содержать значения NULL, к данным в файле данных добавляется префикс в виде признака длины и допустимости значений NULL. Ширина признака изменяется в зависимости от типа данных и версии массового копирования.
Чтобы изменить значения формата данных, указанных для файла данных, вызовите функции bcp_columns и bcp_colfmt.
Массовое копирование в SQL Server может быть оптимизировано для таблиц, не содержащих индексов, путем установки модели восстановления базы данных в значение SIMPLE или BULK_LOGGED. Дополнительные сведения см. в разделах Предварительные условия для минимального ведения журнала массового импорта данных и ALTER DATABASE.
Если файл данных не используется, то для указания формата и расположения в памяти данных для каждого столбца необходимо вызвать функцию bcp_bind, а затем скопировать строки данных в SQL Server с помощью функции bcp_sendrow.
Пример
В этом образце демонстрируется использование функции ODBC bcp_init с файлом форматирования.
Перед компиляцией и выполнением кода на С++ необходимо выполнить следующие действия.
Создайте источник данных ODBC с именем Test. Его можно сопоставить с любой базой данных.
Выполните в базе данных следующую инструкцию Transact-SQL:
CREATE TABLE BCPDate (cola int, colb datetime);
В каталог, где будет запускаться приложение, добавьте файл Bcpfmt.fmt и добавьте в этот файл следующик код:
8.0 2 1SQLCHAR04"\t"1colaSQL_Latin1_General_Cp437_Bin 2SQLCHAR08"\r\n"2colbSQL_Latin1_General_Cp437_Bin
В каталог, где будет запускаться приложение, добавьте файл Bcpodbc.bcp и добавьте в этот файл следующик код:
1 2
Теперь все готово к компиляции и выполнению кода на C++.
// compile with: odbc32.lib sqlncli11.lib
#include <stdio.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <odbcss.h>
SQLHENV henv = SQL_NULL_HENV;
HDBC hdbc1 = SQL_NULL_HDBC;
void Cleanup() {
if (hdbc1 != SQL_NULL_HDBC) {
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
}
if (henv != SQL_NULL_HENV)
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
int main() {
RETCODE retcode;
SDWORD cRows;
// Allocate the ODBC environment and save handle.
retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
printf("SQLAllocHandle(Env) Failed\n\n");
Cleanup();
return(9);
}
// Notify ODBC that this is an ODBC 3.0 app.
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);
if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
printf("SQLSetEnvAttr(ODBC version) Failed\n\n");
Cleanup();
return(9);
}
// Allocate ODBC connection handle, set BCP mode, and connect.
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
printf("SQLAllocHandle(hdbc1) Failed\n\n");
Cleanup();
return(9);
}
retcode = SQLSetConnectAttr(hdbc1, SQL_COPT_SS_BCP, (void *)SQL_BCP_ON, SQL_IS_INTEGER);
if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
printf("SQLSetConnectAttr(hdbc1) Failed\n\n");
Cleanup();
return(9);
}
// Sample uses Integrated Security. Create SQL Server DSN using Windows NT authentication.
retcode = SQLConnect(hdbc1, (UCHAR*)"Test", SQL_NTS, (UCHAR*)"", SQL_NTS, (UCHAR*)"", SQL_NTS);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLConnect() Failed\n\n");
Cleanup();
return(9);
}
// Initialize the bulk copy.
retcode = bcp_init(hdbc1, "BCPDate", "BCPODBC.bcp", NULL, DB_IN);
if ( (retcode != SUCCEED) ) {
printf("bcp_init(hdbc1) Failed\n\n");
Cleanup();
return(9);
}
// Read the format file.
retcode = bcp_readfmt(hdbc1, "BCPFMT.fmt");
if ( (retcode != SUCCEED) ) {
printf("bcp_readfmt(hdbc1) Failed\n\n");
Cleanup();
return(9);
}
// Execute the bulk copy.
retcode = bcp_exec(hdbc1, &cRows);
if ( (retcode != SUCCEED) ) {
printf("bcp_exec(hdbc1) Failed\n\n");
Cleanup();
return(9);
}
printf("Number of rows bulk copied in = %d.\n", cRows);
// Cleanup
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}