Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14497560
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:54:16

下载本文示例代码
  在使用VC开发应用软件的时候,经常需要进行数据库操作,可是VC操作数据库实在比较麻烦,而VB编制数据库软件却十分方便快捷,有什么办法可以让VC编制数据库软件也这么轻松呢?     在工作中,本人需要从串口接收数据并保存到数据库中,如果直接由VC调用ADO组件进行数据库访问、操作,比较麻烦,因此我想利用VB使用ADO组件的方便以及微软的COM接口由VC调用VB完成任务,经过资料查找,发现大部分都是关于如何使用VC制作控件或者DLL后从VB进行调用的,很少关于VB制作ACTIVEX DLL由VC进行调用的文章,在此本人将结合实例说明如何用VB制作一个操作数据库的ACTIVEX DLL,再在VC调用该DLL,从而使得VC方便的使用ADO技术操作数据库。  一、 制作VB数据库访问ACTIVEX DLL  1、首先使用VB6.0创建一个心得ACTIVEX DLL工程,将工程命名为prjado、将类命名为clsado。  2、为工程添加ADO对象库的引用。工程->引用:Microsoft ActiveX Data Objects2.0 Library  3、为类增加两个新的变量: Dim con As New ADODB.Connection '定义ADO会话连接对象Dim cmd As New ADODB.Command '定义ADO命令对象  4、增加初始化函数 Public Function ado_Init() con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=True;Data Source=sms.mdb" cmd.ActiveConnection = conEnd Function  建立到数据源的物理连接  指定Command对象当前所属的 Connection 对象。  5、数据库操作函数 Public Function ado_add(ByVal strdata As String) cmd.CommandText = "insert into comdata (timm,datt) values ('" (Format(Date, "YYYY-MM-DD ")) Str((Time)) "','" (strdata) "')" cmd.ExecuteEnd Function  将参数保存到SMS.MDB的COMDATA表中  注意:函数声明时必须指定参数是传值(ByVal),否则VB默认为按地址传递(ByRef)  6、连接关闭函数 Public Function ado_UnInit() con.Close Set cmd = Nothing Set con = NothingEnd Function  关闭连接并且释放对象。  保存工程,编译prjado.dll,这就是我们的服务组件,它完成了调用ADO对象实现对数据库操作的功能。  二、在VC程序中调用服务组件  1、运行VC 6.0,使用MFC程序向导创建一个新的基于对话框的MFC应用程序。  2、使用#import导入服务组件,拷贝PRJADO.DLL到VC工程目录,打开STDAFX.H文件增加如下代码: # import "prjado.dll"using namespace prjado; 这段代码应该放置在file://{{AFX_INSERT_LOCATION}}// Microsoft Visual C will insert additional declarations immediately 之后和#endif 之前。  在stdafx.h文件导入dll能够让编译器在运行时连接dll的类型库,#import它能够自动产生一个对GUIDs的定义,同时自动生成对clsado对象的封装。同时能够列举它在类中所能找到的类型, VC 会在编译的时候自动生成两个文件:  一个头文件(.tlh),它包含了列举的类型和对类型库中对象的定义;  一个实现文件(.tli)对类型库对象模型中的方法产生封装。  Namespace(名字空间)用来定义一个名字空间,使用unsing就可以将当前的类型上下文转换名字空间所定地,让我们可以访问服务组件的方法。  如果我们修改了服务组件程序,建议删除这两个文件后重新完整编译工程,以便让编译器重新列举类的属性以及函数。  3、在对话框中新添加一按钮,标题设为"测试"。双击"测试"按钮,系统提示新建一函数OnButton1对应于该按钮的CLICK事件。OnButton1函数的具体代码如下 HRESULT hresult;CLSID clsid;CoInitialize(NULL); file://初始化COM接口hresult=CLSIDFromProgID(OLESTR("prjado.clsado"), &clsid); file://得到组件的CLSID _clsado *t; file://这就是我们在PRJADO.DLL中定义的类hresult=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(_clsado),(LPVOID *) &t);file://初始化CLSADO,CoCreateInstance()的第一个参数是对象的CLSID(类代码),这个128位的编码唯一地标识了组件服务,它的路径和运行参数等信息都放在系统注册表中;第二个参数一般情况下设为NULL;第三个参数用来指明对象的运行环境,如远程或本地,此处设为CLSCTX_INPROC_SERVER,标明是服务组件是一个DLL;第四个参数指明用来与对象通信接口的ID,这也是一个128位的编码;第五个参数是用来接收对象的接口指针。if(FAILED(hresult)){AfxMessageBox("初始化服务组件失败");return;} file://如果初始化失败,弹出提示对话框后退出程序t->ado_Init() ; file://调用初始化函数t->ado_add("从VC调用组件") ; file://调用增加记录函数t->ado_UnInit ();file://调用关闭连接函数t->Release(); file://释放接口指针CoUninitialize(); // 关闭COM库的联接AfxMessageBox("调用服务组件完成");  保存工程后编译运行VC 程序,点击"测试"按钮,等待完成提示后,我们打开数据库就可以看到刚才添加的记录了。  结语:  综上所述,在实际的应用程序开发中,利用组件技术,我们可以进行VC和VB混合编程,充分地发挥开发工具的优势,可以很好地加快软件的开发进度,并且极大的改善程序的可维护性和可用性。   在使用VC开发应用软件的时候,经常需要进行数据库操作,可是VC操作数据库实在比较麻烦,而VB编制数据库软件却十分方便快捷,有什么办法可以让VC编制数据库软件也这么轻松呢?     在工作中,本人需要从串口接收数据并保存到数据库中,如果直接由VC调用ADO组件进行数据库访问、操作,比较麻烦,因此我想利用VB使用ADO组件的方便以及微软的COM接口由VC调用VB完成任务,经过资料查找,发现大部分都是关于如何使用VC制作控件或者DLL后从VB进行调用的,很少关于VB制作ACTIVEX DLL由VC进行调用的文章,在此本人将结合实例说明如何用VB制作一个操作数据库的ACTIVEX DLL,再在VC调用该DLL,从而使得VC方便的使用ADO技术操作数据库。  一、 制作VB数据库访问ACTIVEX DLL  1、首先使用VB6.0创建一个心得ACTIVEX DLL工程,将工程命名为prjado、将类命名为clsado。  2、为工程添加ADO对象库的引用。工程->引用:Microsoft ActiveX Data Objects2.0 Library  3、为类增加两个新的变量: Dim con As New ADODB.Connection '定义ADO会话连接对象Dim cmd As New ADODB.Command '定义ADO命令对象  4、增加初始化函数 Public Function ado_Init() con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=True;Data Source=sms.mdb" cmd.ActiveConnection = conEnd Function  建立到数据源的物理连接  指定Command对象当前所属的 Connection 对象。  5、数据库操作函数 Public Function ado_add(ByVal strdata As String) cmd.CommandText = "insert into comdata (timm,datt) values ('" (Format(Date, "YYYY-MM-DD ")) Str((Time)) "','" (strdata) "')" cmd.ExecuteEnd Function  将参数保存到SMS.MDB的COMDATA表中  注意:函数声明时必须指定参数是传值(ByVal),否则VB默认为按地址传递(ByRef)  6、连接关闭函数 Public Function ado_UnInit() con.Close Set cmd = Nothing Set con = NothingEnd Function  关闭连接并且释放对象。  保存工程,编译prjado.dll,这就是我们的服务组件,它完成了调用ADO对象实现对数据库操作的功能。  二、在VC程序中调用服务组件  1、运行VC 6.0,使用MFC程序向导创建一个新的基于对话框的MFC应用程序。  2、使用#import导入服务组件,拷贝PRJADO.DLL到VC工程目录,打开STDAFX.H文件增加如下代码: # import "prjado.dll"using namespace prjado; 这段代码应该放置在file://{{AFX_INSERT_LOCATION}}// Microsoft Visual C will insert additional declarations immediately 之后和#endif 之前。  在stdafx.h文件导入dll能够让编译器在运行时连接dll的类型库,#import它能够自动产生一个对GUIDs的定义,同时自动生成对clsado对象的封装。同时能够列举它在类中所能找到的类型, VC 会在编译的时候自动生成两个文件:  一个头文件(.tlh),它包含了列举的类型和对类型库中对象的定义;  一个实现文件(.tli)对类型库对象模型中的方法产生封装。  Namespace(名字空间)用来定义一个名字空间,使用unsing就可以将当前的类型上下文转换名字空间所定地,让我们可以访问服务组件的方法。  如果我们修改了服务组件程序,建议删除这两个文件后重新完整编译工程,以便让编译器重新列举类的属性以及函数。  3、在对话框中新添加一按钮,标题设为"测试"。双击"测试"按钮,系统提示新建一函数OnButton1对应于该按钮的CLICK事件。OnButton1函数的具体代码如下 HRESULT hresult;CLSID clsid;CoInitialize(NULL); file://初始化COM接口hresult=CLSIDFromProgID(OLESTR("prjado.clsado"), &clsid); file://得到组件的CLSID _clsado *t; file://这就是我们在PRJADO.DLL中定义的类hresult=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(_clsado),(LPVOID *) &t);file://初始化CLSADO,CoCreateInstance()的第一个参数是对象的CLSID(类代码),这个128位的编码唯一地标识了组件服务,它的路径和运行参数等信息都放在系统注册表中;第二个参数一般情况下设为NULL;第三个参数用来指明对象的运行环境,如远程或本地,此处设为CLSCTX_INPROC_SERVER,标明是服务组件是一个DLL;第四个参数指明用来与对象通信接口的ID,这也是一个128位的编码;第五个参数是用来接收对象的接口指针。if(FAILED(hresult)){AfxMessageBox("初始化服务组件失败");return;} file://如果初始化失败,弹出提示对话框后退出程序t->ado_Init() ; file://调用初始化函数t->ado_add("从VC调用组件") ; file://调用增加记录函数t->ado_UnInit ();file://调用关闭连接函数t->Release(); file://释放接口指针CoUninitialize(); // 关闭COM库的联接AfxMessageBox("调用服务组件完成");  保存工程后编译运行VC 程序,点击"测试"按钮,等待完成提示后,我们打开数据库就可以看到刚才添加的记录了。  结语:  综上所述,在实际的应用程序开发中,利用组件技术,我们可以进行VC和VB混合编程,充分地发挥开发工具的优势,可以很好地加快软件的开发进度,并且极大的改善程序的可维护性和可用性。 下载本文示例代码


VC的另类数据库编程VC的另类数据库编程VC的另类数据库编程VC的另类数据库编程VC的另类数据库编程VC的另类数据库编程VC的另类数据库编程VC的另类数据库编程VC的另类数据库编程VC的另类数据库编程VC的另类数据库编程VC的另类数据库编程VC的另类数据库编程VC的另类数据库编程VC的另类数据库编程
阅读(81) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~