Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
mit bcp_setbulkmode können Sie das Spaltenformat in einem Massenkopievorgang angeben und dabei alle Spaltenattribute in einem einzelnen Funktionsaufruf festlegen.
Syntax
RETCODE bcp_setbulkmode (
HDBC
hdbc
,
INT
property
,
void *
pField
,
INT
cbField
,
void *
pRow
,
INT
cbRow
);
Argumente
hdbc
Das Massenkopien-aktiviertes ODBC-Verbindungshandle.
Eigentum
Eine Konstante vom Typ BYTE. Eine Liste der Konstanten finden Sie in der Tabelle im Abschnitt "Hinweise".
pField
Der Zeiger auf den Feldterminatorwert.
cbField
Die Länge (in Byte) des Feldterminatorwerts.
Bug
Der Zeiger auf den Zeilenterminatorwert.
cbRow
Die Länge in Byte des Zeilenendpunktwerts.
Rückkehr
ERFOLGREICH oder FEHLGESCHLAGEN
Bemerkungen
bcp_setbulkmode können zum Massenkopien aus einer Abfrage oder einer Tabelle verwendet werden. Wenn bcp_setbulkmode zum Massenkopien einer Abfrageanweisung verwendet wird, muss sie aufgerufen werden, bevor bcp_control mit BCP_HINT aufgerufen wird.
bcp_setbulkmode ist eine Alternative zur Verwendung von bcp_setcolfmt und bcp_columns, mit der Sie nur das Format einer Spalte pro Funktionsaufruf angeben können.
In der folgenden Tabelle sind die Konstanten für den Eigenschaftsparameter aufgeführt.
| Eigentum | BESCHREIBUNG |
|---|---|
| BCP_OUT_CHARACTER_MODE | Gibt den Zeichenausgabemodus an. Entspricht der option -c in BCP.EXE und dem bcp_setcolfmt, auf BCP_FMT_TYPE den SQLCHARACTERdie Eigenschaft festgelegt ist. |
| BCP_OUT_WIDE_CHARACTER_MODE | Gibt den Unicode-Ausgabemodus an. Entspricht der Option -w in BCP.EXE und bcp_setcolfmt, auf die BCP_FMT_TYPESQLNCHARdie Eigenschaft festgelegt ist. |
| BCP_OUT_NATIVE_TEXT_MODE | Gibt systemeigene Typen für Nicht-Zeichentypen und Unicode für Zeichentypen an. Entspricht der Option -N in BCP.EXE und bcp_setcolfmt, deren BCP_FMT_TYPE Eigenschaft festgelegt SQLNCHAR ist, wenn der Spaltentyp eine Zeichenfolge ist (Standard, wenn keine Zeichenfolge). |
| BCP_OUT_NATIVE_MODE | Gibt systemeigene Datenbanktypen an. Entspricht der Option -n in BCP.EXE und bcp_setcolfmt, wobei BCP_FMT_TYPE die Eigenschaft auf den Standardwert festgelegt ist. |
Sie sollten bcp_setbulkmode nicht mit einer Abfolge von Funktionsaufrufen verwenden, die bcp_setcolfmt, bcp_control und bcp_readfmt enthalten. Sie sollten z. B. bcp_control(BCPTEXTFILE) und bcp_setbulkmode nicht aufrufen.
Sie können bcp_control und bcp_setbulkmode für bcp_control Optionen aufrufen, die nicht mit bcp_setbulkmode in Konflikt geraten. Sie können z. B. bcp_control(BCPFIRST) und bcp_setbulkmode aufrufen.
Wenn Sie versuchen, bcp_setbulkmode mit einer Abfolge von Funktionsaufrufen aufzurufen, die bcp_setcolfmt, bcp_control und bcp_readfmt enthält, 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 von vorne zu beginnen.
Die folgende Tabelle enthält einige Beispiele für Funktionsaufrufe, die zu einem Funktionssequenzfehler führen:
Anrufsequenz
bcp_init("table", DB_IN);
bcp_setbulkmode();
bcp_init("table", DB_OUT);
bcp_setbulkmode();
bcp_readfmt();
bcp_init(NULL, DB_OUT);
bcp_control(BCPHINTS, "select ...");
bcp_setbulkmode();
bcp_init("table", DB_OUT);
bcp_setbulkmode();
bcp_setcolfmt();
bcp_init("table", DB_OUT);
bcp_control(BCPDELAYREADFMT, true);
bcp_readfmt();
bcp_setcolfmt();
bcp_init(NULL, DB_OUT);
bcp_control(BCPDELAYREADFMT, true);
bcp_setbulkmode();
bcp_control(BCPHINTS, "select ...");
bcp_readfmt();
bcp_init("table", DB_OUT);
bcp_control(BCPDELAYREADFMT, true);
bcp_columns();
bcp_init("table", DB_OUT);
bcp_control(BCPDELAYREADFMT, true);
bcp_setcolfmt();
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"));
}