將KingbaseES數據庫中Student表得數據備份到SQL SERVER數據庫中。在應用程序運行前,已經在KingbaseES和SQL SERVER中分別
建立了STUDENT關係表:
建表代碼:
CREATE TABLE Student
(
Sno CHAR(9) PRIMARY KEY, //Sno是主鍵
Sname CHAR(20) UNIQUE,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
)
創建數據源的過程代碼:
#include<stdlib.h>
#inlcude<stdio.h>
#include<windows.h>
#include<sql.h>
#include<sqlext.h>
#include<Sqltypes.h>
#define SNO_LEN 30
#define NAME_LEN 50
#define DEPART_LEN 100
#define SSEX_LEN 5
int main()
{
/*Step 1 定義句柄和變量 */
//以king開頭的表示的是連接KingbaseES的變量
//以server開頭的表示的是連接SQLSERVER的變量
SQLHENV kinghenv,serverhenv;
SQLHDBC kinghdbc,serverhdbc;
SQLHSTMT kinghstmt,serverhstmt;
SQLRETURN ret;
SQLCHAR sName[NAME_LEN],sDepart[DEPART_LEN],
sSex[SSEX_LEN],sSno[SNO_LEN];
SQLINTEGER sAge;
SQLINTEGRR cbAge=0,cbSno=SQL_NTS,cbSex=SQL_NTS,
cbName=SQL_NTS,cbDepart=SQL_NTS;
/*Step 2 初始化環境*/
ret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&kinghenv);
ret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&setverhenv);
ret=SQLSetEnvAttr(kinghenv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
ret=SQLSetEnvAttr(serverhenv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
/*Step 3 建立連接*/
ret=SQLAllocHandle(SQL_HANDLE_DBC,kinghenv,&kinghdbc);
ret=SQLAllocHandle(SQL_HANDLE_DBC,serverhenv,&serverhdbc);
ret=SQLConnect(kinghdbc,"KingbaseES ODBC",SQL_NTS,"SYSTEM",
SQL_NTS,"MANAGER",SQL_NTS);
if(!SQL_SUCCEEDED(ret))
return -1; //連接失敗時返回錯誤值;
ret=SQLConnect(serverhdbc,"SQLServer",SQL_NTS,"sa",
SQL_NTS,"sa",SQL_NTS);
if(!SQL_SUCCEEDED(ret))
return -1; //連接失敗時返回錯誤值;
/*Step 4 初始化語句句柄*/
ret=SQLAllocHandle(SQL_HANDLE_STMT,kinghdbc,&kinghstmt);
ret=SQLSetStmtAttr(kinghstmt,SQL_ATTR_ROW_BIND_TYPE(SQLPOINTER) SQL_BIND_BY_COLUMN,SQL_IS_INTEGER);
ret=SQLAllocHandle(SQL_HANDLE_STMT,serverhdbc,&serverhstmt);
/*Step 5 兩種方式執行語句*/
/*預編譯帶有參數的語句*/
ret=SQLPrepare(sercerhstmt,"INSERT INTO STUDENT(SNO,SNAME,SSEX,SAGE,SDEPT)
VALUES(?,?,?,?,?)",SQL_NTS);
if(ret==SQL_SUCCESS||ret==SQL_SUCCESS_WITH_INFO)
{
ret=SQLBindParameter(serverhstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,
SQL_CHAR,SNO_LEN,0,sSno,0,&cbSNO);
ret=SQLBindParameter(serverhstmt,2,SQL_PARAM_INPUT,SQL_C_CHAR,
SQL_CHAR,SNAME_LEN,0,sName,0,&cbName);
ret=SQLBindParameter(serverhstmt,3,SQL_PARAM_INPUT,SQL_C_CHAR,
SQL_CHAR,2,0,sSex,0,&cbSex);
ret=SQLBindParameter(serverhstmt,4,SQL_PARAM_INPUT,SQL_C_LONG,
SQL_INTEGER,0,0,&sAge,0,&cbAge);
ret=SQLBindParameter(serverhstmt,5,SQL_PARAM_INPUT,SQL_C_CHAR,
SQL_CHAR,DEPART_LEN,0,sDepart,0,&cbDepart);
}
/*執行SQL語句*/
ret=SQLExecDirect(kinghstmt,"SELECT * FROM STUDENT",SQL_NTS);
if(ret==SQL_SUCCESS||ret==SQL_SUCCESS_WITH_INFO)
{
ret=SQLBindCol(kinghstmt,1,SQL_C_CHAR,sSno,SNO_LEN,&cbSno);
ret=SQLBindCol(kinghstmt,2,SQL_C_CHAR,sName,NAME_LEN,&cbName);
ret=SQLBindCol(kinghstmt,3,SQL_C_CHAR,sSex,SSEX_LEN,&cbSex);
ret=SQLBindCol(kinghstmt,4,SQL_C_LONG,&sAge,0,&cbAge);
ret=SQLBindCol(kinghstmt,5,SQL_C_CHAR,sDepart,DEPART_LEN,&cbDepart);
}
/*Step 6 處理結果集並執行預編譯後的語句*/
while((ret=SQLFetch(kinghstmt))!=SQL_NO_DATA_FOUND)
{
if(ret==SQL_ERROR) printf("Fetch error/n");
else ret=SQLExecute(serverhstmt);
}
/*Step 7 中止處理*/
SQLFreeHandle(SQL_HANDLE_STMT,kinghstmt);
SQLDisconnect(kinghdbc);
SQLFreeHandle(SQL_HANDLE_DBC,kinghdbc);
SQLFreeHandle(SQL_HANDLE_ENV,kinghenv);
SQLFreeHandle(SQL_HANDLE_STMT,serverhstmt);
SQLDisconnect(serverhdbc);
SQLFreeHanlde(SQL_HANDLE_DBC<serverhdbc);
SQLFreeHanlde(SQL_HANDLE_ENV,serverhenv);
return 0;
}