C语言连接SQL数据库.docx
《C语言连接SQL数据库.docx》由会员分享,可在线阅读,更多相关《C语言连接SQL数据库.docx(16页珍藏版)》请在冰点文库上搜索。
C语言连接SQL数据库
连接到SAMPLE数据库,查询LASTNAME为JOHNSON的FIRSTNAME信息。
*include
*include
*include
*include "util.h"
*include
E*EC SQL INCLUDE SQLCA; 〔1〕
main()
{
E*EC SQL BEGIN DECLARE SECTION; 〔2〕
char firstname[13];
char userid[9];
char passwd[19];
E*EC SQL END DECLARE SECTION;
E*EC SQL CONNECT TO sample; 〔3〕
E*EC SQL SELECT FIRSTNME INTO :
firstname 〔4〕
FROM employee
WHERE LASTNAME = 'JOHNSON';〔4〕
printf( "First name = %s\n", firstname );
E*EC SQL CONNECT RESET; 〔5〕
return 0;
}
上面是一个简单的静态嵌入SQL语句的应用程序。
它包括了嵌入SQL的主要局部:
〔1〕中的include SQLCA语句定义并描述了SQLCA的构造。
SQLCA用于应用程序和数据库之间的通讯,其中的SQLCODE返回SQL语句执行后的结果状态。
〔2〕在BEGIN DECLARE SECTION和END DECLARE SECTION之间定义了宿主变量。
宿主变量可被SQL语句引用,也可以被C语言语句引用。
它用于将程序中的数据通过SQL语句传给数据库管理器,或从数据库管理器接收查询的结果。
在SQL语句中,主变量前均有“:
〞标志以示区别。
〔3〕在每次访问数据库之前必须做CONNECT操作,以连接到*一个数据库上。
这时,应该保证数据库实例已经启动。
〔4〕是一条选择语句。
它将表employee中的LASTNAME为“JOHNSON〞的行数据的FIRSTNAME查出,并将它放在firstname变量中。
该语句返回一个结果。
可以通过游标返回多个结果。
当然,也可以包含update、insert和delete语句。
〔5〕最后断开数据库的连接。
从上例看出,每条嵌入式SQL语句都用E*EC SQL开场,说明它是一条SQL语句。
这也是告诉预编译器在E*EC SQL和“;〞之间是嵌入SQL语句。
如果一条嵌入式SQL语句占用多行,在C程序中可以用续行符“\〞。
C语言与SQLSERVER数据库
1.使用C语言来操作SQLSERVER数据库,采用ODBC开放式数据库连接进展数据的添加,修改,删除,查询等操作。
step1:
启动SQLSERVER效劳,例如:
HNHJ,开场菜单->运行->netstartmssqlserver
step2:
翻开企业管理器,建立数据库test,在test库中建立test表(avarchar(200),bvarchar(200))
step3:
建立系统DSN,开场菜单->运行->odbcad32,
添加->SQLSERVER
名称:
csql,效劳器:
HNHJ
使用用户使用登录ID和密码的SQLSERVER验证,登录ID:
sa,密码:
更改默认的数据库为:
test
...
测试数据源,测试成功,即DNS添加成功。
2.cpp文件完整代码
//**************************save.cpp**************************
C代码
1.*include
2.*include
3.*include
4.*include
5.*include
6.*include
7.*include
8.SQLHENV henv = SQL_NULL_HENV;
9.SQLHDBC hdbc1 = SQL_NULL_HDBC;
10.SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
11./*
12. cpp文件功能说明:
13. 1.数据库操作中的添加,修改,删除,主要表达在SQL语句上
14. 2.采用直接执行方式和参数预编译执行方式两种
15.*/
16.int main(){
17. RETCODE retcode;
18.UCHAR szDSN[SQL_MA*_DSN_LENGTH+1] = "csql",
19. szUID[MA*NAME] = "sa",
20. szAuthStr[MA*NAME] = ";
21.//SQL语句
22.//直接SQL语句
23.UCHAR sql[37] = "insert into test values('aaa','100')";
24.//预编译SQL语句
25.UCHAR pre_sql[29] = "insert into test values(",")";
26.//1.连接数据源
27.//1.环境句柄
28. retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
29. retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
30. (SQLPOINTER)SQL_OV_ODBC3,
31. SQL_IS_INTEGER);
32.//2.连接句柄
33. retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
34. retcode = SQLConnect(hdbc1, szDSN, 4, szUID, 2, szAuthStr, 0);
35.//判断连接是否成功
36.if ( (retcode !
= SQL_SUCCESS) && (retcode !
= SQL_SUCCESS_WITH_INFO) ) {
37. printf("连接失败!
\n");
38. } else {
39.//2.创立并执行一条或多条SQL语句
40./*
41. 1.分配一个语句句柄(statement handle)
42. 2.创立SQL语句
43. 3.执行语句
44. 4.销毁语句
45. */
46. retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
47.//第一种方式
48.//直接执行
49.//添加操作
50.//SQLE*ecDirect (hstmt1,sql,37);
51.//第二种方式
52.//绑定参数方式
53.char a[200]="bbb";
54.char b[200]="200";
55. SQLINTEGER p = SQL_NTS;
56.//1预编译
57. SQLPrepare(hstmt1,pre_sql,29); //第三个参数与数组大小一样,而不是数据库列一样
58.//2绑定参数值
59. SQLBindParameter(hstmt1,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&a,0,&p);
60. SQLBindParameter(hstmt1,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&b,0,&p);
61.//3 执行
62. SQLE*ecute(hstmt1);
63. printf("操作成功!
");
64.//释放语句句柄
65. SQLCloseCursor (hstmt1);
66. SQLFreeHandle (SQL_HANDLE_STMT, hstmt1);
67. }
68.//3.断开数据源
69./*
70. 1.断开与数据源的连接.
71. 2.释放连接句柄.
72. 3.释放环境句柄 (如果不再需要在这个环境中作更多连接)
73. */
74. SQLDisconnect(hdbc1);
75. SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
76. SQLFreeHandle(SQL_HANDLE_ENV, henv);
77.return(0);
78.}
*include
*include
*include
*include
*include
*include
*include
SQLHENVhenv=SQL_NULL_HENV;
SQLHDBChdbc1=SQL_NULL_HDBC;
SQLHSTMThstmt1=SQL_NULL_HSTMT;
/*
cpp文件功能说明:
1.数据库操作中的添加,修改,删除,主要表达在SQL语句上
2.采用直接执行方式和参数预编译执行方式两种
*/
intmain(){
RETCODEretcode;
UCHARszDSN[SQL_MA*_DSN_LENGTH+1]="csql",
szUID[MA*NAME]="sa",
szAuthStr[MA*NAME]=";
//SQL语句
//直接SQL语句
UCHARsql[37]="insertintotestvalues('aaa','100')";
//预编译SQL语句
UCHARpre_sql[29]="insertintotestvalues(",")";
//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.分配一个语句句柄(statementhandle)
2.创立SQL语句
3.执行语句
4.销毁语句
*/
retcode=SQLAllocHandle(SQL_HANDLE_STMT,hdbc1,&hstmt1);
//第一种方式
//直接执行
//添加操作
//SQLE*ecDirect(hstmt1,sql,37);
//第二种方式
//绑定参数方式
chara[200]="bbb";
charb[200]="200";
SQLINTEGERp=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执行
SQLE*ecute(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**************************
C代码
1.*include
2.*include
3.*include
4.*include
5.*include
6.*include
7.*include
8.SQLHENV henv = SQL_NULL_HENV;
9.SQLHDBC hdbc1 = SQL_NULL_HDBC;
10.SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
11./*
12. 查询SQLSERVER数据库,1.条件查询,2.直接查询全部
13.*/
14.int main(){
15. RETCODE retcode;
16.UCHAR szDSN[SQL_MA*_DSN_LENGTH+1] = "csql",
17. szUID[MA*NAME] = "sa",
18. szAuthStr[MA*NAME] = ";
19.UCHAR sql1[39] = "select b from test where a = 'aaa'";
20.UCHAR sql2[35] = "select b from test where a = " ";
21.UCHAR sql3[19] = "select b from test";
22. retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
23. retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
24. (SQLPOINTER)SQL_OV_ODBC3,
25. SQL_IS_INTEGER);
26. retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
27.//1.连接数据源
28. retcode = SQLConnect(hdbc1, szDSN, 4, szUID, 2, szAuthStr, 0);
29.if ( (retcode !
= SQL_SUCCESS) && (retcode !
= SQL_SUCCESS_WITH_INFO) ) {
30. printf("连接失败!
");
31. } else {
32.//2.创立并执行一条或多条SQL语句
33./*
34. 1.分配一个语句句柄(statement handle)
35. 2.创立SQL语句
36. 3.执行语句
37. 4.销毁语句
38. */
39. retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
40.//第一种方式
41./*
42. //直接执行
43. SQLE*ecDirect (hstmt1,sql1,39);
44. char list[5];
45. SQLBindCol(hstmt1, 1, SQL_C_CHAR, list, 5, 0);
46. SQLFetch(hstmt1);
47. printf("%s\n",list);
48. */
49.//第二种方式
50./*
51. //绑定参数方式
52. char a[200]="aaa";
53. SQLINTEGER p = SQL_NTS;
54. //1.预编译
55. SQLPrepare(hstmt1,sql2,35); //第三个参数与数组大小一样,而不是数据库列一样
56. //2.绑定参数值
57. SQLBindParameter(hstmt1,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&a,0,&p);
58. //3.执行
59. SQLE*ecute(hstmt1);
60. char list[5];
61. SQLBindCol(hstmt1, 1, SQL_C_CHAR, list, 5, 0);
62. SQLFetch(hstmt1);
63. printf("%s\n",list);
64. */
65.//第三种方式全部输出
66./*
67. 1.确认一个结果集是否可用。
68. 2.将结果集的列绑定在适当的变量上。
69. 3.取得行
70. */
71.//3.检查结果记录(如果有的话)
72. SQLE*ecDirect (hstmt1,sql3,19);
73.char list[5];
74. SQLBindCol(hstmt1, 1, SQL_C_CHAR, list, 5, 0);
75.do{
76. retcode = SQLFetch(hstmt1);
77.if(retcode == SQL_NO_DATA){
78.break;
79. }
80. printf("%s\n",list);
81. }while
(1);
82.//释放语句句柄
83. SQLCloseCursor (hstmt1);
84. SQLFreeHandle (SQL_HANDLE_STMT, hstmt1);
85. }
86.//4.断开数据源
87./*
88. 1.断开与数据源的连接.
89. 2.释放连接句柄.
90. 3.释放环境句柄 (如果不再需要在这个环境中作更多连接)
91. */
92. SQLDisconnect(hdbc1);
93. SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
94. SQLFreeHandle(SQL_HANDLE_ENV, henv);
95.return(0);
96.}
创立数据源的过程代码:
*include
*inlcude
*include
*include
*include
*include
*defineSNO_LEN30
*defineNAME_LEN50
*defineDEPART_LEN100
*defineSSE*_LEN5