当前位置: 首页 > news >正文

微信网站建设协议seo公司厦门

微信网站建设协议,seo公司厦门,社区网站怎么建,东营市建设工程管理信息网OLEDB 提供了静态绑定和动态绑定两种方式,相比动态绑定来说,静态绑定在使用上更加简单,而在灵活性上不如动态绑定,动态绑定在前面已经介绍过了,本文主要介绍OLEDB中的静态,以及常用的数据类型转化接口。 静…

OLEDB 提供了静态绑定和动态绑定两种方式,相比动态绑定来说,静态绑定在使用上更加简单,而在灵活性上不如动态绑定,动态绑定在前面已经介绍过了,本文主要介绍OLEDB中的静态,以及常用的数据类型转化接口。

静态绑定

之前的例子都是根据返回的COLUMNINFO结构来知晓数据表中各项的具体信息,然后进行绑定操作,这个操作由于可以动态的针对不同的数据类型绑定为不同的类型,因此称之为动态绑定。动态绑定是建立在我们对数据库中表结构一无所知,而又需要对数据库进行编程,但是一般在实际的项目中开发人员都是知道数据库的具体结构的,而且一旦数据库设计好了后续更改的可能性也不太大,因此可以采取静态绑定的方式来减少编程的复杂度。
在进行静态绑定时,一般针对每个数据库表结构定义一个结构体用来描述表的各项数据,然后利用结构体的偏移来绑定到数据库中。

数据关系对应表

一般静态绑定需要将数据库表的各项数据与结构体中的成员一一对应,这个时候就涉及到数据库数据类型到C/C++中数据类型的转化,下表列举了常见的数据库类型到C/C++数据类型的转化关系

数据库类型OLEDB 类型C/C++类型
binaryDBTYPE_BYTES/DBTYPE_IUNKNOWNBYTE[length]/BLOB
varbinaryDBTYPE_BYTES/DBTYPE_IUNKNOWNBLOB
bitDBTYPE_BOOLVARIANT_BOOL
charDBTYPE_STRchar[length]
varcharDBTYPE_STRchar[length]
nvarcharDBTYPE_WSTRwchar_t[length]
ncharDBTYPE_WSTRwchar_t[length]
textDBTYPE_STR/DBTYPE_IUNKNOWNBLOB
imageDBTYPE_BYTES/DBTYPE_IUNKNOWNBLOB
ntextDBTYPE_WSTR/DBTYPE_IUNKNOWNBLOB
tinyintDBTYPE_UI1BYTE
smallintDBTYPE_I2SHORT
intDBTYPE_I4LONG
bigintDBTYPE_I8LARGE_INTEGER
realDBTYPE_R4float
floatDBTYPE_R8double
moneyDBTYPE_CYLARGE_INTEGER
numericDBTYPE_NUMERICtypedef struct tagDB_NUMERIC {
    BYTE precision;
    BYTE scale;
    BYTE sign;
    BYTE val[16];
} DB_NUMERIC;
decimalDBTYPE_NUMERICtypedef struct tagDB_NUMERIC {
    BYTE precision;
    BYTE scale;
    BYTE sign;
    BYTE val[16];
} DB_NUMERIC;
sysnameDBTYPE_WSTRwchar_t[length]
datetimeDBTYPE_DBTIMESTAMPtypedef struct tagDBTIMESTAMP {
    SHORT year;
    USHORT month;
    USHORT day;
    USHORT hour;
    USHORT minute;
    USHORT second;
    ULONG fraction;
}DBTIMESTAMP;
timestampDBTYPE_BYTESBYTE[length]
uniqueidentifierDBTYPE_GUIDGUID

实例

下面是一个静态绑定的例子

//静态绑定的结构
typedef struct _tag_DBSTRUCT
{DBSTATUS dbCodeStatus;ULONG uCodeLength;int nCode;DBSTATUS dbNameStatus;ULONG uNameLength;WCHAR szName[NAME_LENGTH];
}DBSTRUCT, *LPDBSTRUCT;dbBindings[0].bPrecision = 0;dbBindings[0].bScale = 0;dbBindings[0].cbMaxLen = sizeof(int);dbBindings[0].dwMemOwner = DBMEMOWNER_CLIENTOWNED;dbBindings[0].dwPart = DBPART_STATUS | DBPART_LENGTH | DBPART_VALUE;dbBindings[0].iOrdinal = pdbColumnInfo[0].iOrdinal;dbBindings[0].obStatus = offsetof(DBSTRUCT, dbCodeStatus);dbBindings[0].obLength = offsetof(DBSTRUCT, uCodeLength);dbBindings[0].obValue = offsetof(DBSTRUCT, nCode);dbBindings[0].wType = DBTYPE_I4;dbBindings[1].bPrecision = 0;dbBindings[1].bScale = 0;dbBindings[1].cbMaxLen = sizeof(WCHAR) * NAME_LENGTH;dbBindings[1].dwMemOwner = DBMEMOWNER_CLIENTOWNED;dbBindings[1].dwPart = DBPART_STATUS | DBPART_LENGTH | DBPART_VALUE;dbBindings[1].iOrdinal = pdbColumnInfo[1].iOrdinal;dbBindings[1].obStatus = offsetof(DBSTRUCT, dbNameStatus);dbBindings[1].obLength = offsetof(DBSTRUCT, uNameLength);dbBindings[1].obValue = offsetof(DBSTRUCT, szName);dbBindings[1].wType = DBTYPE_WSTR;hRes = pIAccessor->CreateAccessor(DBACCESSOR_ROWDATA, 2, dbBindings, 0, &hAccessor, NULL);pdbStruct = (DBSTRUCT*)COM_ALLOC(sizeof(DBSTRUCT) * cRows);while (TRUE){hRes = pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, cRows, &cRowsObtained, &prghRows);if (hRes != S_OK && cRowsObtained == 0){break;}ZeroMemory(pdbStruct, sizeof(DBSTRUCT) * cRows);for (int i = 0; i < cRowsObtained; i++){hRes = pIRowset->GetData(prghRows[i], hAccessor, &pdbStruct[i]);if (!FAILED(hRes)){COM_PRINTF(_T("%012d\t%s\n"), pdbStruct[i].nCode, pdbStruct[i].szName);}}pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL);}

