一、配置ODBC数据源

1、搜索框搜索’ODBC’

2、点击“添加

3、选择 “SQL Sever Native Client 11.0”

4、
输入数据源(需记住)的名称,以及服务器名(本人填写的是’.’,本地服务器)。
5、输入登录名和密码。(如果之前用的是Windows登录,请修改为SQL Sever身份验证)。
修改过程参考修改为SQL Sever身份验证登录


6、选择数据库

7、

8、点击测试数据源

9、测试成功

二、连接数据库

VS环境下创建工程,添加文件,先输入以下代码,然后其中有地方需要自行修改

//   VS2013 环境
#include<iostream>
#include<string>
#include<windows.h>
#include<sql.h>
#include<sqlext.h>
#include<sqltypes.h>
#define sno_length 11
#define sname_length 10
#define sdepart_length 30
#define ssex_length 5
using namespace std;
SQLRETURN ret;
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
typedef struct {SQLCHAR sno[sno_length], sname[sname_length], sdept[sdepart_length], ssex[ssex_length];SQLSMALLINT sage, grade;SQLINTEGER csno, cbsname, cbdepart, cbsage, cbsex;
}SC;
SC sc;
//字符转为宽字符
wchar_t* trstring2wchar(const  char *str)
{int mystringsize = (int)(strlen(str) + 1);WCHAR* wchart = new wchar_t[mystringsize];MultiByteToWideChar(CP_ACP, 0, str, -1, wchart, mystringsize);return wchart;}
//宽字符转换为字符串
void wchar2strstring(string & szDst, WCHAR * wchart)
{wchar_t * wtext = wchart;DWORD dwNmu = WideCharToMultiByte(CP_OEMCP, NULL, wtext, -1, NULL, 0, NULL, FALSE);char * psTest;psTest = new char[dwNmu];WideCharToMultiByte(CP_OEMCP, NULL, wtext, -1, psTest, dwNmu, NULL, FALSE);szDst = psTest;delete[]psTest;
}//字符转换为wstring
wstring CharToWchar(const char* c, size_t m_encode = CP_ACP)
{std::wstring str;int len = MultiByteToWideChar(m_encode, 0, c, strlen(c), NULL, 0);wchar_t*   m_wchar = new wchar_t[len + 1];MultiByteToWideChar(m_encode, 0, c, strlen(c), m_wchar, len);m_wchar[len] = '\0';str = m_wchar;delete m_wchar;return str;
}//错误处理
void handleResult(SQLHANDLE hHandle, SQLSMALLINT hType, RETCODE  RetCode)
{SQLSMALLINT iRec = 0;SQLINTEGER iError;WCHAR wszMessage[1000];WCHAR wszState[SQL_SQLSTATE_SIZE + 1];//处理无效if (RetCode == SQL_INVALID_HANDLE){fwprintf(stderr, L"Invalid handle!\n");return;}//   对于此处版本 vc 6.0 报错while (SQLGetDiagRec(hType, hHandle, ++iRec, wszState, &iError, wszMessage, (SQLSMALLINT)(sizeof(wszMessage) / sizeof(WCHAR)),(SQLSMALLINT *)NULL) == SQL_SUCCESS){// Hide data truncated.. if (wcsncmp(wszState, L"01004", 5)){fwprintf(stderr, L"[%5.5s]---%s---(%d)\n", wszState, wszMessage, iError);}}
}
//输出错误
void error(SQLRETURN err) {printf("错误相关信息输出: ");switch (err) {case SQL_SUCCESS:puts("****SQL_SUCCESS*****"); break;case  SQL_SUCCESS_WITH_INFO:puts("SQL_SUCCESS_WITH_INFO"); break;case   SQL_ERROR:puts("SQL_ERROR"); break;case   SQL_INVALID_HANDLE:puts("SQL_INVALID_HANDLE"); break;case SQL_NO_DATA_FOUND:puts("SQL_NO_DATA_FOUND"); break;case   SQL_NEED_DATA:puts("SQL_NEED_DATA"); break;default:puts("err");}
}
//宽字符转字符指针
char* wideCharToMultiByte(wchar_t* pWCStrKey)
{//第一次调用确认转换后单字节字符串的长度,用于开辟空间int pSize = WideCharToMultiByte(CP_OEMCP, 0, pWCStrKey, wcslen(pWCStrKey), NULL, 0, NULL, NULL);char* pCStrKey = new char[pSize + 1];//第二次调用将双字节字符串转换成单字节字符串WideCharToMultiByte(CP_OEMCP, 0, pWCStrKey, wcslen(pWCStrKey), pCStrKey, pSize, NULL, NULL);pCStrKey[pSize] = '\0';return pCStrKey;
}//连接
void init(){ret = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);//申请环境句柄ret = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);ret = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);//申请数据库连接句柄//vs 2013 改为以下ret = SQLConnect(hdbc, (SQLWCHAR*)L"db1", SQL_NTS, (SQLWCHAR*)L"sa", SQL_NTS, (SQLWCHAR*)L"17386111245", SQL_NTS);//VC6.0中用   ret = SQLConnect(hdbc, (unsigned char*)"test_db", SQL_NTS, (unsigned char*)"sa" , SQL_NTS, (unsigned char*)"666666", SQL_NTS);// 与上等价//  ret=SQLConnect(hdbc,(SQLCHAR*)"DB_61",SQL_NTS,(SQLCHAR*)"sa",SQL_NTS,(SQLCHAR*)"666666",SQL_NTS);//  DB_61为配置的ODBC数据源名称,这里根据自己的配置进行修改if (!(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)){printf("连接数据库失败!\n");//     cout<"连接数据库失败!"<<endl;//     return -1;}else{printf("连接成功!\n");}//ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
}
//查询
void query(){// VS 2013版本中ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);SQLWCHAR sql1[] = L"use test_db";SQLWCHAR sql2[] = L"select * from test";ret = SQLExecDirect(hstmt, sql1, SQL_NTS);ret = SQLExecDirect(hstmt, sql2, SQL_NTS);if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO){//  SQLWCHAR str1[50], str2[50], str3[50];SQLCHAR str1[50], str2[50], str3[50];SQLINTEGER len_str1, len_str2, len_str3;//   SQLLEN len_str1, len_str2, len_str3;/*SQLFetch函数的功能是将结果集的当前记录指针移至下一个记录;*/while (SQLFetch(hstmt) != SQL_NO_DATA){/*SQLGetData函数的功能是提取结果集中当前记录的某个字段值*/SQLGetData(hstmt, 1, SQL_C_CHAR, str1, sizeof(str1), &len_str1);   //获取第一列数据SQLGetData(hstmt, 2, SQL_C_CHAR, str2, sizeof(str2), &len_str2);SQLGetData(hstmt, 3, SQL_C_CHAR, str3, sizeof(str3), &len_str3);//  retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, sCustID, 100, &cbCustID);printf(" %s \t %s \t %s \n", str1, str2, str3);}}ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);//ret = SQLFreeHandle(SQL_HANDLE_DBC, hdbc);//释放连接句柄//SQLDisconnect(hdbc);//ret = SQLFreeHandle(SQL_HANDLE_ENV, henv);//释放环境句柄// return 0;
}//插入记录
void insert(){ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);SQLWCHAR str[100] = L"insert into test_db.dbo.test(num,name,addr,age) values(12,'李莉','深州',21)";ret = SQLExecDirect(hstmt, str, SQL_NTS);if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO){cout << "插入成功!" << endl;}else{handleResult(hstmt, SQL_HANDLE_STMT, ret);cout << "插入失败!" << endl;}error(ret);// 输出:****SQL_SUCCESS*****//    表示插入成功
}//删除记录
void delRecord(){ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);//    传入要删除的 id,带参数查询可用字符拼接完成//   假如是 12int num = 12;//  WCHAR* wchart = trstring2wchar(num.c_str());string sql = "delete from test_db.dbo.test where  num=";char ch[10];sprintf(ch, "%d", num);sql.append(ch);// wcscat(sql, wchart);cout << "111" << endl;//wprintf(L"%S", sql);//  wcout << sql << endl;ret = SQLExecDirect(hstmt, trstring2wchar(sql.c_str()), SQL_NTS);if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO){cout << "删除成功!" << endl;}else{handleResult(hstmt, SQL_HANDLE_STMT, ret);cout << "删除失败!" << endl;}}int main(){init();//insert();//query();//delRecord();//query();
}

