关键字:、人大金仓、KingbaseES、oledb
- 概述
现在应用系统中数据分布在不同的地方并且有着不同的格式,为了能够提高数据的实时性、空间资源的利用和访问效率,微软公司提出一种一致数据访问技术(UDA),使得应用通过同一的接口来访问不同的数据。UDA技术包括OLEDB(Object Linking and Embedding Database)与ADO(ActiveX Data Object)两层标准接口,OLEDB是系统级的编程接口,定义了一组封装了各种数据系统访问操作的COM接口以及一组用于查询、缓存、数据更新、事务处理等操作的标准服务组件。ADO是应用层的编程接口,其通过OLEDB的提供的COM接口访问数据库。因此,在后续的OLEDB的应用开发中是通过编写ADO应用程序来使用OLEDB接口来进行数据库的访问。
由于KingbaseES OLEDB 驱动(KbOleDb.dll)是基于libkci库的,因此需要将libkci的动态库及其所依赖的动态库等都复制到KbOleDb.dll文件所在的目录下。KingbaseES OLEDB驱动的安装是通过使用windows操作系统附带的注册组件的命令程序“regsvr32”(由于KbOleDb.dll为32位的驱动,因此必须是使用“regsvr32”)进行注册安装。
- 使用组合键“Win+R”调出Windows系统的“运行”对话框,如下所示:
- 在对话框中输入命令“regsvr32 KbOleDb.dll”, 若没有将KbOleDb.dll与其依赖的库文件拷贝到“C:\Windows\System32”,则需要补充KbOleDb.dll驱动文件所在的路径。如下示例中没有将将KbOleDb.dll与其依赖的库文件拷贝到“C:\Windows\System32”:
在将上述命令填写完整后可通过点击“确定”按钮进行注册,若出现如下所示错误,可能有两种情况:
- KbOleDb.dll驱动所在的路径有误,重新修改驱动所在路径后再进行注册即可;
- KbOleDb.dll驱动所依赖的动态库文件与KbOleDb.dll驱动没有在同一路径下,将依赖的动态库复制到KbOleDb.dll驱动所在路径即可。若不知道驱动所依赖的动态库有哪些,可利用软件“depends”查看KbOleDb.dll所依赖的动态库包含那些,;
若出现如下界面便表示驱动注册成功。
同样是利用“regsvr32”实现的,在使用“Win+R”调出“运行”对话框后,在注册驱动的命令中加入一个“/u”选项,表示卸载,完整命令“regsvr32 /u KbOleDb.dll”,如下表示驱动卸载成功。
ADO是一组Windows的标准件,有微软公司提供,不需要再另外安装。如下使用Visual Studio 2013创建OLEDB工程并进行开发:
1.创建工程: 打开Visual Studio 2013后,点击“文件-新建-项目”并选择如下的VB-windows桌面-windows窗体应用程序。
2.添加button:点击左侧的“工具箱”找到“button”后拖拽添加到form中,若没有工具箱选项可在视图-工具箱进行打开。
3.添加引用:在项目上右击,找到“添加-引用”后(如下), 即可打开“应用管理器”。
下图中为打开的“应用管理器”选择“扩展”选项后便可看到“ADODB”,选择任意一个后点击“确定”按钮即可。
4.应用编程:双击步骤2中添加的button按钮打开VB编辑界面。ADO的编程流程主要为:
1)声明对象:如下声明了一个连接对象和一个记录集对象;
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
ADO中共有7个对象,连接对象(Connection)、命令对象(Command)、记录集对象(Recordset)、字段对象(Field)、参数对象(Parameter)、错误对象(Error)以及属性对象(Property)。
连接对象:用于与数据库建立连接、常用的方式有Open(打开)和Close(关闭);
错误对象:依赖于连接对象,如果发生错误,会将错误信息保存到连接对象的Errors集合中;
命令对象:执行命令操作,数据的查询、修改、添加和删除;
参数对象:依赖于命令对象,用于为参数查询提供数据;
记录集对象:保存来自表或命令对象返回的结果;
字段对象:依赖于记录集对象,可以使用Fields集合来获取记录集中的每个字段信息;
属性对象:每个连接、命令及字段对象都有一个属性对象集合。使用属性对象可以访问特定对象的主要信息。
2)连接数据源:
新建连接:
cn = New ADODB.Connection
设置连接串:
cn.ConnectionString = "Provider=KingbaseES.1; Data Source=10.10.12.252; User ID=system; Password= 123; Location=kingbase; port=65432"
连接串设置 | ||
关键字(区分大小写) | 解释 | 备注 |
Provider | 驱动提供者 | 该关键字的值仅为如下三个: "KingbaseES" "KingbaseES.1" "KingbaseES OLE DB Provider" (必须提供) |
Data Source | 服务器地址 | (必须提供) |
Location | 连接的“database”名字 | (必须提供) |
User ID | 连接的用户名 | (必须提供) |
Password | 连接的密码 | (必须提供) |
Connect Timeout | 连接超时时间 | (非必须) |
Extended Properties | 扩展属性 | (非必须) |
port | 端口号 | (必须提供) |
连接串在设置时,关键字与值使用“=”连接,不同关键字使用“;”分隔,如下为连接串示例如上述“cn.ConnectionString”。
打开连接:
cn.Open()
3)数据操作:
声明String保存sql语句:
Dim slct As String
slct = "select * from test order by id;"
执行sql语句:
cn.Execute(create)
显示查询结果:将查询结果保存到记录集对象中,而后使用字段对象进行显示。
rs = cn.Execute(slct)
4)终止连接:
cn.Close()
'声明连接对象与记录集对象
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim create As String
Dim insert1 As String
Dim insert2 As String
Dim insert3 As String
Dim delete As String
Dim update As String
Dim slct As String
Dim drop As String
Dim result As String
'对变量赋值
create = "create table test(id int primary key, name varchar(20) not null, age int, marital bool, salary float);"
insert1 = "insert into test values(1, 'Bryce', 25, false, 5000.1);"
insert2 = "insert into test values(2, 'Judi', 23, false, 3500.5);"
insert3 = "insert into test values(3, 'Mike', 28, true, 9000.5);"
delete = "delete from test where id = 1;"
update = "update test set salary = 4000 where id = 2;"
slct = "select * from test order by id;"
drop = "drop table test;"
'连接数据库
MsgBox("******************** TEST OLEDB ********************" & vbCrLf & _
"Connect to database:" & vbCrLf & _
"Provider=KingbaseES.1; Data Source=10.10.12.252; User ID=hwj; Password= 123; Location=hwjbase; port=65432")
cn = New ADODB.Connection
cn.ConnectionString = "Provider=KingbaseES.1; Data Source=10.10.12.252; User ID=hwj; Password= 123; Location=hwjbase; port=65432"
cn.Open()
'创建表并插入数据
MsgBox("*****************************************************" & vbCrLf & _
"Create table and make data:" & vbCrLf & _
insert1 & vbCrLf & insert2 & vbCrLf & insert3)
cn.Execute(create)
cn.Execute(insert1)
cn.Execute(insert2)
cn.Execute(insert3)
'删除数据
MsgBox("*****************************************************" & vbCrLf & _
"Delete:" & vbCrLf & _
delete)
cn.Execute(delete)
'修改数据
MsgBox("*****************************************************" & vbCrLf & _
"Update:" & vbCrLf & _
update)
cn.Execute(update)
'查询数据
result = "*****************************************************" & vbCrLf & _
"Select:" & vbCrLf & _
slct & vbCrLf & _
"id" & vbTab & "name" & vbTab & "age" & vbTab & "marital" & vbTab & "salary" & vbCrLf & _
"----------------------------------------" & vbCrLf
rs = cn.Execute(slct)
While Not rs.EOF
result = result & rs.Fields(0).Value & vbTab & rs.Fields(1).Value & vbTab & rs.Fields(2).Value & vbTab & rs.Fields(3).Value & vbTab & rs.Fields(4).Value & vbCrLf
rs.MoveNext()
End While
rs.Close()
MsgBox(result)
'删除表
cn.Execute(drop)
'断开数据库连接
cn.Close()
MsgBox("disconnct from database.")