C语言与sqlserver数据库

原文: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

时间: 2024-08-07 18:03:04

C语言与sqlserver数据库的相关文章

VB语言使用ADO连接、操作SQLServer数据库教程_vb

几年前学过的VB几乎忘光了,这几天复习了下.VB连接ADO数据库并不是非常难. 连接第一步(要仔细看) 对于小白来讲,这里的教程最详细,连接ADO数据库第一步,要添加什么部件呢?全称是Microsoft ADO Data Control 6.0 (SP6) (OLEDB) 部件. 在Microsoft ADO Data Control 6.0 (SP6) (OLEDB)部件里有一个名叫:Adodc数据控件,要将它添加.在Adodc数据控件数据位置中找到ACCES. 控件引用的方法(值指的是姓名)

SQLServer数据库同步准实时方案

server|sqlserver|数据|数据库 1. 需求    1)如何将在线运营的SQLServer数据库数据及时同步到另外一个SQLServer数据库.    2)数据仓库系统的数据抽取会对源系统造成巨大压力,严重影响性能和响应速度.如何将生产数据快速抽取到历史数据仓库,改善业务系统的性能.    3)分布式数据库,如何将分部的数据库数据复制到总部数据库,以利于总部汇总统计.这些业务应用中常见的SQLServer数据库同步需求,都需专业的复制系统来完成. 2. 同步方案   浪擎·镜像系统

求民航售票系统代码用java+jsp代码 SQLserver数据库myeclipse平台

问题描述 求民航售票系统代码用java+jsp代码 SQLserver数据库myeclipse平台 用于课程设计不用太复杂,只用实现基本功能.1.用户登录2.根据时间,出发地,目的地查询机票功能3.订票4.订单查询5.退票.用java+jsp代码 SQLserver数据库myeclipse平台 解决方案 参考:http://download.csdn.net/download/angelyucc/2373156 解决方案二: 这个可以参考,但最好还是自己写吧 解决方案三: http://down

批量替换sqlserver数据库挂马字段并防范sql注入攻击的代码

首先备份数据库,以防不必要的损失.而后对所有被挂马的小于8000字符的varchar字段执行 复制代码 代码如下: update 表名 set 字段名=replace(字段名,'<Script Src=http://c.n%75clear3.com/css/c.js></Script>','') 其中<Script Src=http://c.n%75clear3.com/css/c.js></Script>为挂马字段.执行后挂马字段被清除.但是有部分字段,比

如何使用ASP.NET备份和恢复SqlServer数据库

首先我们先分析ASP备份SQL数据库的代码,详细如下: 备份SqlServer数据库:string SqlStr1 = "Server=(local);database='" + this.DropDownList1.SelectedValue + "';Uid=sa;Pwd=";string SqlStr2 = "backup database " + this.DropDownList1.SelectedValue + " to d

SQLServer数据库中如何保持数据一致性

复制是SQLServer数据库中保持数据一致性的一种手段.根据实现策略的不同,主要有快照复制.事务复制.合并复制等三种类型.这三种复制类型,各有各的特点,分别适用于不同的场合.一般来说,在考虑采用哪种复制类型比较合适的时候,主要考虑的是性能与数据同步的时间间 复制是SQLServer数据库中保持数据一致性的一种手段.根据实现策略的不同,主要有快照复制.事务复制.合并复制等三种类型.这三种复制类型,各有各的特点,分别适用于不同的场合.一般来说,在考虑采用哪种复制类型比较合适的时候,主要考虑的是性能

如何使用JAVASCRIPT从sqlserver数据库中获得数据

javascript|server|sqlserver|数据|数据库 如何使用JAVASCRIPT从sqlserver数据库中获得数据? --------------------------------------------------------------- var conn = new ActiveXObject("ADODB.Connection"); conn.Open("Data Source=190.190.200.100,1433;Initial Catal

有关jsp在windows下的配置及连接SQLServer数据库的详解

js|server|sqlserver|window|数据|数据库|详解 最近在学习jsp,有关jsp的运行环境的配置问题着实让我费了不少功夫,环境配置好了,连接SQL Sever 2000数据库时又出了不少问题,鉴于此我把自己配置这两方面的详细步骤给大家共享一下,希望刚刚接触jsp的并立志在jsp方面有所成就的同仁少走一些弯路,让我共同进步.有希望与我交流的请加我qq:26544472(在验证信息中请注明jsp交流) (一)有关jsp在windows下的配置: Sun推出的JSP(Java S

浅谈优化SQLServer数据库服务器内存配置的策略

server|sqlserver|策略|服务器|数据|数据库|优化 农业银行总行1998年以来正式推广了新版网络版综合业务统计信息系统,该系统是基于WindowsNT4.0平台,采用客户/服务器模式,以Microsoft SQL Server为基础建立起来的大型数据库应用程序,系统界面友好.操作简便,计算.分析.检索功能非常强大,为保证农业银行系统及时进行纵向和横向业务数据采集.按照不同要求生成统计报表,进行全面业务活动分析提供了强有力的保障.但在这套程序的推广.维护中笔者发现系统有时运行速度较