使用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
#include
#include
#include
#include
#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;
}