修改部分:在init()函数中

ret = SQLConnect(hdbc, (SQLWCHAR*)L"db1", SQL_NTS, (SQLWCHAR*)L"sa", SQL_NTS, (SQLWCHAR*)L"17386111245", SQL_NTS);

第一个参数"db1",修改为,配置ODBC数据源时设置的需要记住的名称;后两个参数分别为用户名和密码。

开始运行,连接成功。

主函数里面,因为每个人的表不一样,我把其他功能给注释掉了,只保留了一个函数,测试连接数据库。其余部分可以参考。

参考代码:代码出处

VS2010C++ODBC连接SQL Server相关推荐

  1. Qlikview配置ODBC连接SQL SERVER/ORACLE

    一, Qlikview配置ODBC连接SQL SERVER 1,打开ODBC数据源管理器:运行--〉ODBC 2,添加用户DSN 3,选择SQL Server Native Client 11.0, ...

  2. C++中使用ODBC连接SQL Server数据库

    文章目录 整体总结 ODBC连接 一个修改别人的整体的例子 整体总结 用odbc过时了,还是使用ado吧,易用,高效率,不用配置odbc数据源,易维护,实际项目已从odbc中改用了ado,请看我的这篇 ...

  3. C#实现ODBC驱动代码连接Sql Server数据库

    ODBC连接Sql Server数据库-C#实现 利用ODBC驱动程序,可以以一种相同的语法来存取和维护数据表中的数据.为了便于在应用程序中使用ODBC,首先需要配置ODBC数据源,又称DSN,它把应 ...

  4. Navicat 连接SQL Server ERROR [IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序

    Navicat 连接SQL Server ERROR [IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序 和能成功连接数据库的环境对比,发现少了 ...

  5. linux下qt的odbc库编译,linux qt QODBC连接sql server 驱动 有关问题 ,实在是没辙了

    linux qt QODBC连接sql server 驱动 问题 ,实在是没辙了 程序在linux下,现在需要连接windows的sqlserver . db = QSqlDatabase::data ...

  6. Access快速连接SQL Server的方法(VB代码为例)

    第1步.通过ODBC导入在SQL服务器中所需的链接表 第2步.在启动窗体的加载代码中加入此代码: 以下为VB为例的代码: //链接代码  www.web2bar.cn Private Sub Form ...

  7. python连sql server学生管理系统_Python 跨平台连接 SQL Server

    前言 使用 python 访问 SQL Server 数据库,还需要支持跨平台.关于 SQL Server 的吐槽就免了,既然存在,总会有遇到这个问题的时候. 首先在 SQLAlchemy 文档中介绍 ...

  8. QT 连接 sql server数据库 完整演示

    1.测试qt是否支持sql sqlserver 在配置文件中先添加 一行 QT+=sql #include <QApplication> #include <QSqlDatabase ...

  9. Qt连接SQL Server 2014数据库

    Qt连接SQL Server 2014数据库 1. 建立目标数据库 连接数据库之前,需先在SQL Server中建立一个目标数据库,建立数据库和添加表的步骤这里不详述. 如建立一个名为DataBase ...

最新文章

  1. 手机移动端网站建设这些细节问题需重视
  2. 存储过程参数输入输出
  3. webpack学习之路(四)webpack-hot-middleware实现热更新
  4. Java工作笔记-使用IDEA开始我的第一个Spring项目
  5. 再问数据中台 - 数据中台建设的最大的挑战是什么
  6. fastjson解析JSON数据乱序导致的问题
  7. go如何进行交叉编译
  8. 极客时间App安卓版上线,让知识获取更加简单
  9. synchronized原理_浅谈synchronized的实现原理
  10. canvas 之星空动画
  11. visual设计的界面发布到iis上显示不一样_Material Design暗夜模式设计指南
  12. Java入门到精通(六)
  13. 城市数据大脑:小汽车儿堵成翔?NONONO!
  14. 各种快捷键组合操作让Spotlight搜索变得无比强大
  15. Poisson 分布
  16. ElasticSearch——路由(_routing)机制
  17. Introduction to NMOS and PMOS Transistors
  18. APMServ启动失败解决方法
  19. Nginx访问控制,限速limit_conn, limit_req
  20. 虹科技术 | 终端入侵防御 | 在重大攻击中发现新的Babuk勒索软件

热门文章

  1. 王济 matlab,关于王济老师《Matlab在振动信号处理中的应用》书中第八章8.3节 程序8.2a的问题...
  2. EasyClick 原生UI 高级课程
  3. 如何利用Smartbi进行bi报表开发?
  4. 图解NebulaGraph-开源国产分布式图数据库!
  5. 基于FPGA的分形编码器verilog设计
  6. 虚拟机导入OVF格式
  7. 一文读懂PCA分析 (原理、算法、解释和可视化)
  8. c语言制作一个表白神器(可自行添加背景文字~)
  9. 计算机场地规范中光纤链路测试,光纤链路测试详解.doc
  10. Web各个标记的属性(1)