c語言版ODBC創建數據源實例

將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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章