C語言與sqlserver數(shù)據(jù)庫 原文:C語言與sqlserver數(shù)據(jù)庫
1.使用C語言來操作SQL SERVER數(shù)據(jù)庫,采用ODBC開放式數(shù)據(jù)庫連接進(jìn)行數(shù)據(jù)的添加,修改,刪除,查詢等操作。
?step1:啟動(dòng)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##########################
C代碼
#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;??? ??????????int?main(){??? ??????RETCODE?retcode;??? ??????UCHAR???szDSN[SQL_MAX_DSN_LENGTH+1]???=???"csql",??? ??????????????szUID[MAXNAME]???=???"sa",??? ??????????????szAuthStr[MAXNAME]???=???"";?? ??????????????????????UCHAR???sql[37]?=?"insert?into?test?values('aaa','100')"; ????????????????UCHAR???pre_sql[29]?=?"insert?into?test?values(?,?)"; ??????????????????????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);??? ??????retcode???=???SQLConnect(hdbc1,???szDSN,???4,???szUID,???2,???szAuthStr,???0);???? ????????????if???(???(retcode???!=???SQL_SUCCESS)???&&???(retcode???!=???SQL_SUCCESS_WITH_INFO)???)???{????? ??????????printf("連接失敗!/n"); ??????}???else???{??? ???????????????????????????????????retcode???=???SQLAllocHandle(SQL_HANDLE_STMT,???hdbc1,???&hstmt1);??? ?????????????????????????????????????????????????? ??????????????????????????????char?a[200]="bbb"; ??????????char?b[200]="200"; ??????????SQLINTEGER???p???=???SQL_NTS; ????????????????????SQLPrepare(hstmt1,pre_sql,29);?????????????????????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); ????????????????????SQLExecute(hstmt1); ?????????? ??????????printf("操作成功!"); ????????????????????SQLCloseCursor?(hstmt1); ??????????SQLFreeHandle?(SQL_HANDLE_STMT,?hstmt1); ?????? ??????}??? ??????????????????????SQLDisconnect(hdbc1);???? ??????SQLFreeHandle(SQL_HANDLE_DBC,?hdbc1);??? ??????SQLFreeHandle(SQL_HANDLE_ENV,?henv);??? ??????return(0);??? ??}????? #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##########################
C代碼
#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;??? ????????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);??? ????????????retcode???=???SQLConnect(hdbc1,???szDSN,???4,???szUID,???2,???szAuthStr,???0);???? ??????if???(???(retcode???!=???SQL_SUCCESS)???&&???(retcode???!=???SQL_SUCCESS_WITH_INFO)???)???{??? ??????????printf("連接失敗!"); ??????}???else???{??? ???????????????????????????????????retcode???=???SQLAllocHandle(SQL_HANDLE_STMT,???hdbc1,???&hstmt1);??? ????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????????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); ?????? ??????}??? ??? ??????????????????????SQLDisconnect(hdbc1);???? ??????SQLFreeHandle(SQL_HANDLE_DBC,?hdbc1);??? ??????SQLFreeHandle(SQL_HANDLE_ENV,?henv);??? ??????return(0);??? ??}???? #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.檢查結(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í)
本文來自于http://simpledev.javaeye.com/blog/339537
posted on
2014-12-09 13:18 NET未來之路 閱讀(
...) 評論() 編輯 收藏
轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/4153030.html
總結(jié)
以上是生活随笔為你收集整理的C语言与sqlserver数据库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。