Freigeben über


Massenkopieren aus Programmvariablen

Sie können Massenkopiervorgänge direkt aus Programmvariablen durchführen. Nachdem Sie Variablen für die Zeilendaten zugeordnet und zum Starten des Massenkopiervorgangs bcp_init aufgerufen haben, rufen Sie für jede Spalte bcp_bind auf, um Speicherort und Format der jeweils mit der Spalte zu verknüpfenden Programmvariable anzugeben. Füllen Sie jede Variable mit Daten, und rufen Sie dann bcp_sendrow auf, um eine Datenzeile an den Server zu senden. Wiederholen Sie diesen Vorgang (Variablen füllen und bcp_sendrow aufrufen), bis alle Zeilen an den Server gesendet wurden. Rufen Sie anschließend bcp_done auf, um anzugeben, dass der Vorgang abgeschlossen ist.

Der bcp_bindpData-Parameter enthält die Adresse der Variablen, die an die Spalte gebunden wird. Die Daten für die einzelnen Spalten können auf zweierlei Weise gespeichert werden:

  • Zuordnen einer Variable für die Daten.

  • Zuordnen einer Indikatorvariable, unmittelbar gefolgt von der Datenvariable.

Die Indikatorvariable gibt die Datenlänge für Spalten mit variabler Länge an und zeigt gegebenenfalls an, dass NULL-Werte für die Spalte zulässig sind. Wird nur eine Datenvariable verwendet, wird die Adresse dieser Variablen im bcp_bindpData-Parameter gespeichert. Wird nur eine Indikatorvariable verwendet, wird die Adresse dieser Indikatorvariablen im bcp_bindpData-Parameter gespeichert. Die Massenkopierfunktionen berechnen den Speicherort der Datenvariablen durch Hinzufügen der Parameter bcp_bindcbIndicator und pData.

bcp_bind unterstützt drei Methoden zur Verarbeitung von Daten variabler Länge:

  • Verwenden von cbData mit nur einer Datenvariable. Platzieren Sie die Länge der Daten in cbData. Rufen Sie bei jeder Änderung der Länge der Daten, die massenkopiert werden sollen, bcp_collen auf, um cbData zurückzusetzen. Wenn eine der anderen zwei Methoden verwendet wird, geben Sie SQL_VARLEN_DATA für cbData an. Wenn alle Datenwerte, die für eine Spalte angegeben werden, NULL sind, geben Sie SQL_NULL_DATA für cbData an.

  • Verwenden von Indikatorvariablen. Speichern Sie beim Verschieben des jeweiligen neuen Datenwerts in die Datenvariable die Länge des Werts in der Indikatorvariable. Wenn eine der anderen zwei Methoden verwendet wird, geben Sie 0 für cbIndicator an.

  • Verwenden von Abschlusszeichenzeigern. Laden Sie im bcp_bindpTerm-Parameter die Adresse des Bitmusters, das die Daten beendet. Wenn eine der anderen zwei Methoden verwendet wird, geben Sie NULL für pTerm an.

Alle drei genannten Methoden können für denselben bcp_bind-Aufruf verwendet werden. In diesem Fall wird diejenige Spezifikation verwendet, mit der die kleinste Datenmenge kopiert wird.

Der bcp_bind-Typparameter verwendet DB-Library-Datentypbezeichner und keine ODBC-Datentypbezeichner. DB-Library-Datentypbezeichner werden in sqlncli.h für die Verwendung mit der ODBC-Funktion bcp_bind definiert.

Funktionen zum Massenkopieren unterstützen nicht alle ODBC C-Datentypen. Beispielsweise unterstützen die Massenkopierfunktionen nicht die ODBC SQL_C_TYPE_TIMESTAMP-Struktur. Verwenden Sie daher SQLBindCol oder SQLGetData, um ODBC SQL_TYPE_TIMESTAMP-Daten in eine SQL_C_CHAR-Variable zu konvertieren. Wenn Sie anschließend mithilfe von bcp_bind und einem Typparameter von SQLCHARACTER die Variable an eine SQL Serverdatetime-Spalte binden, konvertieren die Massenkopierfunktionen die Timestampescapeklausel der Zeichenvariablen in das geeignete Datetime-Format.

In der folgenden Tabelle werden die Datentypen aufgeführt, die für Zuordnungen eines ODBC SQL-Datentyps zu einem SQL Server-Datentyps empfohlen werden.

ODBC SQL-Datentyp

ODBC C-Datentyp

bcp_bind-Typparameter

SQL Server-Datentyp

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 (mit Vorzeichen)

SQL_C_SSHORT

SQLINT2

smallint

SQL_TINYINT (ohne Vorzeichen)

SQL_C_UTINYINT

SQLINT1

tinyint

SQL_SMALL_INT (mit Vorzeichen)

SQL_C_SSHORT

SQLINT2

smallint

SQL_SMALL_INT (ohne Vorzeichen)

SQL_C_SLONG

SQLINT4

int

integer

SQL_INTEGER (mit Vorzeichen)

SQL_C_SLONG

SQLINT4

int

integer

SQL_INTEGER (ohne Vorzeichen)

SQL_C_CHAR

SQLCHARACTER

decimal

dec

SQL_BIGINT (mit und ohne Vorzeichen)

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 hat keine Datentypen tinyint mit Vorzeichen, smallint ohne Vorzeichen oder int ohne Vorzeichen. Um den Verlust von Datenwerten beim Migrieren dieser Datentypen zu verhindern, erstellen Sie die SQL Server-Tabelle mit dem nächstgrößeren ganzzahligen Datentyp. Um zu verhindern, dass Benutzer später Werte außerhalb des für den ursprünglichen Datentyp zulässigen Bereichs hinzufügen, wenden Sie eine Regel auf die SQL Server-Spalte an, mit der die zulässigen Werte entsprechend eingeschränkt werden:

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 unterstützt Intervalldatentypen nicht direkt. Eine Anwendung kann Intervallescapesequenzen jedoch als Zeichenfolgen in einer SQL Server-Zeichenspalte speichern. Die Anwendung kann sie zur späteren Verwendung lesen, sie können aber nicht in Transact-SQL-Anweisungen verwendet werden.

Mithilfe der Massenkopierfunktionen können aus einer ODBC-Datenquelle gelesene Daten schnell in SQL Server geladen werden. Verwenden Sie SQLBindCol, um die Spalten eines Resultsets an Programmvariablen zu binden, und binden Sie anschließend dieselben Programmvariablen mit bcp_bind an einen Massenkopiervorgang. Durch Aufrufen von SQLFetchScroll oder SQLFetch wird anschließend eine Datenzeile aus der ODBC-Datenquelle in die Programmvariablen abgerufen, und durch Aufrufen von 'bcp_sendrow' werden Daten aus den Programmvariablen nach SQL Server massenkopiert.

Eine Anwendung kann die bcp_colptr-Funktion immer dann verwenden, wenn sie die Adresse der ursprünglich im bcp_bind pData-Parameter angegebenen Datenvariable ändern muss. Eine Anwendung kann die bcp_collen-Funktion immer dann verwenden, wenn sie die ursprünglich im bcp_bind cbData-Parameter angegebene Datenlänge ändern muss.

Sie können mit Massenkopiervorgängen keine Daten aus SQL Server in Programmvariablen einlesen. Eine "bcp_readrow"-Funktion oder Ähnliches gibt es nicht. Sie können nur Daten aus der Anwendung an den Server senden.