C语言+ODBC+SQL 连接
第一步:配置ODBC。
①、在控制面板找到ODBC,或者在控制面板上搜索ODBC。如图:
②、点击ODBC的添加按钮,选择SQL Server,这是会出现创建SQL Server的新数据源的对话框,我以phonesql为名建立名称,选择SQL登陆的服务器,再点击下一步,选择登陆方式:网络登陆、用户输入登陆,任选(我选择用户输入登陆,以:用户名sa 密码123456为例 )。
③、选择数据库test(我在SQL里面建的test),然后一直点下一步。最后点测试数据源。最后显示测试成功。
这样ODBC就建立好了,接下来的工作就是连接数据库了。
第二步:建立数据库的表和添加数据。
CREATE TABLE [dbo].[worker](
[num] [int] NOT NULL,
[name] [char](20) NOT NULL,
[sex] [char](10) NOT NULL,
[age] [int] NOT NULL,
[shenfennum] [char](20) NOT NULL,
[xueli] [char](10) NOT NULL,
[mianmao] [char](10) NOT NULL,
[mima] [char](20) NOT NULL,
[quanxian] [char](10) NOT NULL,
[born] [char](20) NOT NULL
) ON [PRIMARY]
第三步:使用VC++访问数据库。
①、引用头文件
#include<stdio.h> #include<windows.h> #include<sql.h> #include<sqlext.h> #include<sqltypes.h>
解释:1. SQLINTEGER 定义一个整型变量,相当于C语言中的int。
2. SQLCHAR 定义一个字符变量,相当于C语言中的char.
3. ret=SQLConnect(hdbc,(SQLCHAR*)"phonesql",SQL_NTS,(SQLCHAR*)"sa",SQL_NTS,(SQLCHAR*)"123456",SQL_NTS);//连接数据库
phonesql是建立的odbc的数据源,sa是用户名,123456是密码
代码如下:
#include<stdio.h> #include<windows.h> #include<sql.h> #include<sqlext.h> #include<sqltypes.h> #include<string.h> SQLINTEGER num1,age1; SQLCHAR name1[20],sex1[10],shenfennum1[20],xueli1[10],mianmao1[10],mima1[20],quanxian1[10],born1[20]; SQLINTEGER len_num1,len_name1,len_sex1,len_shenfennum1,len_xueli1,len_age1,len_mianmao1,len_born1,len_mima1,len_quanxian1; void fuzhi() { SQLRETURN ret; SQLHENV henv;//SQLHANDLE henv SQLHDBC hdbc;//SQLHANDLE hdbc SQLHSTMT hstmt;//SQLHANDLE hstmt ret=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv);//申请环境句柄 ret=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);//设置环境属性 ret=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);//申请数据库连接句柄 ret=SQLConnect(hdbc,(SQLCHAR*)"phonesql",SQL_NTS,(SQLCHAR*)"sa",SQL_NTS,(SQLCHAR*)"123456",SQL_NTS);//连接数据库 if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){ ret=SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);//申请SQL语句句柄 SQLCHAR sql[]="SELECT *FROM worker"; ret=SQLExecDirect(hstmt,sql,SQL_NTS);//直接执行SQL语句 if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){ int i=0; while(SQLFetch(hstmt)!=SQL_NO_DATA){//遍历结果集 /*****************************************数据库整型赋值*******************************/ SQLGetData(hstmt,1,SQL_C_ULONG,&num1,0,&len_num1); /************************************************************************************/ SQLGetData(hstmt,2,SQL_C_CHAR,name1,20,&len_name1); SQLGetData(hstmt,3,SQL_C_CHAR,sex1,10,&len_sex1); SQLGetData(hstmt,4,SQL_C_ULONG,&age1,0,&len_age1); SQLGetData(hstmt,5,SQL_C_CHAR,shenfennum1,20,&len_shenfennum1); SQLGetData(hstmt,6,SQL_C_CHAR,xueli1,10,&len_xueli1); SQLGetData(hstmt,7,SQL_C_CHAR,mianmao1,10,&len_mianmao1); SQLGetData(hstmt,8,SQL_C_CHAR,mima1,20,&len_mima1); SQLGetData(hstmt,9,SQL_C_CHAR,quanxian1,10,&len_quanxian1); SQLGetData(hstmt,10,SQL_C_CHAR,born1,10,&len_born1); printf("%d %s %s %d %s %s %s %s %s %s\n",num1,name1,sex1,age1,shenfennum1,xueli1,mianmao1,mima1,quanxian1,born1); } SQLSMALLINT number_column; ret=SQLNumResultCols(hstmt,&number_column);//查询结果集列数 if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO) printf("结果集共有%d列\n",number_column); else printf("查询结果集列数失败!\n"); SQLINTEGER number_row; ret=SQLRowCount(hstmt,&number_row);//查询被影响的行数 if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO) printf("结果集共有%d个记录\n",number_row); else printf("查询结果集记录个数失败!\n"); SQLFreeHandle(SQL_HANDLE_STMT,hstmt);//释放语句句柄 }else printf("查询数据库操作失败!\n"); SQLDisconnect(hdbc);//断开与数据库的连接 } else printf("连接数据库失败!\n"); SQLFreeHandle(SQL_HANDLE_DBC,hdbc);//释放连接句柄 SQLFreeHandle(SQL_HANDLE_ENV,henv);//释放环境句柄 } /********************************************************/ int main(){ fuzhi(); return 0; }
第四步:把获取的数据赋值给C语言中结构体中,使操作数据更方便(也可以直接用通过ODBC更改数据,个人觉得麻烦)。
①、定义结构体。
struct worker { int num;//工号 char name[20];//姓名 char sex[10];//性别 int age;//年龄 char shenfennum[20];//身份证号码 char xueli[10];//学历 char mianmao[10];//政治面貌 char mima[20];//密码 char quanxian[10];//权限设置 char born[20];//出生年月日 }gong[1000];
②、赋值。
gong[i].num=num1; gong[i].age=age1; strcpy((char *)gong[i].name,(char *)name1); strcpy((char *)gong[i].sex,(char *)sex1); strcpy((char *)gong[i].shenfennum,(char *)shenfennum1); strcpy((char *)gong[i].xueli,(char *)xueli1); strcpy((char *)gong[i].mianmao,(char *)mianmao1); strcpy((char *)gong[i].mima,(char *)mima1); strcpy((char *)gong[i].quanxian,(char *)quanxian1); strcpy((char *)gong[i].born,(char *)born1);
注意:SQL里面char数据类型是当填写内容不足自身长度时,后面补足相应的空格。所以赋值时,也会把空格符号赋值给变量里面,导致后期处理数据有误。在SQL建表时:将char类型修改为Varchar类型,也可以写一个函数来去除多余的空格符。代码如下:
void trim(char *str) { int i,j,k; char tmpstr[MAXSTRSIZE]; //可以动态分配一下,这里用静态的一般情况可以满足 i=strlen(str); for(k=j=0;j<i;j++) { if(str[j]!=‘ ‘) { tmpstr[k]=str[j];k++;} } tmpstr[k]=‘\0‘; strcpy(str,tmpstr); }
整体代码如下:
#include<stdio.h> #include<windows.h> #include<sql.h> #include<sqlext.h> #include<sqltypes.h> #include<string.h> #define MAXSTRSIZE 1024 SQLINTEGER num1,age1; SQLCHAR name1[20],sex1[10],shenfennum1[20],xueli1[10],mianmao1[10],mima1[20],quanxian1[10],born1[20]; SQLINTEGER len_num1,len_name1,len_sex1,len_shenfennum1,len_xueli1,len_age1,len_mianmao1,len_born1,len_mima1,len_quanxian1; struct worker { int num;//工号 char name[20];//姓名 char sex[10];//性别 int age;//年龄 char shenfennum[20];//身份证号码 char xueli[10];//学历 char mianmao[10];//政治面貌 char mima[20];//密码 char quanxian[10];//权限设置 char born[20];//出生年月日 }gong[1000]; void trim(char *str); void fuzhi() { SQLRETURN ret; SQLHENV henv;//SQLHANDLE henv SQLHDBC hdbc;//SQLHANDLE hdbc SQLHSTMT hstmt;//SQLHANDLE hstmt ret=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv);//申请环境句柄 ret=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);//设置环境属性 ret=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);//申请数据库连接句柄 ret=SQLConnect(hdbc,(SQLCHAR*)"phonesql",SQL_NTS,(SQLCHAR*)"sa",SQL_NTS,(SQLCHAR*)"123456",SQL_NTS);//连接数据库 if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){ ret=SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);//申请SQL语句句柄 SQLCHAR sql[]="SELECT *FROM worker"; ret=SQLExecDirect(hstmt,sql,SQL_NTS);//直接执行SQL语句 if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){ int i=0; while(SQLFetch(hstmt)!=SQL_NO_DATA){//遍历结果集 /*****************************************数据库整型赋值*******************************/ SQLGetData(hstmt,1,SQL_C_ULONG,&num1,0,&len_num1); /************************************************************************************/ SQLGetData(hstmt,2,SQL_C_CHAR,name1,20,&len_name1); SQLGetData(hstmt,3,SQL_C_CHAR,sex1,10,&len_sex1); SQLGetData(hstmt,4,SQL_C_ULONG,&age1,0,&len_age1); SQLGetData(hstmt,5,SQL_C_CHAR,shenfennum1,20,&len_shenfennum1); SQLGetData(hstmt,6,SQL_C_CHAR,xueli1,10,&len_xueli1); SQLGetData(hstmt,7,SQL_C_CHAR,mianmao1,10,&len_mianmao1); SQLGetData(hstmt,8,SQL_C_CHAR,mima1,20,&len_mima1); SQLGetData(hstmt,9,SQL_C_CHAR,quanxian1,10,&len_quanxian1); SQLGetData(hstmt,10,SQL_C_CHAR,born1,10,&len_born1); gong[i].num=num1; gong[i].age=age1; strcpy((char *)gong[i].name,(char *)name1); strcpy((char *)gong[i].sex,(char *)sex1); strcpy((char *)gong[i].shenfennum,(char *)shenfennum1); strcpy((char *)gong[i].xueli,(char *)xueli1); strcpy((char *)gong[i].mianmao,(char *)mianmao1); strcpy((char *)gong[i].mima,(char *)mima1); strcpy((char *)gong[i].quanxian,(char *)quanxian1); strcpy((char *)gong[i].born,(char *)born1); trim(gong[i].name);//删除数据库赋值给字符串中的空格字符 trim(gong[i].sex); trim(gong[i].shenfennum); trim(gong[i].xueli); trim(gong[i].mianmao); trim(gong[i].mima); trim(gong[i].quanxian); trim(gong[i].born); printf("\n***********************结构体数据测试第%d个数据*****************************\n",i+1); printf("\n\n**************************************************************************\n"); printf(" 工号: %d 姓名: %s 性别: %s 身份证号码: %s \n 学历: %s",gong[i].num,gong[i].name,gong[i].sex,gong[i].shenfennum,gong[i].xueli); printf("政治面貌: %s 密码%s , 权限:%s 出生年月%s",gong[i].mianmao,gong[i].mima,gong[i].quanxian,gong[i].born); printf("年纪:%d岁 \n\n",gong[i].age); printf("**************************************************************************\n"); i++; } SQLSMALLINT number_column; ret=SQLNumResultCols(hstmt,&number_column);//查询结果集列数 if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO) printf("结果集共有%d列\n",number_column); else printf("查询结果集列数失败!\n"); SQLINTEGER number_row; ret=SQLRowCount(hstmt,&number_row);//查询被影响的行数 if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO) printf("结果集共有%d个记录\n",number_row); else printf("查询结果集记录个数失败!\n"); SQLFreeHandle(SQL_HANDLE_STMT,hstmt);//释放语句句柄 }else printf("查询数据库操作失败!\n"); SQLDisconnect(hdbc);//断开与数据库的连接 } else printf("连接数据库失败!\n"); SQLFreeHandle(SQL_HANDLE_DBC,hdbc);//释放连接句柄 SQLFreeHandle(SQL_HANDLE_ENV,henv);//释放环境句柄 } void trim(char *str) { int i,j,k; char tmpstr[MAXSTRSIZE]; //可以动态分配一下,这里用静态的一般情况可以满足 i=strlen(str); for(k=j=0;j<i;j++) { if(str[j]!=‘ ‘) { tmpstr[k]=str[j];k++;} } tmpstr[k]=‘\0‘; strcpy(str,tmpstr); } /********************************************************/ int main(){ fuzhi(); return 0; }
显示结果如下:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。