文章目录

  • 整体总结
  • ODBC连接
  • 一个修改别人的整体的例子

整体总结

用odbc过时了,还是使用ado吧,易用,高效率,不用配置odbc数据源,易维护,实际项目已从odbc中改用了ado,请看我的这篇文章,有详细的封装实现:https://blog.csdn.net/lishenluo/article/details/108239084

坚持用odbc?那么继续这篇:

参考官网:https://docs.microsoft.com/zh-cn/sql/odbc/reference/syntax/sqlallochandle-function?view=sql-server-ver15
有用的博客1:https://blog.csdn.net/serg_/article/details/1618317
有用的博客2:https://www.cnblogs.com/MakeView660/p/9578236.html

ODBC访问sql server数据库,比较麻烦。没有像使用occi那样访问oracle数据库那么方便(lsl20200817修正:occi访问oracle获取股票列表并不见得有多快,目前只是觉得能用就不改进了)。 批量操作并不好。如获取数据,执行sql后,还需要循环一个个取数据,很是麻烦,需要输入要获取的数据的类型。

可以所有列都是按SQL_C_CHAR字符类型来获取,后续使用数据的时候再转类型。代码如下:

int selectData(const string& sql,vector<string>& results)
{CHAR csql[SQL_MAX_OPTION_STRING_LENGTH] = { 0 };strcpy_s(csql, sql.c_str());RETCODE ret = SQLExecDirect(hstmt1, (SQLCHAR*)csql, strlen(csql));if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO){LLogError("select data error,error code:"<<ret);return ret;}SQLCHAR midData[MAXCHAR] = { 0 };//注意这里:字符数组SQLLEN midDataLength = 0;SQLSMALLINT columnCount = 0;SQLNumResultCols(hstmt1,&columnCount);int line = 0;while (SQLFetch(hstmt1) != SQL_NO_DATA_FOUND){// 参数1为执行语句的句柄,// 参数2为所要得到的数据位于的列数(SQL语句中),// 参数3为数据类型,这个比较多,需要看一下MSDN// 参数4为保存的位置(地址),// 参数5为参数4可用的位置,既然参数3已设定为长整型,所以这里可使用0// 参数6为实际返回的长度stringstream ss;++line;ss << line;for (int col = 1; col <= columnCount; ++col){midData[0] =  0 ; //注意这里:重新赋空ret = SQLGetData(hstmt1, col, SQL_C_CHAR, midData, MAXCHAR, &midDataLength);if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO){ss << "," << midData;}}results.emplace_back(ss.str());//一个string就是表格的一行,用逗号分隔}SQLCancel(hstmt1); //注意,回到前一个状态,否则下次查询查不到哦
}

ODBC连接

SQLConnect的时候,使用的是odbc数据库源名称,在odbc数据源中设置。windows中安装了sql server manager后,相应的odbc应该也安装了,没有安装的话安装一个。然后配置一个odbc数据源(地址,账号,密码等),这里就是通过这个数据源名称选择连接那个数据源。
.

一个修改别人的整体的例子

这里只是测试验证,实际中我是封装了类的。否则就太乱了。

#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] = "dataservice", //odbc数据库源名称,在odbc数据源中设置。windows中安装了sql server manager后,相应的odbc应该也安装了吧,没有安装的话安装一个。然后配置一个odbc数据源(地址,账号,密码等),这里就是通过这个数据源名称选择连接那个数据源。szUID[MAXNAME] = "sa",szAuthStr[MAXNAME] = "11";//SQL语句  //直接SQL语句  UCHAR   sql[74] = "SELECT * FROM[DataService].[dbo].[DailyFacts] where stockId = '600036.sh'";// "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, 12, szUID, 2, szAuthStr, 2);UCHAR   conInfo[125] = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=sa;Initial Catalog=DataService;Data Source=10.101.223.13";SQLCHAR* pwszConnStr=NULL;//retcode = SQLDriverConnect(hdbc1,//    GetDesktopWindow(),//    pwszConnStr,//    SQL_NTS,//    NULL,//    0,//    NULL,//    SQL_DRIVER_COMPLETE);//判断连接是否成功  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);//第一种方式  //直接执行  //添加操作  retcode=SQLExecDirect (hstmt1,sql,74);if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO){return 0;}SQLCHAR sqlnID[MAXCHAR] = {0};SQLLEN sqlnIDLength = 0;SQLCHAR columnName[MAXCHAR] = { 0 };SQLSMALLINT DataType= 0;SQLSMALLINT NameLength = 0;SQLULEN columnsize = 0;SQLSMALLINT dd = 0;SQLSMALLINT na = 0;SQLSMALLINT ddd = 0;///* SQL data type codes *///#define SQL_UNKNOWN_TYPE    0//#define SQL_CHAR            1//#define SQL_NUMERIC         2//#define SQL_DECIMAL         3//#define SQL_INTEGER         4//#define SQL_SMALLINT        5//#define SQL_FLOAT           6//#define SQL_REAL            7//#define SQL_DOUBLE          8//#if (ODBCVER >= 0x0300)//#define SQL_DATETIME        9//#endif//#define SQL_VARCHAR         12//#if (ODBCVER >= 0x0300)//#define SQL_TYPE_DATE       91//#define SQL_TYPE_TIME       92//#define SQL_TYPE_TIMESTAMP  93//#endifTIMESTAMP_STRUCT datetime;while (SQLFetch(hstmt1) != SQL_NO_DATA_FOUND){/* 获得数据 */SQLGetData(hstmt1, 1, SQL_C_CHAR, sqlnID, MAXCHAR, &sqlnIDLength);SQLDescribeCol(hstmt1, 3, columnName, 128, &NameLength, &DataType, &columnsize, &dd, &na);SQLGetData(hstmt1, 5, SQL_C_SHORT, &ddd, sizeof(ddd), &sqlnIDLength);SQLGetData(hstmt1, 3, SQL_C_TIMESTAMP, &datetime, sizeof(datetime), &sqlnIDLength);// 参数1为执行语句的句柄,// 参数2为所要得到的数据位于的列数(SQL语句中),// 参数3为数据类型,这个比较多,需要看一下MSDN// 参数4为保存的位置(地址),// 参数5为参数4可用的位置,既然参数3已设定为长整型,所以这里可使用0// 参数6为实际返回的长度}//第二种方式  //绑定参数方式  char a[200] = "bbb";char b[200] = "200";INT64   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);
}

