如何解决如何使用SQLBulkOperation在数据库中插入数据
我想知道如何使用C ++在ODBC中使用SQLBulkOperations()来插入可以选择的数据,并使用该数据插入数据库中的另一个表中。我试图解决它,但无法做到。搜索时说您可以使用SQLBulkOperations()使用SQL_Add属性插入。但这是行不通的。没有任何单个示例可以解释相同的情况。请任何人可以帮助。下面是代码。问题:
-
我想从table1中选择并将其插入table2。是否可以使用SQLBulkOperations(),如果是,那么此程序还有第二部分。如果没有,那是什么呢?
-
我有一些手册数据,例如我稍后将在本节中插入的数据。是否可以使用SQLBulkOperations()插入。
// Some standard headers #include "pch.h" #include <stdio.h> #include <stdlib.h> // Only needed for Windows clients #include <windows.h> // Standard ODBC headers #include <sql.h> #include <sqltypes.h> #include <sqlext.h> #include <cstdio> #include <iostream> #define ROWSET_SIZE 5 using namespace std; int main() { /* declare and initialize local variables */ SQLLEN rowCount; SQLRETURN rc; SQLHENV hdlEnv; rc = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&hdlEnv); rc = SQLSetEnvAttr(hdlEnv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_UINTEGER); SQLHDBC hdlDbc; rc = SQLAllocHandle(SQL_HANDLE_DBC,hdlEnv,&hdlDbc); rc = SQLConnect(hdlDbc,(SQLCHAR*)"LocalDB",SQL_NTS,(SQLCHAR*)"sa",(SQLCHAR*)"abc@123",SQL_NTS); SQLHSTMT hstmt; SQLAllocHandle(SQL_HANDLE_STMT,hdlDbc,&hstmt); struct rowTag { SQLINTEGER CustID; SQLCHAR CustName[21]; SQLCHAR Phone_Number[21]; SQLINTEGER CustID_L; SQLINTEGER CustName_L; SQLINTEGER Phone_Number_L; }row[5]; SQLUSMALLINT rowStatus[5]; SQLINTEGER BindOffset = 0; /* Set up dynamic cursor type */ //rc = SQLSetStmtAttr(hstmt,SQL_ATTR_CURSOR_TYPE,(SQLPOINTER)SQL_CURSOR_DYNAMIC,0); ///* Set pointer to row status array */ //rc = SQLSetStmtAttr(hstmt,SQL_ATTR_ROW_STATUS_PTR,(SQLPOINTER)rowStatus,0); //rc = SQLSetStmtAttr(hstmt,SQL_BIND_TYPE,(void*)(sizeof(row) / 5),0); SQLSetStmtAttr(hstmt,(SQLPOINTER)SQL_CURSOR_KEYSET_DRIVEN,0); SQLSetStmtAttr(hstmt,SQL_ATTR_ROW_BIND_TYPE,(SQLPOINTER)sizeof(row),0); //SQLSetStmtAttr(hstmt,SQL_ATTR_ROW_ARRAY_SIZE,(SQLPOINTER)5,SQL_ATTR_USE_BOOKMARKS,(SQLPOINTER)SQL_UB_VARIABLE,SQL_ATTR_ROW_BIND_OFFSET_PTR,(SQLPOINTER)&BindOffset,0); SQLCHAR sqlstmt[] = "select CustId,CustName,Phone_Number from customers"; /* Execute query */ rc = SQLExecDirect(hstmt,sqlstmt,SQL_NTS); /* Call SQLBindCol() for each result set column */ rc = SQLBindCol(hstmt,1,SQL_C_LONG,(SQLPOINTER)&row[0].CustID,(SQLINTEGER)sizeof(row[0].CustID),// / ROWSET_SIZE,&row[0].CustID_L); rc = SQLBindCol(hstmt,2,SQL_C_CHAR,(SQLPOINTER)&row[0].CustName,(SQLINTEGER)sizeof(row[0].CustName),&row[0].CustName_L); rc = SQLBindCol(hstmt,3,(SQLPOINTER)&row[0].Phone_Number,(SQLINTEGER)sizeof(row[0].Phone_Number),&row[0].Phone_Number_L); /* For each column,place the new data values in */ /* the rgbValue array,and set each length value */ /* in the pcbValue array to be the length of the */ /* corresponding value in the rgbValue array. */ //Fetching Results and Displaying the result //while (SQL_SUCCEEDED(rc = SQLFetchScroll(hstmt,SQL_FETCH_NEXT,1))) { // // Print the bound variables,which now contain the values from the // // fetched row. // SQLUINTEGER i = 0; // cout << row[i].CustID << " | " << row[i].CustName << " | " << row[i].Phone_Number << endl; // i++; //} strncpy((char*)row[0].CustName,"Gilligan",sizeof(row[0].CustName)); strncpy((char*)row[1].CustName,"Skipper",sizeof(row[1].CustName)); strncpy((char*)row[2].CustName,"Mr. Howe",sizeof(row[2].CustName)); strncpy((char*)row[3].CustName,"Mrs. Howe",sizeof(row[3].CustName)); strncpy((char*)row[4].CustName,"Ginger",sizeof(row[4].CustName)); for (int loop = 0; loop < 5; loop++) { //Five entries for CustID row[loop].CustID = 200 + loop; //Five entries for Phone_Number strcpy((char*)row[loop].Phone_Number,"1-800-900-" + loop); //Specifying length of the CustID column row[loop].CustID_L = sizeof(row[0].CustID); //Specifying length of CustName row[loop].CustName_L = SQL_NTS; //Specifying length of Phone_Number row[loop].Phone_Number_L = SQL_NTS; } /* Set number of rows to insert */ //rc = SQLSetStmtAttr(hstmt,0); // /* Perform the bulk insert */ rc = SQLBulkOperations(hstmt,SQL_ADD); rc = SQLEndTran(SQL_HANDLE_DBC,SQL_COMMIT); cout << "SQLBulkOperations End\n" << endl; SQLRowCount(hstmt,&rowCount); printf("Rows Effected %i\n",(int)rowCount); /* int i; for (i = 0; i < 5; i++) printf("status array %d\n",rowStatus[i]);*/ }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。