1.使用C語言來操作SQL SERVER數據庫,采用ODBC開放式數據庫連接進行數據的添加,修改,刪除,查詢等操作。
?step1:啟動SQLSERVER服務,例如:HNHJ,開始菜單 ->運行 ->net start mssqlserver
?step2:打開企業管理器,建立數據庫test,在test庫中建立test表(a varchar(200),b varchar(200))
?step3:建立系統DSN,開始菜單 ->運行 ->odbcad32,
??添加->SQL SERVER
?名稱:csql,服務器:HNHJ
?使用用戶使用登錄ID和密碼的SQLSERVER驗證,登錄ID:sa,密碼:
??更改默認的數據庫為:test
?...
?測試數據源,測試成功,即DNS添加成功。
2.cpp文件完整代碼
//##########################save.cpp##########################
- #include?<stdio.h>??? ??
- #include?<string.h>??? ??
- #include?<windows.h>??? ??
- #include?<sql.h>??? ??
- #include?<sqlext.h>??? ??
- #include?<sqltypes.h>??? ??
- #include?<odbcss.h>??? ??
- ??
- SQLHENV?henv?=?SQL_NULL_HENV;??? ??
- SQLHDBC?hdbc1?=?SQL_NULL_HDBC;??? ??
- SQLHSTMT?hstmt1?=?SQL_NULL_HSTMT;??? ??
- ??
- /* ?
- ????cpp文件功能說明: ?
- ????1.數據庫操作中的添加,修改,刪除,主要體現在SQL語句上 ?
- ????2.采用直接執行方式和參數預編譯執行方式兩種 ?
- */ ??
- int ?main(){??? ??
- ????RETCODE?retcode;??? ??
- ???? UCHAR ???szDSN[SQL_MAX_DSN_LENGTH+1]???=??? "csql" ,??? ??
- ????????????szUID[MAXNAME]???=??? "sa" ,??? ??
- ????????????szAuthStr[MAXNAME]???=??? "" ;?? ??
- ???? //SQL語句 ??
- ???????? //直接SQL語句 ??
- ???? UCHAR ???sql[37]?=? "insert?into?test?values('aaa','100')" ; ??
- ???????? //預編譯SQL語句 ??
- ???? UCHAR ???pre_sql[29]?=? "insert?into?test?values(?,?)" ; ??
- ???? //1.連接數據源 ??
- ???????? //1.環境句柄 ??
- ????retcode???=???SQLAllocHandle???(SQL_HANDLE_ENV,???NULL,???&henv);??? ??
- ????retcode???=???SQLSetEnvAttr(henv,???SQL_ATTR_ODBC_VERSION,??? ??
- ??????????????????(SQLPOINTER)SQL_OV_ODBC3,??? ??
- ??????????????????SQL_IS_INTEGER);??? ??
- ???????? //2.連接句柄?? ??
- ????retcode???=???SQLAllocHandle(SQL_HANDLE_DBC,???henv,???&hdbc1);??? ??
- ????retcode???=???SQLConnect(hdbc1,???szDSN,???4,???szUID,???2,???szAuthStr,???0);???? ??
- ???? //判斷連接是否成功 ??
- ???? if ???(???(retcode???!=???SQL_SUCCESS)???&&???(retcode???!=???SQL_SUCCESS_WITH_INFO)???)???{????? ??
- ????????printf( "連接失敗!/n" ); ??
- ????}??? else ???{??? ??
- ???????? //2.創建并執行一條或多條SQL語句 ??
- ???????? /* ?
- ????????1.分配一個語句句柄(statement?handle) ?
- ????????2.創建SQL語句 ?
- ????????3.執行語句 ?
- ????????4.銷毀語句 ?
- ????????*/ ??
- ????????retcode???=???SQLAllocHandle(SQL_HANDLE_STMT,???hdbc1,???&hstmt1);??? ??
- ???????? //第一種方式 ??
- ???????? //直接執行 ??
- ???????? //添加操作 ??
- ???????? //SQLExecDirect?(hstmt1,sql,37); ??
- ???????? ??
- ???????? //第二種方式 ??
- ???????? //綁定參數方式 ??
- ???????? char ?a[200]= "bbb" ; ??
- ???????? char ?b[200]= "200" ; ??
- ????????SQLINTEGER???p???=???SQL_NTS; ??
- ???????? //1預編譯 ??
- ????????SQLPrepare(hstmt1,pre_sql,29);? //第三個參數與數組大小相同,而不是數據庫列相同 ??
- ???????? //2綁定參數值 ??
- ????????SQLBindParameter(hstmt1,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&a,0,&p); ??
- ????????SQLBindParameter(hstmt1,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&b,0,&p); ??
- ???????? //3?執行 ??
- ????????SQLExecute(hstmt1); ??
- ???????? ??
- ????????printf( "操作成功!" ); ??
- ???????? //釋放語句句柄 ??
- ????????SQLCloseCursor?(hstmt1); ??
- ????????SQLFreeHandle?(SQL_HANDLE_STMT,?hstmt1); ??
- ???? ??
- ????}??? ??
- ???? //3.斷開數據源 ??
- ???? /* ?
- ?????1.斷開與數據源的連接. ?
- ?????2.釋放連接句柄. ?
- ?????3.釋放環境句柄?(如果不再需要在這個環境中作更多連接) ?
- ????*/ ??
- ????SQLDisconnect(hdbc1);???? ??
- ????SQLFreeHandle(SQL_HANDLE_DBC,?hdbc1);??? ??
- ????SQLFreeHandle(SQL_HANDLE_ENV,?henv);??? ??
- ???? return (0);??? ??
- }?????
?
//##########################list.cpp##########################
- #include?<stdio.h>??? ??
- #include?<string.h>??? ??
- #include?<windows.h>??? ??
- #include?<sql.h>??? ??
- #include?<sqlext.h>??? ??
- #include?<sqltypes.h>??? ??
- #include?<odbcss.h>??? ??
- ??
- SQLHENV?henv?=?SQL_NULL_HENV;??? ??
- SQLHDBC?hdbc1?=?SQL_NULL_HDBC;??? ??
- SQLHSTMT?hstmt1?=?SQL_NULL_HSTMT;??? ??
- ??
- /* ?
- ????查詢SQLSERVER數據庫,1.條件查詢,2.直接查詢全部 ?
- */ ??
- int ?main(){??? ??
- ????RETCODE?retcode;??? ??
- ???? UCHAR ???szDSN[SQL_MAX_DSN_LENGTH+1]???=??? "csql" ,??? ??
- ????????????szUID[MAXNAME]???=??? "sa" ,??? ??
- ????????????szAuthStr[MAXNAME]???=??? "" ;?? ??
- ???? UCHAR ???sql1[39]?=? "select?b?from?test?where?a?=?'aaa'" ; ??
- ???? UCHAR ???sql2[35]?=? "select?b?from?test?where?a?=???" ; ??
- ???? UCHAR ???sql3[19]?=? "select?b?from?test" ; ??
- ???? ??
- ????retcode???=???SQLAllocHandle???(SQL_HANDLE_ENV,???NULL,???&henv);??? ??
- ????retcode???=???SQLSetEnvAttr(henv,???SQL_ATTR_ODBC_VERSION,??? ??
- ??????????????????(SQLPOINTER)SQL_OV_ODBC3,??? ??
- ??????????????????SQL_IS_INTEGER);???? ??
- ????retcode???=???SQLAllocHandle(SQL_HANDLE_DBC,???henv,???&hdbc1);??? ??
- ???? //1.連接數據源 ??
- ????retcode???=???SQLConnect(hdbc1,???szDSN,???4,???szUID,???2,???szAuthStr,???0);???? ??
- ???? if ???(???(retcode???!=???SQL_SUCCESS)???&&???(retcode???!=???SQL_SUCCESS_WITH_INFO)???)???{??? ??
- ????????printf( "連接失敗!" ); ??
- ????}??? else ???{??? ??
- ???????? //2.創建并執行一條或多條SQL語句 ??
- ???????? /* ?
- ????????1.分配一個語句句柄(statement?handle) ?
- ????????2.創建SQL語句 ?
- ????????3.執行語句 ?
- ????????4.銷毀語句 ?
- ????????*/ ??
- ????????retcode???=???SQLAllocHandle(SQL_HANDLE_STMT,???hdbc1,???&hstmt1);??? ??
- ???????? //第一種方式 ??
- ???????? /* ?
- ????????//直接執行 ?
- ????????SQLExecDirect?(hstmt1,sql1,39); ?
- ????????char?list[5]; ?
- ????????SQLBindCol(hstmt1,?1,?SQL_C_CHAR,?list,?5,?0); ?
- ????????SQLFetch(hstmt1); ?
- ????????printf("%s/n",list); ?
- ????????*/ ??
- ???????? ??
- ???????? //第二種方式 ??
- ???????? /* ?
- ????????//綁定參數方式 ?
- ????????char?a[200]="aaa"; ?
- ????????SQLINTEGER???p???=???SQL_NTS; ?
- ????????//1.預編譯 ?
- ????????SQLPrepare(hstmt1,sql2,35);?//第三個參數與數組大小相同,而不是數據庫列相同 ?
- ????????//2.綁定參數值 ?
- ????????SQLBindParameter(hstmt1,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&a,0,&p); ?
- ????????//3.執行 ?
- ????????SQLExecute(hstmt1); ?
- ????????char?list[5]; ?
- ????????SQLBindCol(hstmt1,?1,?SQL_C_CHAR,?list,?5,?0); ?
- ????????SQLFetch(hstmt1); ?
- ????????printf("%s/n",list); ?
- ????????*/ ??
- ??
- ???????? //第三種方式全部輸出 ??
- ???????? /* ?
- ????????1.確認一個結果集是否可用。 ?
- ????????2.將結果集的列綁定在適當的變量上。 ?
- ????????3.取得行 ?
- ????????*/ ??
- ???????? //3.檢查結果記錄(如果有的話) ??
- ????????SQLExecDirect?(hstmt1,sql3,19); ??
- ???????? char ?list[5]; ??
- ????????SQLBindCol(hstmt1,?1,?SQL_C_CHAR,?list,?5,?0); ??
- ???????? do { ??
- ????????????retcode?=?SQLFetch(hstmt1); ??
- ???????????? if (retcode?==?SQL_NO_DATA){ ??
- ???????????????? break ; ??
- ????????????} ??
- ????????????printf( "%s/n" ,list); ??
- ????????} while (1); ??
- ???????? ??
- ???????? //釋放語句句柄 ??
- ????????SQLCloseCursor?(hstmt1); ??
- ????????SQLFreeHandle?(SQL_HANDLE_STMT,?hstmt1); ??
- ???? ??
- ????}??? ??
- ? ??
- ???? //4.斷開數據源 ??
- ???? /* ?
- ?????1.斷開與數據源的連接. ?
- ?????2.釋放連接句柄. ?
- ?????3.釋放環境句柄?(如果不再需要在這個環境中作更多連接) ?
- ????*/ ??
- ????SQLDisconnect(hdbc1);???? ??
- ????SQLFreeHandle(SQL_HANDLE_DBC,?hdbc1);??? ??
- ????SQLFreeHandle(SQL_HANDLE_ENV,?henv);??? ??
- ???? return (0);??? ??
- }????
?
3. 總結:ODBC數據庫操作與JDBC步驟上類似,可以融匯貫通來學習
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