C++中使用ODBC连接SQL Server数据库相关推荐

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

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

  2. dw连接mysql数据库原理_Dreamweaver中连接SQL Server数据库代码

    Adobe Dreamweaver CS3连接ACCESS数据库 "Driver={Microsoft Access Driver (*.mdb)};Uid=;Pwd=;DBQ=" ...

  3. 通过JDBC-ODBC连接SQL Server数据库

    通过JDBC-ODBC连接SQL Server数据库 由于ODBC驱动程序被广泛应用,建立这种桥连接数据库之后,使得JDBC拥有能够访问所有数据库的的能力,这里是实现配置数据库,并测试是否可以通过JD ...

  4. Visual Studio2022连接SQL Server数据库

    Visual Studio2022连接SQL Server数据库 一.软件准备 1. 安装Visual Studio2022 二.环境配置 1. 创建数据库 2. 利用ODBC建立连接 三.连接数据库 ...

  5. python连接sql server数据库(pyodbc)

    用python操作ms sql server,有好几种方法: (1)利用pymssql (2)利用pyodbc 这里讲import pyodbc来操作sql server database. pyod ...

  6. 标签打印软件如何连接SQL Server数据库打印产品标签

    这两天小编遇到有人咨询说自己的产品信息在数据库中,怎么把产品数据导入到标签打印软件中制作成产品标签.其实,实现这个功能是非常简单的,我们可以在标签打印软件中直接连接相关数据库,调用数据库中的产品信息即 ...

  7. QT连接SQL server 数据库

    Qt连接SQL server数据库 由于课程设计需要,需要用qt设计一个界面来操作数据库,在建立数据库连接时,期间遇到各种问题. Qt 连接SQL server数据大致可以概括为下图的三层模型,箭头代 ...

  8. VB.NET连接SQL server数据库解决方案(转载+亲自实践)

    原文来自:http://hi.baidu.com/mwd_3330410/blog/item/ba0ccd240a0902184c088d83.html Microsoft Visual Basic. ...

  9. java连接sql server数据库的代码如何改成连接mysql_连接sqlserver数据库代码

    Sql Server的JDBC测试程序与远程连接 参考文献: 1.MySql与oracle的JDBC测试程序 2.查看sqlserver的端口号 代码示例 在我的机器上安装了多个版本的sqlserve ...

最新文章

  1. 案例_文件下载_代码实现
  2. 联邦学习:保护用户数据隐私
  3. Visual Studio 2010中添加App_Code文件夹注意事项
  4. 技术员联盟win11系统64位专业版镜像v2021.08
  5. .net core + headless chrome实现动态网页爬虫
  6. Visual Studio调试之避免单步跟踪调试模式
  7. 苹果电脑获取Android Studio的发布版SHA1和开发版SHA1
  8. 自建pop邮件服务器,POP是什么?怎样开通?
  9. 5位数的数字黑洞是多少_揭秘数字黑洞6174
  10. HC32F460 浮点运算开启
  11. 不用手机的群控,什么原理
  12. Python 面向对象
  13. windows 10 移动热点无互联网连接
  14. APP系统开发模式一共有哪几种?
  15. 从自身做起 全面提高论坛UEO
  16. 如何下载什刹海街道卫星地图高清版大图
  17. 最新38道JVM面试题,看完读懂轻松收offer,进入大厂非常的easy
  18. LeetCode 675. 为高尔夫比赛砍树
  19. echarts学习1----格式整理以及地图入门
  20. percona-toolkit工具使用介绍

热门文章

  1. 数据包从物理网卡流经 Open vSwitch 进入 OpenStack 云主机的流程
  2. HarmoneyOS实战——原子化服务初体验
  3. java多线程学习笔记--一.多线程的基础知识
  4. GlassFish主配置文件domain.xml介绍
  5. ai是个什么软件,和PS一样么
  6. 苹果真的老了!iphone XR降价跌至6500,与iphone X有很大差距
  7. 数学之美:数学究竟是如何被运用到生活中的?
  8. Task01:熟悉新闻推荐系统的基本流程(代码复现)
  9. ffmpeg mp4切片ts加密
  10. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取)...