1.使用C語言來操作SQL SERVER數(shù)據(jù)庫,采用ODBC開放式數(shù)據(jù)庫連接進(jìn)行數(shù)據(jù)的添加,修改,刪除,查詢等操作。
?step1:啟動SQLSERVER服務(wù),例如:HNHJ,開始菜單 ->運(yùn)行 ->net start mssqlserver
?step2:打開企業(yè)管理器,建立數(shù)據(jù)庫test,在test庫中建立test表(a varchar(200),b varchar(200))
?step3:建立系統(tǒng)DSN,開始菜單 ->運(yùn)行 ->odbcad32,
??添加->SQL SERVER
?名稱:csql,服務(wù)器:HNHJ
?使用用戶使用登錄ID和密碼的SQLSERVER驗(yàn)證,登錄ID:sa,密碼:
??更改默認(rèn)的數(shù)據(jù)庫為:test
?...
?測試數(shù)據(jù)源,測試成功,即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.數(shù)據(jù)庫操作中的添加,修改,刪除,主要體現(xiàn)在SQL語句上 ?
- ????2.采用直接執(zhí)行方式和參數(shù)預(yù)編譯執(zhí)行方式兩種 ?
- */ ??
- 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')" ; ??
- ???????? //預(yù)編譯SQL語句 ??
- ???? UCHAR ???pre_sql[29]?=? "insert?into?test?values(?,?)" ; ??
- ???? //1.連接數(shù)據(jù)源 ??
- ???????? //1.環(huán)境句柄 ??
- ????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.創(chuàng)建并執(zhí)行一條或多條SQL語句 ??
- ???????? /* ?
- ????????1.分配一個(gè)語句句柄(statement?handle) ?
- ????????2.創(chuàng)建SQL語句 ?
- ????????3.執(zhí)行語句 ?
- ????????4.銷毀語句 ?
- ????????*/ ??
- ????????retcode???=???SQLAllocHandle(SQL_HANDLE_STMT,???hdbc1,???&hstmt1);??? ??
- ???????? //第一種方式 ??
- ???????? //直接執(zhí)行 ??
- ???????? //添加操作 ??
- ???????? //SQLExecDirect?(hstmt1,sql,37); ??
- ???????? ??
- ???????? //第二種方式 ??
- ???????? //綁定參數(shù)方式 ??
- ???????? char ?a[200]= "bbb" ; ??
- ???????? char ?b[200]= "200" ; ??
- ????????SQLINTEGER???p???=???SQL_NTS; ??
- ???????? //1預(yù)編譯 ??
- ????????SQLPrepare(hstmt1,pre_sql,29);? //第三個(gè)參數(shù)與數(shù)組大小相同,而不是數(shù)據(jù)庫列相同 ??
- ???????? //2綁定參數(shù)值 ??
- ????????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?執(zhí)行 ??
- ????????SQLExecute(hstmt1); ??
- ???????? ??
- ????????printf( "操作成功!" ); ??
- ???????? //釋放語句句柄 ??
- ????????SQLCloseCursor?(hstmt1); ??
- ????????SQLFreeHandle?(SQL_HANDLE_STMT,?hstmt1); ??
- ???? ??
- ????}??? ??
- ???? //3.斷開數(shù)據(jù)源 ??
- ???? /* ?
- ?????1.斷開與數(shù)據(jù)源的連接. ?
- ?????2.釋放連接句柄. ?
- ?????3.釋放環(huán)境句柄?(如果不再需要在這個(gè)環(huán)境中作更多連接) ?
- ????*/ ??
- ????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數(shù)據(jù)庫,1.條件查詢,2.直接查詢?nèi)? ?
- */ ??
- 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.連接數(shù)據(jù)源 ??
- ????retcode???=???SQLConnect(hdbc1,???szDSN,???4,???szUID,???2,???szAuthStr,???0);???? ??
- ???? if ???(???(retcode???!=???SQL_SUCCESS)???&&???(retcode???!=???SQL_SUCCESS_WITH_INFO)???)???{??? ??
- ????????printf( "連接失敗!" ); ??
- ????}??? else ???{??? ??
- ???????? //2.創(chuàng)建并執(zhí)行一條或多條SQL語句 ??
- ???????? /* ?
- ????????1.分配一個(gè)語句句柄(statement?handle) ?
- ????????2.創(chuàng)建SQL語句 ?
- ????????3.執(zhí)行語句 ?
- ????????4.銷毀語句 ?
- ????????*/ ??
- ????????retcode???=???SQLAllocHandle(SQL_HANDLE_STMT,???hdbc1,???&hstmt1);??? ??
- ???????? //第一種方式 ??
- ???????? /* ?
- ????????//直接執(zhí)行 ?
- ????????SQLExecDirect?(hstmt1,sql1,39); ?
- ????????char?list[5]; ?
- ????????SQLBindCol(hstmt1,?1,?SQL_C_CHAR,?list,?5,?0); ?
- ????????SQLFetch(hstmt1); ?
- ????????printf("%s/n",list); ?
- ????????*/ ??
- ???????? ??
- ???????? //第二種方式 ??
- ???????? /* ?
- ????????//綁定參數(shù)方式 ?
- ????????char?a[200]="aaa"; ?
- ????????SQLINTEGER???p???=???SQL_NTS; ?
- ????????//1.預(yù)編譯 ?
- ????????SQLPrepare(hstmt1,sql2,35);?//第三個(gè)參數(shù)與數(shù)組大小相同,而不是數(shù)據(jù)庫列相同 ?
- ????????//2.綁定參數(shù)值 ?
- ????????SQLBindParameter(hstmt1,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&a,0,&p); ?
- ????????//3.執(zhí)行 ?
- ????????SQLExecute(hstmt1); ?
- ????????char?list[5]; ?
- ????????SQLBindCol(hstmt1,?1,?SQL_C_CHAR,?list,?5,?0); ?
- ????????SQLFetch(hstmt1); ?
- ????????printf("%s/n",list); ?
- ????????*/ ??
- ??
- ???????? //第三種方式全部輸出 ??
- ???????? /* ?
- ????????1.確認(rèn)一個(gè)結(jié)果集是否可用。 ?
- ????????2.將結(jié)果集的列綁定在適當(dāng)?shù)淖兞可稀? ?
- ????????3.取得行 ?
- ????????*/ ??
- ???????? //3.檢查結(jié)果記錄(如果有的話) ??
- ????????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.斷開數(shù)據(jù)源 ??
- ???? /* ?
- ?????1.斷開與數(shù)據(jù)源的連接. ?
- ?????2.釋放連接句柄. ?
- ?????3.釋放環(huán)境句柄?(如果不再需要在這個(gè)環(huán)境中作更多連接) ?
- ????*/ ??
- ????SQLDisconnect(hdbc1);???? ??
- ????SQLFreeHandle(SQL_HANDLE_DBC,?hdbc1);??? ??
- ????SQLFreeHandle(SQL_HANDLE_ENV,?henv);??? ??
- ???? return (0);??? ??
- }????
?
3. 總結(jié):ODBC數(shù)據(jù)庫操作與JDBC步驟上類似,可以融匯貫通來學(xué)習(xí)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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