bcp_setbulkmode
Mit bcp_setbulkmode können Sie das Spaltenformat in einem Massenkopiervorgang angeben, indem Sie alle Spaltenattribute mit einem einzigen Funktionsaufruf festlegen.
Syntax
RETCODE bcp_setbulkmode (
HDBC hdbc,
INT property,
void * pField,
INT cbField,
void * pRow,
INT cbRow
);
Argumente
hdbc
Das für den Massenkopiervorgang aktivierte ODBC-Verbindungshandle.property
Eine Konstante vom Typ BYTE. Eine Liste der Konstanten finden Sie in der Tabelle im Abschnitt mit Hinweisen.pField
Der Zeiger auf den Wert des Feldabschlusszeichens.cbField
Die Länge (in Bytes) des Feldabschlusszeichenwerts.pRow
Der Zeiger auf den Wert des Zeilenabschlusszeichens.cbRow
Die Länge in Bytes des Zeilenabschlusszeichenwerts.
Rückgabewerte
SUCCEED oder FAIL
Hinweise
bcp_setbulkmode kann zum Massenkopieren aus einer Abfrage oder Tabelle verwendet werden. Wenn bcp_setbulkmode zum Massenkopieren aus einer Abfrageanweisung verwendet wird, muss es aufgerufen werden, bevor bcp_control mit BCP_HINT aufgerufen wird.
bcp_setbulkmode ist eine Alternative zur Verwendung von bcp_setcolfmt und bcp_columns, mit denen Sie pro Funktionsaufruf nur das Format einer Spalte angeben können.
In der folgenden Tabelle sind die Konstanten für den property-Parameter aufgelistet.
Eigenschaft |
Beschreibung |
---|---|
BCP_OUT_CHARACTER_MODE |
Gibt den Zeichenausgabemodus an. Entspricht der –c-Option in BCP.EXE und bcp_setcolfmt mit auf SQLCHARACTER festgelegter BCP_FMT_TYPE-Eigenschaft. |
BCP_OUT_WIDE_CHARACTER_MODE |
Gibt den Unicode-Ausgabemodus an. Entspricht der –w-Option in BCP.EXE und bcp_setcolfmt mit auf SQLNCHAR festgelegter BCP_FMT_TYPE-Eigenschaft. |
BCP_OUT_NATIVE_TEXT_MODE |
Gibt systemeigene Typen für Nicht-Zeichen-Typen und Unicode für Zeichentypen an. Entspricht der –N-Option in BCP.EXE und bcp_setcolfmt mit auf SQLNCHAR festgelegter BCP_FMT_TYPE-Eigenschaft, wenn der Spaltentyp eine Zeichenfolge ist (die Eigenschaft ist auf den Standardwert festgelegt, wenn der Spaltentyp keine Zeichenfolge ist). |
BCP_OUT_NATIVE_MODE |
Gibt systemeigene Datenbanktypen an. Entspricht der –n-Option in BCP.EXE und bcp_setcolfmt mit auf den Standardwert festgelegter BCP_FMT_TYPE-Eigenschaft. |
Verwenden Sie bcp_setbulkmode nicht mit einer Sequenz von Funktionsaufrufen, die bcp_setcolfmt, bcp_control und bcp_readfmt umfasst. Sie sollten z. B. nicht bcp_control(BCPTEXTFILE) und bcp_setbulkmode aufrufen.
Sie können bcp_control und bcp_setbulkmode für bcp_control-Optionen aufrufen, die keinen Konflikt mit bcp_setbulkmode verursachen. Beispielsweise können Sie bcp_control(BCPFIRST) und bcp_setbulkmode aufrufen.
Wenn Sie versuchen, bcp_setbulkmode mit einer Sequenz von Funktionsaufrufen aufzurufen, die bcp_setcolfmt, bcp_control und bcp_readfmt umfasst, gibt einer der Funktionsaufrufe einen Sequenzfehler zurück. Wenn Sie den Fehler korrigieren möchten, rufen Sie bcp_init auf, um alle Einstellungen zurückzusetzen und den Vorgang neu zu beginnen.
In der folgenden Tabelle werden einige Beispiele für Funktionsaufrufe dargestellt, die zu einem Funktionssequenzfehler führen:
Aufrufsequenz |
---|
|
|
|
|
|
|
|
|
Beispiel
Im folgenden Beispiel werden vier Dateien mit unterschiedlichen Einstellungen von bcp_setbulkmode erstellt.
// compile with: sqlncli11.lib odbc32.lib
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <sqlext.h>
#include "sqlncli.h"
// Global variables
SQLHENV g_hEnv = NULL;
SQLHDBC g_hDbc = NULL;
void ODBCCleanUp() {
if (g_hDbc) {
SQLDisconnect(g_hDbc);
SQLFreeHandle(SQL_HANDLE_DBC, g_hDbc);
g_hDbc = NULL;
}
if (g_hEnv) {
SQLFreeHandle(SQL_HANDLE_ENV, g_hEnv);
g_hEnv = NULL;
}
}
BOOL MakeODBCConnection(TCHAR * pszServer) {
TCHAR szConnectionString[500];
TCHAR szOutConnectionString[500];
SQLSMALLINT iLen;
SQLRETURN rc;
_sntprintf_s(szConnectionString, 500, TEXT("DRIVER={SQL Server Native Client 11.0};Server=%s;Trusted_connection=yes;"), pszServer);
rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE,&g_hEnv);
if (SQL_SUCCESS != rc && SQL_SUCCESS_WITH_INFO != rc) {
printf("SQLAllocHandle(SQL_HANDLE_ENV...) failed\n");
return false;
}
rc = SQLSetEnvAttr(g_hEnv,SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_UINTEGER);
if (SQL_SUCCESS != rc && SQL_SUCCESS_WITH_INFO != rc) {
printf("SQLSetEnvAttr failed\n");
SQLFreeHandle(SQL_HANDLE_ENV, g_hEnv);
return false;
}
rc = SQLAllocHandle( SQL_HANDLE_DBC, g_hEnv , &g_hDbc);
if (SQL_SUCCESS != rc && SQL_SUCCESS_WITH_INFO != rc) {
printf("SQLAllocHandle(SQL_HANDLE_DBC...) failed\n");
SQLFreeHandle(SQL_HANDLE_ENV, g_hEnv);
return false;
}
// Enable BCP
rc = SQLSetConnectAttr(g_hDbc, SQL_COPT_SS_BCP, (SQLPOINTER)SQL_BCP_ON, SQL_IS_INTEGER);
if (SQL_SUCCESS != rc && SQL_SUCCESS_WITH_INFO != rc) {
printf("SQLSetConnectAttr(.. SQL_COPT_SS_BCP, (SQLPOINTER)SQL_BCP_ON ...) failed\n");
ODBCCleanUp();
return false;
}
// connecting ...
rc = SQLDriverConnect(g_hDbc,NULL, (SQLTCHAR*)szConnectionString, SQL_NTS, (SQLTCHAR*)szOutConnectionString, 500, &iLen, SQL_DRIVER_NOPROMPT);
if (SQL_SUCCESS != rc && SQL_SUCCESS_WITH_INFO != rc) {
printf("SQLDriverConnect(SQL_HANDLE_DBC...) failed\n");
ODBCCleanUp();
return false;
}
return true;
}
BOOL BCPSetBulkMode(TCHAR * pszServer, TCHAR * pszQureryOut, char BCPType, TCHAR * pszDataFile) {
SQLRETURN rc;
if (!MakeODBCConnection(pszServer))
return false;
rc = bcp_init(g_hDbc, NULL, pszDataFile, NULL, DB_OUT); // bcp init for queryout
if (SUCCEED != rc) {
printf("bcp_init failed\n");
ODBCCleanUp();
return false;
}
// setbulkmode
char ColTerm[] = "\t";
char RowTerm[] = "\r\n";
wchar_t wColTerm[] = L"\t";
wchar_t wRowTerm[] = L"\r\n";
BYTE * pColTerm = NULL;
int cbColTerm = NULL;
BYTE * pRowTerm = 0;
int cbRowTerm = 0;
int bulkmode = -1;
if (BCPType == 'c') { // bcp -c
pColTerm = (BYTE*)ColTerm;
pRowTerm = (BYTE*)RowTerm;
cbColTerm = 1;
cbRowTerm = 2;
bulkmode = BCP_OUT_CHARACTER_MODE;
}
else
if (BCPType == 'w') { // bcp -w
pColTerm = (BYTE*)wColTerm;
pRowTerm = (BYTE*)wRowTerm;
cbColTerm = 2;
cbRowTerm = 4;
bulkmode = BCP_OUT_WIDE_CHARACTER_MODE;
}
else
if (BCPType == 'n') // bcp -n
bulkmode = BCP_OUT_NATIVE_MODE;
else
if (BCPType == 'N') // bcp -n
bulkmode = BCP_OUT_NATIVE_TEXT_MODE;
else {
printf("unknown bcp mode\n");
ODBCCleanUp();
return false;
}
rc = bcp_setbulkmode(g_hDbc, bulkmode, pColTerm, cbColTerm, pRowTerm, cbRowTerm);
if (SUCCEED != rc) {
printf("bcp_setbulkmode failed\n");
ODBCCleanUp();
return false;
}
// set queryout TSQL statement
rc = bcp_control(g_hDbc, BCPHINTS , pszQureryOut);
if (SUCCEED != rc) {
printf("bcp_control(..BCP_OPTION_HINTS..) failed\n");
ODBCCleanUp();
return false;
}
// bcp copy
DBINT nRowsInserted = 0;
rc = bcp_exec(g_hDbc, &nRowsInserted);
if (SUCCEED != rc) {
printf("bcp_exec failed\n");
ODBCCleanUp();
return false;
}
printf("bcp done\n");
ODBCCleanUp();
return true;
}
int main() {
BCPSetBulkMode(TEXT("localhost"), TEXT("SELECT 'this is a bcp -c test', 1,2") , 'c', TEXT("bcpc.dat"));
BCPSetBulkMode(TEXT("localhost"), TEXT("SELECT 'this is a bcp -w test', 1,2") , 'w', TEXT("bcpw.dat"));
BCPSetBulkMode(TEXT("localhost"), TEXT("SELECT 'this is a bcp -c test', 1,2") , 'n', TEXT("bcpn.dat"));
BCPSetBulkMode(TEXT("localhost"), TEXT("SELECT 'this is a bcp -w test', 1,2") , 'N', TEXT("bcp_N.dat"));
}