bcp_bind
適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)
將資料從程式變數系結至資料表資料行,以便大量複製到 SQL Server。
語法
RETCODE bcp_bind (
HDBC hdbc,
LPCBYTE pData,
INT cbIndicator,
DBINT cbData,
LPCBYTE pTerm,
INT cbTerm,
INT eDataType,
INT idxServerCol);
引數
hdbc
這是啟用大量複製的 ODBC 連接控制碼。
pData
這是複製資料的指標。 如果 eDataType 是 SQLTEXT、SQLNTEXT、SQLXML、SQLUDT、SQLCHARACTER、SQLVARCHAR、SQLVARBINARY、SQLBINARY、SQLNCHAR 或 SQLIMAGE, pData 可以是 Null。 Null pData 表示會使用 bcp_moretext ,以區塊方式將長資料值傳送至 SQL Server。 如果使用者對應至使用者系結欄位的資料行是 BLOB 資料行,則使用者應該只將 pData 設定 為 Null,否則 bcp_bind 將會失敗。
如果資料中有指標,它們就會直接出現在資料之前的記憶體中。 在此案例中,pData 參數會指向指標變數,而 cbIndicator 參數的寬度 則由大量複製用來正確處理使用者資料。
cbIndicator
這是資料行資料長度或 Null 指標的長度,以位元組為單位。 有效的指標長度值為 0(不使用指標時)、1、2、4 或 8。 指標會在任何資料之前直接出現在記憶體中。 例如,下列結構類型定義可用來使用大量複製將整數值插入 SQL Server 資料表中:
typedef struct tagBCPBOUNDINT
{
int iIndicator;
int Value;
} BCPBOUNDINT;
在範例案例中 ,pData 參數會設定為結構的宣告實例位址、BCPBOUNDINT iIndicator 結構成員的位址。 cbIndicator 參數會設定為整數的大小(sizeof(int), 而 cbData 參數會再次設定為整數的大小(sizeof(int) 。 若要將資料列大量複製到包含系結資料行 Null 值的伺服器,實例 iIndicator 成員的值應該設定為 SQL_Null_DATA。
cbData
這是程式變數中的資料位元組計數,不包括任何長度或 Null 指標或結束字元的長度。
將 cbData 設定 為 SQL_Null_DATA表示複製到伺服器的所有資料列都包含資料行的 Null 值。
將 cbData 設定 為 SQL_VARLEN_DATA 表示系統會使用字串結束字元或其他方法來判斷複製的資料長度。
如果是固定長度的資料類型,例如整數,資料類型會指出資料的長度給系統。 因此,對於固定長度的資料類型, cbData 可以安全地SQL_VARLEN_DATA或資料的長度。
針對 SQL Server 字元和二進位資料類型, cbData 可以SQL_VARLEN_DATA、SQL_Null_DATA、某些正值或 0。 如果 cbData 是SQL_VARLEN_DATA,則系統會使用長度/Null 指標(如果有的話)或結束字元序列來判斷資料的長度。 如果兩者都提供,系統會使用會導致複製的資料量最少的 。 如果 cbData 是SQL_VARLEN_DATA,則資料行的資料類型是 SQL Server 字元或二進位類型,而且不會指定長度指標或結束字元序列,系統就會傳回錯誤訊息。
如果 cbData 為 0 或正值,則系統會使用 cbData 作為資料長度。 不過,如果除了正 cbData 值之外,還提供長度指標或結束字元序列,系統會使用會導致複製的資料量最少的方法來判斷資料長度。
cbData 參數值代表資料的位元組計數。 如果字元資料是以 Unicode 寬字元表示,則正 cbData 參數值代表字元數乘以每個字元的位元組大小。
pTerm
這是位元組模式的指標,如果有的話,會標記這個程式變數的結尾。 例如,ANSI 和 MBCS C 字串通常具有 1 位元組結束字元 (\0)。
如果變數沒有結束字元,請將 pTerm 設定 為 Null。
您可以使用空字串 (「」) 將 C Null 結束字元指定為程式變數結束字元。 由於 Null 終止的空字串構成單一位元組(結束字元位元組本身),請將 cbTerm 設定 為 1。 例如,若要指出 szName 中的 字串是以 Null 終止,而且應該使用結束字元來指出長度:
bcp_bind(hdbc, szName, 0,
SQL_VARLEN_DATA, "", 1,
SQLCHARACTER, 2)
這個範例的非決定性形式可能表示 15 個字元會從 szName 變數複製到系結資料表的第二個數據行:
bcp_bind(hdbc, szName, 0, 15,
NULL, 0, SQLCHARACTER, 2)
大量複製 API 會視需要執行 Unicode 到 MBCS 的字元轉換。 請確定已正確設定結束字元位元組字串和位元組字串的長度。 例如,若要指出 szName 中的 字串是 Unicode 寬字元字串,由 Unicode Null 結束字元值終止:
bcp_bind(hdbc, szName, 0,
SQL_VARLEN_DATA, L"",
sizeof(WCHAR), SQLNCHAR, 2)
如果系結的 SQL Server 資料行是寬字元,則不會在bcp_sendrow 上 執行任何轉換。 如果 SQL Server 資料行是 MBCS 字元類型,則會執行寬字元到多位元組字元轉換,因為資料會傳送至 SQL Server。
cbTerm
這是程式變數結束字元中存在的位元組計數,如果有的話。 如果變數沒有結束字元,請將 cbTerm 設定 為 0。
eDataType 是程式變數的 C 資料類型。 程式變數中的資料會轉換成資料庫資料行的類型。 如果此參數為 0,則不會執行任何轉換。
eDataType 參數是由 sqlncli.h 中的 SQL Server 資料類型標記所列舉,而不是 ODBC C 資料類型列舉值。 例如,您可以使用 SQL Server 特定類型 SQLINT2 來指定雙位元組整數 ODBC 類型SQL_C_SHORT。
SQL Server 2005 (9.x) 引進了 eDataType 參數中 SQLXML 和 SQLUDT 資料類型權杖的支援。
下表列出有效的列舉資料類型和對應的 ODBC C 資料類型。
eDataType | C 類型 |
---|---|
SQLTEXT | char * |
SQLNTEXT | wchar_t * |
SQLCHARACTER | char * |
SQLBIGCHAR | char * |
SQLVARCHAR | char * |
SQLBIGVARCHAR | char * |
SQLNCHAR | wchar_t * |
SQLNVARCHAR | wchar_t * |
SQLBINARY | unsigned char * |
SQLBIGBINARY | unsigned char * |
SQLVARBINARY | unsigned char * |
SQLBIGVARBINARY | unsigned char * |
SQLBIT | char |
SQLBITN | char |
SQLINT1 | char |
SQLINT2 | short int |
SQLINT4 | int |
SQLINT8 | _int64 |
SQLINTN | cbIndicator 1:SQLINT1 2:SQLINT2 4:SQLINT4 8:SQLINT8 |
SQLFLT4 | float |
SQLFLT8 | float |
SQLFLTN | cbIndicator 4:SQLFLT4 8:SQLFLT8 |
SQLDECIMALN | SQL_NUMERIC_STRUCT |
SQLNUMERICN | SQL_NUMERIC_STRUCT |
SQLMONEY | DBMONEY |
SQLMONEY4 | DBMONEY4 |
SQLMONEYN | cbIndicator 4:SQLMONEY4 8:SQLMONEY |
SQLTIMEN | SQL_SS_TIME2_STRUCT |
SQLDATEN | SQL_DATE_STRUCT |
SQLDATETIM4 | DBDATETIM4 |
SQLDATETIME | DBDATETIME |
SQLDATETIMN | cbIndicator 4:SQLDATETIM4 8:SQLDATETIME |
SQLDATETIME2N | SQL_TIMESTAMP_STRUCT |
SQLDATETIMEOFFSETN | SQL_SS_TIMESTAMPOFFSET_STRUCT |
SQLIMAGE | unsigned char * |
SQLUDT | unsigned char * |
SQLUNIQUEID | SQLGUID |
SQLVARIANT | 除了下列任何資料類型: - 文字 - ntext - 影像 - Varchar(max) - Varbinary(max) - Nvarchar(max) -Xml -時間 戳 |
SQLXML | 支援的 C 資料類型: -字元* - wchar_t * - 不帶正負號的字元 * |
idxServerCol 是資料複製到資料庫資料表中資料行的序數位置。 資料表中的第一個資料行是資料行 1。 SQLColumns 會 報告資料行的序數位置。
傳回
SUCCEED 或 FAIL。
備註
使用 bcp_bind ,以快速且有效率的方式將資料從程式變數複製到 SQL Server 中的資料表。
呼叫此函式或任何其他大量複製函式之前,請先呼叫 bcp_init 。 呼叫 bcp_init 設定大量複製的 SQL Server 目標資料表。 呼叫 bcp_init 以搭配 bcp_bind 和 bcp_sendrow 使用時, bcp_init szDataFile 參數會設定為 Null; bcp_init eDirection 參數會設定為 DB_IN。
針對您要複製之 SQL Server 資料表中的每個資料行,進行個別 bcp_bind 呼叫。 在進行必要的 bcp_bind 呼叫之後,請呼叫 bcp_sendrow ,將程式變數的資料列傳送至 SQL Server。 不支援重新系結資料行。
每當您想要 SQL Server 認可已收到的資料列時,請呼叫 bcp_batch 。 例如, 針對每個插入的 1000 個數據列或任何其他間隔呼叫bcp_batch 一次。
當沒有其他資料列要插入時,請呼叫 bcp_done 。 無法執行這項操作時,會發生錯誤。
使用 bcp_control 指定的 控制參數設定,對bcp_bind 資料列傳輸沒有任何影響 。
如果 資料行的 pData 設定為 Null,因為其值會透過呼叫 bcp_moretext 提供,則任何將 eDataType 設為 SQLTEXT、SQLNTEXT、SQLXML、SQLUDT、SQLCHARACTER、SQLVARCHAR、SQLVARBINARY、SQLBINARY、SQLNCHAR 或 SQLIMAGE 的後續資料行也必須系結 為 Null,而且其值也必須由呼叫 bcp_moretext 提供。
針對新的大型實數值型別,例如 Varchar(max) 、 Varbinary(max) 或 Nvarchar(max) ,您可以使用 SQLCHARACTER、SQLVARCHAR、SQLVARBINARY、SQLBINARY 和 SQLNCHAR 作為 eDataType 參數中的 類型指標。
如果 cbTerm 不是 0,任何值 (1、2、4 或 8) 都適用于前置詞 ( cbIndicator )。 在此情況下,SQL Server Native Client 會搜尋結束字元、計算結束字元的資料長度 ( i ),並將 cbData 設定 為較小的 i 值和前置詞的值。
如果 cbTerm 為 0 且 cbIndicator (前置詞) 不是 0, cbIndicator 必須是 8。 8 位元組前置詞可以採用下列值:
0xFFFFFFFFFFFFFFFF表示欄位的 Null 值
0xFFFFFFFFFFFFFFFE會被視為特殊的前置詞值,用來有效率地將資料分區塊轉送至伺服器。 具有此特殊前置詞的資料格式為:
<>< SPECIAL_PREFIX 0 個以上的資料區塊 >< ZERO_CHUNK > 其中:
SPECIAL_PREFIX為0xFFFFFFFFFFFFFFFE
DATA_CHUNK是包含區塊長度的 4 位元組前置詞,後面接著在 4 位元組前置詞中指定其長度的實際資料。
ZERO_CHUNK是一個 4 位元組值,其中包含表示資料結束的所有零(00000000000)。
任何其他有效的 8 位元組長度都會被視為一般資料長度。
使用 bcp_bind時呼叫 bcp_columns 會導致錯誤。
bcp_bind增強日期和時間功能的支援
如需與日期/時間類型 eDataType 參數搭配 使用的類型相關資訊,請參閱 增強型日期和時間類型的大量複製變更(OLE DB 和 ODBC)。
如需詳細資訊,請參閱 日期和時間改善 (ODBC) 。
範例
#include sql.h
#include sqlext.h
#include odbcss.h
// Variables like henv not specified.
HDBC hdbc;
char szCompanyName[MAXNAME];
DBINT idCompany;
DBINT nRowsProcessed;
DBBOOL bMoreData;
char* pTerm = "\t\t";
// Application initiation, get an ODBC environment handle, allocate the
// hdbc, and so on.
...
// Enable bulk copy prior to connecting on allocated hdbc.
SQLSetConnectAttr(hdbc, SQL_COPT_SS_BCP, (SQLPOINTER) SQL_BCP_ON,
SQL_IS_INTEGER);
// Connect to the data source; return on error.
if (!SQL_SUCCEEDED(SQLConnect(hdbc, _T("myDSN"), SQL_NTS,
_T("myUser"), SQL_NTS, _T("myPwd"), SQL_NTS)))
{
// Raise error and return.
return;
}
// Initialize bcp.
if (bcp_init(hdbc, "comdb..accounts_info", NULL, NULL
DB_IN) == FAIL)
{
// Raise error and return.
return;
}
// Bind program variables to table columns.
if (bcp_bind(hdbc, (LPCBYTE) &idCompany, 0, sizeof(DBINT), NULL, 0,
SQLINT4, 1) == FAIL)
{
// Raise error and return.
return;
}
if (bcp_bind(hdbc, (LPCBYTE) szCompanyName, 0, SQL_VARLEN_DATA,
(LPCBYTE) pTerm, strnlen(pTerm, sizeof(pTerm)), SQLCHARACTER, 2) == FAIL)
{
// Raise error and return.
return;
}
while (TRUE)
{
// Retrieve and process program data.
if ((bMoreData = getdata(&idCompany, szCompanyName)) == TRUE)
{
// Send the data.
if (bcp_sendrow(hdbc) == FAIL)
{
// Raise error and return.
return;
}
}
else
{
// Break out of loop.
break;
}
}
// Terminate the bulk copy operation.
if ((nRowsProcessed = bcp_done(hdbc)) == -1)
{
printf_s("Bulk-copy unsuccessful.\n");
return;
}
printf_s("%ld rows copied.\n", nRowsProcessed);
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應