开发者社区> 杰克.陈> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

C语言与sqlserver数据库

简介: 原文: C语言与sqlserver数据库 1.使用C语言来操作SQL SERVER数据库,采用ODBC开放式数据库连接进行数据的添加,修改,删除,查询等操作。
+关注继续查看
原文: C语言与sqlserver数据库

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 <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;   

/*
	查询SQLSERVER数据库,1.条件查询,2.直接查询全部
*/
int main(){   
	RETCODE retcode;   
	UCHAR   szDSN[SQL_MAX_DSN_LENGTH+1]   =   "csql",   
            szUID[MAXNAME]   =   "sa",   
            szAuthStr[MAXNAME]   =   "";  
    UCHAR	sql1[39] = "select b from test where a = 'aaa'";
	UCHAR	sql2[35] = "select b from test where a = ? ";
	UCHAR	sql3[19] = "select b from test";
	
	retcode   =   SQLAllocHandle   (SQL_HANDLE_ENV,   NULL,   &henv);   
	retcode   =   SQLSetEnvAttr(henv,   SQL_ATTR_ODBC_VERSION,   
				  (SQLPOINTER)SQL_OV_ODBC3,   
				  SQL_IS_INTEGER);    
	retcode   =   SQLAllocHandle(SQL_HANDLE_DBC,   henv,   &hdbc1);   
	//1.连接数据源
	retcode   =   SQLConnect(hdbc1,   szDSN,   4,   szUID,   2,   szAuthStr,   0);    
	if   (   (retcode   !=   SQL_SUCCESS)   &&   (retcode   !=   SQL_SUCCESS_WITH_INFO)   )   {   
		printf("连接失败!");
	}   else   {   
		//2.创建并执行一条或多条SQL语句
		/*
		1.分配一个语句句柄(statement handle)
		2.创建SQL语句
		3.执行语句
		4.销毁语句
		*/
		retcode   =   SQLAllocHandle(SQL_HANDLE_STMT,   hdbc1,   &hstmt1);   
		//第一种方式
		/*
		//直接执行
		SQLExecDirect (hstmt1,sql1,39);
		char list[5];
		SQLBindCol(hstmt1, 1, SQL_C_CHAR, list, 5, 0);
		SQLFetch(hstmt1);
		printf("%s/n",list);
		*/
		
		//第二种方式
		/*
		//绑定参数方式
		char a[200]="aaa";
		SQLINTEGER   p   =   SQL_NTS;
		//1.预编译
		SQLPrepare(hstmt1,sql2,35); //第三个参数与数组大小相同,而不是数据库列相同
		//2.绑定参数值
		SQLBindParameter(hstmt1,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&a,0,&p);
		//3.执行
		SQLExecute(hstmt1);
		char list[5];
		SQLBindCol(hstmt1, 1, SQL_C_CHAR, list, 5, 0);
		SQLFetch(hstmt1);
		printf("%s/n",list);
		*/

		//第三种方式全部输出
		/*
		1.确认一个结果集是否可用。
		2.将结果集的列绑定在适当的变量上。
		3.取得行
		*/
		//3.检查结果记录(如果有的话)
		SQLExecDirect (hstmt1,sql3,19);
		char list[5];
		SQLBindCol(hstmt1, 1, SQL_C_CHAR, list, 5, 0);
		do{
			retcode = SQLFetch(hstmt1);
			if(retcode == SQL_NO_DATA){
				break;
			}
			printf("%s/n",list);
		}while(1);
		
		//释放语句句柄
		SQLCloseCursor (hstmt1);
		SQLFreeHandle (SQL_HANDLE_STMT, hstmt1);
	
	}   
 
	//4.断开数据源
	/*
     1.断开与数据源的连接.
	 2.释放连接句柄.
	 3.释放环境句柄 (如果不再需要在这个环境中作更多连接)
    */
	SQLDisconnect(hdbc1);    
	SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);   
	SQLFreeHandle(SQL_HANDLE_ENV, henv);   
	return(0);   
}  

 

3.总结:ODBC数据库操作与JDBC步骤上类似,可以融汇贯通来学习

本文来自于http://simpledev.javaeye.com/blog/339537

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
ms sql server 2005数据库日志文件过大,需要清除或者清空
数据库:ms sql server 2005 任务:ms sql server 2005数据库日志文件过大,需要清除。 方法: backup log [你的数据库名称] WITH NO_LOGbackup log [你的数据库名称] WITH TRUNCATE_ONLYDBCC SHRINKDATABASE([你的数据库名称]) 说明: backup log 指定仅备份事务日志。
1076 0
创建SqlServer数据库触发器脚本 范例
--会员表if object_id('userinfo','u') is not nulldrop table userinfogocreate table userinfo(userid int primary key,user_tegral int,level int)insert ...
663 0
创建sqlserver数据库脚本 范例
下面是创建一个sqlserver数据库的代码模板,加上一个创建表的模板。开发的时候可以拷贝过去直接改动一下就可以用了。 希望能帮上忙!   USE [master]GOIF EXISTS(SELECT 1 FROM sysdatabases WHERE NAME=N'HkTemp')BE...
740 0
sqlserver 数据库 SQL循环语句
关键字: sqlserver 数据库 SQL循环语句 declare @i int set @i=1 while @i $50         BREAK      ELSE         CONTINUE END PRINT 'Too much for the market to bear' B. 在带有游标的过程中使用 WHILE 以下的 WHILE 结构是名为 count_all_rows 过程中的一部分。
843 0
sql server数据库定时自动备份
     1、进入企业管理器中->管理->sql server代理->作业;  2、新建作业,作业名称随便取,例如:data备份,所有者选择sa,当然你也可以选择其他用户,前提是该用户有执行作业的权限;  3、点击步骤标签,进入步骤面板。
1109 0
通过事务日志恢复SqlServer数据库到一个特定的时间点
Code--创建测试数据库CREATE DATABASE DbGO--对数据库进行备份BACKUP DATABASE Db TO DISK='c:\db.bak' WITH FORMATGO--创建测试表CREATE TABLE Db.
728 0
SQLServer数据库F5负载问题
目前在用F5给数据库负载遇到的一个问题,给数据库负载(此处不涉及读写分离的问题,因为是一对一的负载即pool memeber只有一个)根据客户的要求给数据库负载采用七层的standerd模式,在TCP协议中,发现VS(标准模式的全端口配置)始终没有办法命中流量,当时网络是没问题的,长ping没有问题。
1271 0
一起谈.NET技术,asp.net利用log4net写入日志到SqlServer数据库
  asp.net利用log4net写入日志到SqlServer数据库,Log4net是一个开源的错误日志记录项目,易用性强,源自log4j,品质值得信赖。 下面就我的安装部署log4net到MS sql server的经验与大家分享。
1309 0
+关注
杰克.陈
一个安静的程序猿~
文章
问答
文章排行榜
最热
最新
相关电子书
更多
SQL Sever迁移PG经验
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载