我们针对之前的行政区表来进行演示,在这个表中我们只查询其中的两列数据,与之前的例子相似,针对每列定义3项数据,分别是状态,长度和真实的数据,在绑定的时候就不需要计算总体需要内存的大小,行内存大小就是结构体的大小,在绑定的时候我们结构体成员在结构体中的偏移作为返回数据时各项在缓冲中的偏移。而在访问数据时就需要自己计算偏移,直接使用结构体中的成员即可。
从上面的例子,我总结了静态绑定和动态绑定之间的差别:

  1. 其实从本质上将动态绑定和静态绑定没有区别,都是分配一段缓冲作为行集的缓冲,然后在使用的时候进行偏移的计算
  2. 静态绑定是利用我们提前知道数据库的结构,实现通过结构体来安排各项在缓冲中的偏移所占内存的大小。
  3. 动态绑定中所有成员的分配和所占内存大小都是根据COLUMNINFO结构事后动态分配的,需要自己计算偏移。
  4. 相比于动态绑定来说,静态绑定不需要获取数据库的各项的属性信息,不需要自己计算各项的偏移,相对比较简单,适用于事先知道数据库的表结构,使用相对固定,一旦数据库结构改变就需要改变代码
  5. 动态绑定可以适用于几乎任何情形,可扩展性强,几乎不需要考虑数据库表结构变更问题。代码灵活,但是需要自己计算偏移,自己分配管理内存,相对来说对程序员的功力要求更高一些。

数据类型转化

数据库中数据类型繁多,而对应到具体的编程语言上有不同的展示方式,具体的语言中对同一种数据库类型有不同的数据类型对应,甚至有的可能并没有什么类型可以直接对应,这就涉及到一个从数据库数据类型到具体编程语言数据类型之间进行转换的问题,针对这一问题OLEDB提供了一个接口——IDataConvert
一般情况下任何数据类型都可以转化为相应格式的字符串,而对应的字符串又可以反过来转化为数据库中相应的数据类型。当然一些特殊转换也是允许的,比如:整型数据间的转换,浮点数间的转换等。这也是使用这个数据转化接口的主要原则。

数据转换接口的使用

  1. 使用COM标准的方式创建IDataConver接口(调用CreateInstance函数传入CLSID_OLEDB_CONVERSIONLIBRARY创建一个IID_IDataConvert接口)
  2. 接着调用该接口的DataConvert方法可以进行数据转化
  3. 调用接口的CanConvert可以知道两种数据类型之间能否进行转化。
  4. 调用GetConversionSize可以知道源数据类型转化为指定类型时需要的缓冲大小。

实例

这个例子相对比较简单,就简单的在之前打印数据库数据中加了一句转化为字符串的操作,然后打印,就不在文中展示了,具体的例子见我放到码云中的代码片段

例子代码:

  1. 静态绑定
  2. 数据类型转化

转载于:https://www.cnblogs.com/lanuage/p/8964617.html

http://www.lbrq.cn/news/2542537.html

相关文章:

  • 询价网站哪个好电子商务专业就业方向
  • 青海省公路工程建设信息网站网站搭建模板
  • 网站建设之织梦后台熊掌号主页新网站seo外包
  • 河南旅游网站建设企业网站的类型
  • fomo3d 网站怎么做深圳网络推广营销公司
  • 绍兴的网站建设公司品牌推广的目的和意义
  • 华为认证培训机构排行榜seo联盟
  • 苏州城乡和住房建设局网站首页百度云网盘网页版
  • 黄冈网站免费投放平台免费下载合肥做网站推广
  • 网站正在建设中......小程序seo推广技巧
  • 重点专业建设网站 建设方案长沙网站制作推广
  • 做网站学哪方面知识如何建立网站
  • 什么是网络社交郑州seo多少钱
  • 在线做图表的网站百度seo费用
  • 东昌网站建设网店代运营靠谱吗
  • 模特公司网站源码百度网址大全网站大全
  • 免费印章在线制作免费seo网站优化工具
  • 品牌官方网站建设快速排名优化系统
  • 网站建设-易速通科技一站式海外推广平台
  • 怎么做企业功能网站友情链接图片
  • 必应收录提交入口邯郸seo优化
  • 房地产新闻最近怎么进行网站关键词优化
  • 网站制作哪家公司好写软文平台
  • 网站开发预算编制常见的搜索引擎
  • 靓号注册网站免费seo推广优化公司哪家好
  • 做网站还是微信小程序百度24小时人工电话
  • 北京网站设计公司哪家公司好互联网
  • wordpress+3.2.1漏洞seo优化技巧有哪些
  • 学校门户网站功能外贸平台排名
  • 咖啡网站建设市场分析一个新产品策划方案
  • 【Django】-4- 数据库存储和管理
  • 从零打造大语言模型--处理文本数据
  • Python中元组,字典,集合的易错题(含解析)
  • C# 中抽象类、密封类、静态类和接口的区别
  • Django模型查询与性能调优:告别N+1问题
  • 计算机(电脑)是什么?零基础硬件软件详解