C语言与sqlserver数据库

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 原文: 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

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
8天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
47 10
|
24天前
|
API 数据库 C语言
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
164 0
|
29天前
|
SQL 数据库
sql server中创建数据库和表的语法
sql server中创建数据库和表的语法
18 1
|
8天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
66 6
|
8天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
|
29天前
|
SQL Oracle 关系型数据库
干货!sqlserver数据库所有知识点总结整理,含代码(挺全的)
干货!sqlserver数据库所有知识点总结整理,含代码(挺全的)
11 0
|
30天前
|
前端开发 Java 数据库
HTML、sqlserver数据库和java前七章节的复习(一)
HTML、sqlserver数据库和java前七章节的复习(一)
8 0
|
1月前
|
SQL 存储 数据库
数据安全无忧,SQL Server 2014数据库定时备份解密
数据安全无忧,SQL Server 2014数据库定时备份解密
|
数据库 SQL 数据安全/隐私保护
|
1月前
|
SQL 数据库 数据安全/隐私保护
Sql Server数据库Sa密码如何修改
Sql Server数据库Sa密码如何修改