Chinaunix首页 | 论坛 | 博客
  • 博客访问: 660669
  • 博文数量: 151
  • 博客积分: 3498
  • 博客等级: 中校
  • 技术积分: 1570
  • 用 户 组: 普通用户
  • 注册时间: 2005-02-28 18:10
文章分类

全部博文(151)

文章存档

2014年(12)

2013年(17)

2012年(17)

2011年(5)

2010年(12)

2009年(2)

2007年(26)

2006年(22)

2005年(38)

分类:

2005-09-04 14:09:07

用ADO 打开带密码的数据库用到了UDL文件,但是多次打开和关闭RECORD居然跑到后面,程序资源耗尽了。

本主题分三部分:1,如何打开带密码的数据库;2、使用打开后的记录集;3、为何出现申请不到资源的情况;4、参考文档。

第一部分:如何打开带密码的MDB数据库。
  1、UDL 文件方法。

       假设access数据库文件client.mdb打开密码是“cxw”。

       第一步:建立udl文件

       在win2000下新建一个文本文件test.txt,然后将文件后缀改为.udl。双击文件打开test.udl出现对话框:
       在对话框中选择数据库的驱动,我们选择access2000的驱动Microsoft Jet 4.0 OLE DB Provider,点击“Next>>”进入如下图所示对话框:
      首先选择数据源文件,点击“...”按钮选择access数据库文件。在Username编辑框中输入用户名Admin(access数据库的用户名是固定的),选中“Blank password”。其他保持默认 值,进入“All”页面:
      在“All”页面选中“Jet OLE DB:Database Password”,点击“Edit Value...”按钮输入access数据库client.mdb的密码“cxw”,点确定退出。再在上图的对话框中选中“Persist Security Info”,点击“Edit Value...”选择false。其他保持默认值。这样udl文件已经设置完毕,我们可以进入“Connection”页面(如图2),在对话框中点击 “Test Connection”可以测试连接是否成功,测试成功就表明udl文件已经成功建立。

      第二步,建立ado连接

      首先在stdafx.h文件中加入:

        #pragma warning (disable: 4146)

        #import "c:Program FilesCommon Filessystemadomsado15.dll"

                    no_namespace rename("EOF", "EndOfFile")
        #pragma warning (default: 4146)

       而且还要注意这段话的位置,要在stdafx.h中所有include语句的后面

      由于ado是com组件,因此在应用程序的开始要初始化com环境:

      ::CoInitialize(NULL);

      然后在需要连接数据库的代码出加入如下代码:

      _ConnectionPtr m_pDBConn;

     m_pDBConn.CreateInstance(__uuidof(Connection));    //创建com对象

     m_pDBConn->ConnectionString ="File Name=c:\mydir\test.udl";
     try{
            m_pDBConn->Open("","","",NULL);
     }catch(_com_error &e){
             //处理异常的代码       
     }
 2、直接密码方法
     CString strSql;
   TCHAR FileName[MAX_PATH],errMsg[MAX_PATH];
  
   ::CoInitialize(NULL); //初始化Com
  
   IADORecordBinding *picRs = NULL;
   _RecordsetPtr pRs("ADODB.Recordset");
   _ConnectionPtr pConn("ADODB.Connection" );
   GetModuleFileName(NULL,FileName,MAX_PATH);
   (_tcsrchr(FileName,'\'))[1] = 0;
  
   lstrcat(FileName,_T("pass.mdb"));
  
   strSql = strSql +
     "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source = " +FileName +
       ";Persist Security Info=False;Jet OLEDB:Database Password=cd;"; 
   try
   {
   pConn->Open((_bstr_t)strSql, "", "", adModeUnknown);
     }
      catch (_com_error &e)
   {
     }

第二部分  使用打开后的记录集
     代码如下:
    void  OpenRecord()
    {
       
      CString sqlSentence = _T("select * from pass");

     pRs.CreateInstance( .....);
   try
   {    
     pRs->Open( (_variant_t)sqlSentence, // 查询DemoTable表中所有字段
     pConn.GetInterfacePtr(), // 获取库接库的IDispatch指针
           adOpenDynamic,
             adLockOptimistic,
               adCmdText);
   
      while(!pRs.eof())
      {
        //read recordset and insert to gui element
       pRs->MoveNext();
      }
     catch (_com_error &e)
   {
  
   pRs->Close();  
   return;
   }
    pRs->Close(); 
    }
 
  然后在定时器函数中间隔一定时间去读记录,
  OnTimer()
  {
    OpenRecord();
  }

第三部分 为何出现申请不到资源的情况
     在WIN98下面运行大概1个小时。
     出现申请不到资源的错误提示,然后程序死掉了!
     1。可能申请内存过后没有释放。
     2。WIN98不支持此种打开数据库的操作方式(多次打开记录机集-》关掉-》打开)
     3。其它原因
     
   但是后来用BCB开发的程序用第一种打开数据库的方法打开带密码的数据库正常工作。
   在WIN98用VC开发的程序就要出现错误,所以在WIN98下留下了一个不解之迷。

第四部分 参考资源
   1、ado方式访问带密码数据库的方法。作者:taianmonkey  出处:CSDN
   2、怎么用ado打开带密码的access数据库。作者:
 
 
      

阅读(1382) | 评论(1) | 转发(0) |
0

上一篇:并口

下一篇:块设备

给主人留下些什么吧!~~