资源描述
连接到SAMPLE数据库,查询LASTNAME为JOHNSON得FIRSTNAME信息。
#include <stdio、h>
#include <stdlib、h>
#include <string、h> ﻫ #include "util、h"
#include <sqlca、h> ﻫ 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语言与SQL SERVER数据库
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##########################
C代码
1. #include <stdio、h>
2. #include <string、h>
3. #include <windows、h>
4. #include <sql、h>
5. #include <sqlext、h>
6. #include <sqltypes、h>
7. #include <odbcss、h>
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 <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##########################
C代码
1. #include <stdio、h>
2. #include <string、h>
3. #include <windows、h>
4. #include <sql、h>
5. #include <sqlext、h>
6. #include <sqltypes、h>
7. #include <odbcss、h>
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. //释放语句句柄
89. SQLCloseCursor (hstmt1);
90. SQLFreeHandle (SQL_HANDLE_STMT, hstmt1);
91.
92. }
93.
94. //4、断开数据源
95. /*
96. 1、断开与数据源得连接、
97. 2、释放连接句柄、
98. 3、释放环境句柄 (如果不再需要在这个环境中作更多连接)
99. */
100. SQLDisconnect(hdbc1);
101. SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
102. SQLFreeHandle(SQL_HANDLE_ENV, henv);
103. return(0);
104. }
创建数据源得过程代码:
#include<stdlib、h>
#inlcude<stdio、h>ﻫ#include<windows、h>ﻫ#include<sql、h>ﻫ#include<sqlext、h>ﻫ#include<Sqltypes、h>
#define SNO_LEN 30ﻫ#define NAME_LEN 50
#define DEPART_LEN 100ﻫ#define SSEX_LEN 5
int main()ﻫ{ﻫ /*Step 1 定义句柄与变量 */
//以king开头得表示得就是连接KingbaseES得变量ﻫ //以server开头得表示得就是连接SQLSERVER得变量ﻫSQLHENV kinghenv,serverhenv;
SQLHDBC kinghdbc,serverhdbc;
SQLHSTMT kinghstmt,serverhstmt;ﻫSQLRETURN ret;ﻫSQLCHAR sName[NAME_LEN],sDepart[DEPART_LEN],ﻫ sSex[SSEX_LEN],sSno[SNO_LEN];
SQLINTEGER sAge;ﻫSQLINTEGRR cbAge=0,cbSno=SQL_NTS,cbSex=SQL_NTS,ﻫ cbName=SQL_NTS,cbDepart=SQL_NTS;ﻫ /*Step 2 初始化环境*/
ret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&kinghenv);ﻫret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&setverhenv);ﻫret=SQLSetEnvAttr(kinghenv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);ﻫret=SQLSetEnvAttr(serverhenv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
/*Step 3 建立连接*/ﻫret=SQLAllocHandle(SQL_HANDLE_DBC,kinghenv,&kinghdbc);
ret=SQLAllocHandle(SQL_HANDLE_DBC,serverhenv,&serverhdbc);ﻫret=SQLConnect(kinghdbc,"KingbaseES ODBC",SQL_NTS,"SYSTEM",ﻫ SQL_NTS,"MANAGER",SQL_NTS);ﻫif(!SQL_SUCCEEDED(ret))
return -1; //连接失败时返回错误值;
ret=SQLConnect(serverhdbc,"SQLServer",SQL_NTS,"sa",ﻫ SQL_NTS,"sa",SQL_NTS);ﻫif(!SQL_SUCCEEDED(ret))
return -1; //连接失败时返回错误值;ﻫ /*Step 4 初始化语句句柄*/ﻫret=SQLAllocHandle(SQL_HANDLE_STMT,kinghdbc,&kinghstmt);
ret=SQLSetStmtAttr(kinghstmt,SQL_ATTR_ROW_BIND_TYPE(SQLPOINTER) SQL_BIND_BY_COLUMN,SQL_IS_INTEGER);
ret=SQLAllocHandle(SQL_HANDLE_STMT,serverhdbc,&serverhstmt);ﻫ /*Step 5 两种方式执行语句*/
/*预编译带有参数得语句*/ﻫret=SQLPrepare(sercerhstmt,"INSERT INTO STUDENT(SNO,SNAME,SSEX,SAGE,SDEPT)ﻫ VALUES(?,?,?,?,?)",SQL_NTS);
if(ret==SQL_SUCCESS||ret==SQL_SUCCESS_WITH_INFO)ﻫ{ﻫ ret=SQLBindParameter(serverhstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,ﻫ SQL_CHAR,SNO_LEN,0,sSno,0,&cbSNO);ﻫ ret=SQLBindParameter(serverhstmt,2,SQL_PARAM_INPUT,SQL_C_CHAR,ﻫ SQL_CHAR,SNAME_LEN,0,sName,0,&cbName);
ret=SQLBindParameter(serverhstmt,3,SQL_PARAM_INPUT,SQL_C_CHAR,ﻫ SQL_CHAR,2,0,sSex,0,&cbSex);ﻫ ret=SQLBindParameter(serverhstmt,4,SQL_PARAM_INPUT,SQL_C_LONG,ﻫ SQL_INTEGER,0,0,&sAge,0,&cbAge);ﻫ ret=SQLBindParameter(serverhstmt,5,SQL_PARAM_INPUT,SQL_C_CHAR,ﻫ SQL_CHAR,DEPART_LEN,0,sDepart,0,&cbDepart);ﻫ}ﻫ /*执行SQL语句*/ﻫret=SQLExecDirect(kinghstmt,"SELECT * FROM STUDENT",SQL_NTS);
if(ret==SQL_SUCCESS||ret==SQL_SUCCESS_WITH_INFO)ﻫ{
ret=SQLBindCol(kinghstmt,1,SQL_C_CHAR,sSno,SNO_LEN,&cbSno);
ret=SQLBindCol(kinghstmt,2,SQL_C_CHAR,sName,NAME_LEN,&cbName);ﻫ ret=SQLBindCol(kinghstmt,3,SQL_C_CHAR,sSex,SSEX_LEN,&cbSex);
ret=SQLBindCol(kinghstmt,4,SQL_C_LONG,&sAge,0,&cbAge);ﻫ ret=SQLBindCol(kinghstmt,5,SQL_C_CHAR,sDepart,DEPART_LEN,&cbDepart);ﻫ}ﻫ /*Step 6 处理结果集并执行预编译后得语句*/ﻫwhile((ret=SQLFetch(kinghstmt))!=SQL_NO_DATA_FOUND)ﻫ{
if(ret==SQL_ERROR) printf("Fetch error\n");ﻫ else ret=SQLExecute(serverhstmt);ﻫ}
/*Step 7 中止处理*/ﻫSQLFreeHandle(SQL_HANDLE_STMT,kinghstmt);
SQLDisconnect(kinghdbc);
SQLFreeHandle(SQL_HANDLE_DBC,kinghdbc);ﻫSQLFreeHandle(SQL_HANDLE_ENV,kinghenv);
SQLFreeHandle(SQL_HANDLE_STMT,serverhstmt);
SQLDisconnect(serverhdbc);
SQLFreeHanlde(SQL_HANDLE_DBC<serverhdbc);ﻫSQLFreeHanlde(SQL_HANDLE_ENV,serverhenv);
return 0;
}
展开阅读全文