【C语言】使用ODBC连接Microsoft SQL server数据库

使用C语言通过ODBC(开放式数据库互连)对SQL Server进行连接,分为两步操作:1.配置本地ODBC环境;2.码代码...=_=

【首先配置本地环境】
1.启动SQLSERVER服务,例如:HNHJ,开始菜单 ->运行 ->net start mssqlserver   //ps这里的mssqlserver名字要查看任务管理器中服务显示的名字


2.更改SQL server登录方式为SQL Server身份验证登陆。

步骤:进入你的数据库->在服务器上右键->属性->安全性->SQL Server和Windows身份验证模式->点确定。


3.打开企业管理器,建立数据库,并在数据库中建立一张表。

我的数据库名字是CCCS,创建city表

4.建立系统DSN,开始菜单 ->运行 ->odbcad32

点击添加->SQL Server->数据源名称(自己起个名字记住,一会有用,我的是CCCS)->选择SQL Server服务器(选取本机名称,不要选local)->使用用户使用登录ID和密码的SQL Server验证->登录ID:sa,密码:(为空)->更改默认的数据库为:CCCS->测试数据源,测试成功,即DNS添加成功。

【C语言 关键函数】

1.SQLBindCol()函数具有六个参数,分别是

SQLRETURN SQLBindCol(
SQLHSTMT            StatementHandle,
SQLUSMALLINT     ColumnNumber,
SQLSMALLINT       TargetType,
SQLPOINTER        TargetValuePtr,
SQLINTEGER        BufferLength,
SQLLEN *              StrLen_or_Ind);

其中第一个参数是句柄,第二个参数是目标表中的列数(unsigned short),第三个是目标类型,第四个是储存数据库反馈信息(城市,纬度等)的字符串变量,第五个是第四个参数的长度(推荐使用strlen(string)测长度),第六个是啥玩意的缓冲区,为0即可。

2.SQLExecDirect()函数具有三个参数,分别是

SQLRETURN SQLExecDirect(
     SQLHSTMT     StatementHandle,
     SQLCHAR *    StatementText,
     SQLINTEGER   TextLength);

其中第一个参数是句柄,第二个参数是储存送给数据库的SQL语句的字符串变量,第三个函数是第二个参数的长度(推荐使用strlen(string)测长度)。

源代码

#include "stdafx.h"
#include "stdlib.h"
#include "string.h"
#include "iostream"   
#include <windows.h>    
#include <sql.h>    
#include <sqlext.h>    
#include <sqltypes.h>    
#include <odbcss.h> 


#pragma comment (lib, "odbc32.lib")
#pragma comment (lib, "odbccp32.lib")
using namespace std;




SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc1 = SQL_NULL_HDBC;
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;


int _tmain(int argc, _TCHAR* argv[])
{
RETCODE retcode;
UCHAR szDSN[SQL_MAX_DSN_LENGTH + 1] = "CCCS";
UCHAR szUID[MAXNAME] = "a";
UCHAR szAuthStr[MAXNAME] = "";


char sql[128] = "\0";                        //插入时是用的sql语句的存放变量 
char sqlh1[70] = "INSERT INTO [CCCS].[dbo].[city]([city],[longitude],[latitude])VALUES('";//拼合字符串


char sqlh2[4] = "','";
char sqlh3[4] = "');";
//UCHAR   pre_sql[31] = "insert into city values(?,?,?)";//预编译SQL语句  


//SQL语句  
//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);   // 这里的数字是指前面字符串的长度
//retcode = SQLDriverConnect(hdbc1, NULL, (SQLTCHAR *)ConnStr, SQL_NTS, NULL, NULL, NULL, SQL_DRIVER_NOPROMPT);
//判断连接是否成功  
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);     
//第一种方式  
//直接执行  
//添加操作

//拼合字符串
strcpy(sql,sqlh1);
strcat(sql,"aaaa");
strcat(sql,sqlh2);
strcat(sql,"112.5");
strcat(sql,sqlh2);
strcat(sql,"29.1");
strcat(sql,sqlh3);
//执行sql语句
//SQLExecDirect (hstmt1,(UCHAR *)sql,50); 
//测试
int dddd =strlen(sql);

switch(SQLExecDirect(hstmt1, (UCHAR FAR*)sql,SQL_NTS) /*SQLExecDirect (hstmt1,(UCHAR *)sql,strlen(sql))*/) { 
case SQL_SUCCESS_WITH_INFO: { 
printf("SQL_SUCCESS_WITH_INFO\n");
break;

case SQL_SUCCESS: { 
printf("SQL_SUCCESS\n"); 
break; 
 }  
case SQL_ERROR: {
printf("SQL_ERROR\n"); 
BYTE buf[250]={0};
BYTE sqlstate[15]={0}; 
SQLGetDiagRec( SQL_HANDLE_STMT,hstmt1, 1, sqlstate, NULL,buf, sizeof(buf),NULL); 
fprintf(stderr, " %s SQLSTATE=%s\n", buf, sqlstate);
break; 

default: 
printf("else Return\n"); 



//测试结束
printf("%s\n",sql);//test





//第二种方式  
//绑定参数方式  
/*char a[200]="bbb";  
char b[200]="200";  
char c[200]="200";
SQLINTEGER   p   =   SQL_NTS;  
//1预编译  
SQLPrepare(hstmt1,pre_sql,31); //第三个参数与数组大小相同,而不是数据库列相同  
//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);  
SQLBindParameter(hstmt1,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&c,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);     
getchar();
return 0;     
}     


  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值