当前位置:文档之家› C语言连接SQL数据库

C语言连接SQL数据库

C语言连接SQL数据库
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语言与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

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_INF

O)){

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.}

//##########################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_INF

O)){

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

#inlcude

#include

#include

#include

#include

#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_BI ND_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

}

相关主题
文本预览
相关文档 最新文档