C语言连接SQL数据库.docx
《C语言连接SQL数据库.docx》由会员分享,可在线阅读,更多相关《C语言连接SQL数据库.docx(16页珍藏版)》请在冰点文库上搜索。
C语言连接SQL数据库
连接到SAMPLE数据库,查询LASTNAME为JOHNSON的FIRSTNAME信息。
#include
#include
#include
#include "util.h"
#include
EXEC SQL INCLUDE SQLCA;
(1)
main()
{
EXEC SQL BEGIN DECLARE SECTION;
(2)
char firstname[13];
char userid[9];
char passwd[19];
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT TO sample; (3)
EXEC SQL SELECT FIRSTNME INTO :
firstname (4)
FROM employee
WHERE LASTNAME = 'JOHNSON';(4)
printf( "First name = %s\n", firstname );
EXEC 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语句都用EXEC SQL开始,表明它是一条SQL语句。
这也是告诉预编译器在EXEC 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.
9.SQLHENV henv = SQL_NULL_HENV;
10.SQLHDBC hdbc1 = SQL_NULL_HDBC;
11.SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
12.
13./*
14. cpp文件功能说明:
15. 1.数据库操作中的添加,修改,删除,主要体现在SQL语句上
16. 2.采用直接执行方式和参数预编译执行方式两种
17.*/
18.int main(){
19. RETCODE retcode;
20. UCHAR szDSN[SQL_MAX_DSN_LENGTH+1] = "csql",
21. szUID[MAXNAME] = "sa",
22. szAuthStr[MAXNAME] = "";
23. //SQL语句
24. //直接SQL语句
25. UCHAR sql[37] = "insert into test values('aaa','100')";
26. //预编译SQL语句
27. UCHAR pre_sql[29] = "insert into test values(?
?
)";
28. //1.连接数据源
29. //1.环境句柄
30. retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
31. retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
32. (SQLPOINTER)SQL_OV_ODBC3,
33. SQL_IS_INTEGER);
34. //2.连接句柄
35. retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
36. retcode = SQLConnect(hdbc1, szDSN, 4, szUID, 2, szAuthStr, 0);
37. //判断连接是否成功
38. if ( (retcode !
= SQL_SUCCESS) && (retcode !
= SQL_SUCCESS_WITH_INFO) ) {
39. printf("连接失败!
\n");
40. } else {
41. //2.创建并执行一条或多条SQL语句
42. /*
43. 1.分配一个语句句柄(statement handle)
44. 2.创建SQL语句
45. 3.执行语句
46. 4.销毁语句
47. */
48. retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
49. //第一种方式
50. //直接执行
51. //添加操作
52. //SQLExecDirect (hstmt1,sql,37);
53.
54. //第二种方式
55. //绑定参数方式
56. char a[200]="bbb";
57. char b[200]="200";
58. SQLINTEGER p = SQL_NTS;
59. //1预编译
60. SQLPrepare(hstmt1,pre_sql,29); //第三个参数与数组大小相同,而不是数据库列相同
61. //2绑定参数值
62. SQLBindParameter(hstmt1,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&a,0,&p);
63. SQLBindParameter(hstmt1,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&b,0,&p);
64. //3 执行
65. SQLExecute(hstmt1);
66.
67. printf("操作成功!
");
68. //释放语句句柄
69. SQLCloseCursor (hstmt1);
70. SQLFreeHandle (SQL_HANDLE_STMT, hstmt1);
71.
72. }
73. //3.断开数据源
74. /*
75. 1.断开与数据源的连接.
76. 2.释放连接句柄.
77. 3.释放环境句柄 (如果不再需要在这个环境中作更多连接)
78. */
79. SQLDisconnect(hdbc1);
80. SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
81. SQLFreeHandle(SQL_HANDLE_ENV, henv);
82. return(0);
83.}
#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_MAX_DSN_LENGTH+1]="csql",
szUID[MAXNAME]="sa",
szAuthStr[MAXNAME]="";
//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);
//第一种方式
//直接执行
//添加操作
//SQLExecDirect(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执行
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##########################
C代码
1.#include
2.#include
3.#include
4.#include
5.#include
6.#include
7.#include
8.
9.SQLHENV henv = SQL_NULL_HENV;
10.SQLHDBC hdbc1 = SQL_NULL_HDBC;
11.SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
12.
13./*
14. 查询SQLSERVER数据库,1.条件查询,2.直接查询全部
15.*/
16.int main(){
17. RETCODE retcode;
18. UCHAR szDSN[SQL_MAX_DSN_LENGTH+1] = "csql",
19. szUID[MAXNAME] = "sa",
20. szAuthStr[MAXNAME] = "";
21. UCHAR sql1[39] = "select b from test where a = 'aaa'";
22. UCHAR sql2[35] = "select b from test where a = ?
";
23. UCHAR sql3[19] = "select b from test";
24.
25. retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
26. retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
27. (SQLPOINTER)SQL_OV_ODBC3,
28. SQL_IS_INTEGER);
29. retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
30. //1.连接数据源
31. retcode = SQLConnect(hdbc1, szDSN, 4, szUID, 2, szAuthStr, 0);
32. if ( (retcode !
= SQL_SUCCESS) && (retcode !
= SQL_SUCCESS_WITH_INFO) ) {
33. printf("连接失败!
");
34. } else {
35. //2.创建并执行一条或多条SQL语句
36. /*
37. 1.分配一个语句句柄(statement handle)
38. 2.创建SQL语句
39. 3.执行语句
40. 4.销毁语句
41. */
42. retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
43. //第一种方式
44. /*
45. //直接执行
46. SQLExecDirect (hstmt1,sql1,39);
47. char list[5];
48. SQLBindCol(hstmt1, 1, SQL_C_CHAR, list, 5, 0);
49. SQLFetch(hstmt1);
50. printf("%s\n",list);
51. */
52.
53. //第二种方式
54. /*
55. //绑定参数方式
56. char a[200]="aaa";
57. SQLINTEGER p = SQL_NTS;
58. //1.预编译
59. SQLPrepare(hstmt1,sql2,35); //第三个参数与数组大小相同,而不是数据库列相同
60. //2.绑定参数值
61. SQLBindParameter(hstmt1,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&a,0,&p);
62. //3.执行
63. SQLExecute(hstmt1);
64. char list[5];
65. SQLBindCol(hstmt1, 1, SQL_C_CHAR, list, 5, 0);
66. SQLFetch(hstmt1);
67. printf("%s\n",list);
68. */
69.
70. //第三种方式全部输出
71. /*
72. 1.确认一个结果集是否可用。
73. 2.将结果集的列绑定在适当的变量上。
74. 3.取得行
75. */
76. //3.检查结果记录(如果有的话)
77. SQLExecDirect (hstmt1,sql3,19);
78. char list[5];
79. SQLBindCol(hstmt1, 1, SQL_C_CHAR, list, 5, 0);
80. do{
81. retcode = SQLFetch(hstmt1);
82. if(retcode == SQL_NO_DATA){
83. break;
84. }
85. printf("%s\n",list);
86. }while
(1);
87.
88. //释放语句句柄
8