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

C语言连接SQL数据库

连接到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 employeeWHERE 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.}//##########################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.确认一个结果集是否可用。

相关主题