bokee.net

电子/电气工程师博客

正文 更多文章

再谈通过VC编程修改注册表配置ODBC数据源

            再谈通过VC编程修改注册表配置ODBC数据源
                                      王佰营 徐丽红
                        www.wbymcs51.blog.bokee.net
   在“VC编程配置ODBC数据源”一文中,用修改注册表配置ODBC数据源时,
用系统提供的(管理工具à数据源 (ODBC))odbcad32.exe观看时,总是不
显示描述字符和数据库文件的路径;虽然通过VC应用程序调用数据库时一
切正常,但总有个心病;为什么用使用SQLConfigDataSource函数和手工配
置就正常呢?
  为此查了好多资料,试了许多次都未能解决?最后,想到模仿手工配置的
方法,那手工又配置注册表那些项呢?就用RegEdit.exe看注册表手工配置
前后的变化,试了很多次不行,就改用注册表快照软件RegSnap.exe很好地
解决了问题。
  在没配置数据源前拍个快照,手工配置(见下图)好后,再拍个快照(均选
用生成所有项目的快照),将两个快照比较;
     
  用RegSnap比较结果如下:
 新增的主键:(主要部分)
 ::::::::::::::::::::::::::::::::
  HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources\WBY-WBY
  键值: 字符串: "Microsoft Access Driver (*.mdb)"
  HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\
  HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\DBQ
  键值: 字符串: "E:\zzz.mdb"
  HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\Description
  键值: 字符串: "WBY-TEST"
  HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\Driver
  键值: 字符串: "C:\WINDOWS\system32\odbcjt32.dll"
  HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\DriverId
  键值: DWORD: 25 (0x19)
  HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\Engines\
  HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\Engines\Jet\
  HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\Engines\Jet\ImplicitCommitSync
  键值: 字符串: ""
  HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\Engines\Jet\MaxBufferSize
  键值: DWORD: 2048 (0x800)
  HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\Engines\Jet\PageTimeout
  键值: DWORD: 5 (0x5)
  HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\Engines\Jet\Threads
  键值: DWORD: 3 (0x3)
  HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\Engines\Jet\UserCommitSync
  键值: 字符串: "Yes"
  HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\FIL
  键值: 字符串: "MS Access;"
  HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\SafeTransactions
  键值: DWORD: 0 (0)
  HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\UID
  键值: 字符串: ""
   按此比较结果,编程序如下:
//通过修改注册表配置数据源按钮
void CReg_ODBCDlg::OnButChhk()
{

 char szFilter[] = _T("DBSE Files (*.mdb;*.mdb)|*.mdb;*.mdb|All Files (*.*)|*.*||");
 char lpstrCustomFilter[255]={"Previous Filter\0*.mdb\0"};
 CMyFileDialog dlg(
  TRUE,    //TRUE=File Open, FALSE=File Save As
  _T(".log"),   //default filename extension
  "",    //initial filename in edit box
  //functionality flags
  OFN_ALLOWMULTISELECT|   //allow multiple files to be selected

  //custom template flags
  OFN_ENABLETEMPLATE |   // you will be supplying your own custom dialog box template
  0,
  szFilter,   //file filter
  NULL);    // parent window

 // set an initial directory
 char lpszInitDir[]={"c:\\temp"};
 dlg.m_ofn.lpstrInitialDir=lpszInitDir;

 //set the dialog’s title
 char lpszTitle[]={"打开数据源文件"};
 dlg.m_ofn.lpstrTitle=lpszTitle;

 // retain the customer’s last file filter selection
 dlg.m_ofn.lpstrCustomFilter=lpstrCustomFilter;
 dlg.m_ofn.nMaxCustFilter=255;

 // if OFN_ENABLETEMPLATE is set, define the custom dialog template here
 dlg.m_ofn.lpTemplateName=MAKEINTRESOURCE(IDD_MYFIL_DLOG);

 // open file dialog and get file name(s)
 if (dlg.DoModal()==IDOK)
 {
  CString strDSName=dlg.GetRegDBName();  //要创建的数据源名
  CString strDBPath=dlg.GetPathName();  //数据库文件存放路径
  CString strDescription=dlg.GetDBDescription(); //数据源的描述字符串
  if(strDSName.IsEmpty())
  {
   AfxMessageBox(_T("未输入要创建的数据源名!"));
   return;
  }
  if(strDBPath.IsEmpty())
  {
   AfxMessageBox(_T("未输入数据库文件路径!"));
   return;
  }
  if(strDescription.IsEmpty())
  {
   AfxMessageBox(_T("未输入数据源的描述字符串!\r将用要创建的数据源名称代替!"));
   strDescription = strDSName;
  }

  RegisterDBSource(strDSName,strDBPath,strDescription); 
 }
}

//通过修改注册表配置数据源成员函数;

bool CReg_ODBCDlg::RegisterDBSource(CString strDSName, CString strDBPath,CString strDescription)
{
 //strDSName是要创建的数据源名
 //strDBPath是数据库存放路径
 //strDescription是数据源的描述字符串

  if(strDSName.IsEmpty())
  {
  AfxMessageBox(_T("未输入要创建的数据源名称!"));
  return false;
  }
  if(strDBPath.IsEmpty())
  {
  AfxMessageBox(_T("未指定数据库存放路径!"));
  return false;
  }

 char sysDir[MAX_PATH];
 char drvName[]="\\odbcjt32.dll";
 ::GetSystemDirectory(sysDir,MAX_PATH);
 strcat(sysDir,drvName);
 CFileFind findFile;

 if(!findFile.FindFile(sysDir))
 {
  AfxMessageBox("          无法加载该类数据源!\r该机未装MSAccess的ODBC驱动程序odbcjt32.dll!",
             MB_OK|MB_ICONSTOP);
  return false;
 }

 HKEY hKey;
  DWORD dwMy;
  CString strMy;

  CString strBaseKey = _T("Software\\ODBC\\ODBC.INI");
  CString strMid = strBaseKey + _T("\\ODBC Data Sources") ;

  CString strDataSource = strBaseKey + _T("\\") + strDSName;

  CString strdbDrive = _T("Microsoft Access Driver (*.mdb)");

  //HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources\WBY-WBY
  //键值: 字符串: "Microsoft Access Driver (*.mdb)"
     //获取数据源键值句柄---1
  RegCreateKeyEx(HKEY_CURRENT_USER,
     strMid,//"SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources"
     0,
     NULL,
     REG_OPTION_NON_VOLATILE,
     KEY_ALL_ACCESS,
     NULL,
     &hKey,
     &dwMy );

  RegSetValueEx( hKey,
     strDSName,//MY_DBOC_DB
     0,
     REG_SZ,//"Microsoft Access Driver (*.mdb)"
     (const unsigned char *)((LPCTSTR)strdbDrive),
     strlen((LPCTSTR)strdbDrive)+1);
 RegCloseKey(hKey);


    //创建数据源子键-------3
 // HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\//
 RegCreateKeyEx(HKEY_CURRENT_USER,
     strDataSource,//"SOFTWARE\\ODBC\\ODBC.INI\\MY_ODBC_DB"
     0,
     NULL,
     REG_OPTION_NON_VOLATILE,
     KEY_ALL_ACCESS,
     NULL,
     &hKey,
     &dwMy);

 //HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\DBQ
 //键值: 字符串: "e:\zzz.mdb"
     //数据库表的全路径-----4
  RegSetValueEx( hKey,
     _T("DBQ"),
     0,
     REG_SZ,//D:\\students.mdb
     (const unsigned char *)((LPCTSTR)strDBPath),
     strlen((LPCTSTR)strDBPath)+1);

  //HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\Description
  //键值: 字符串: "WBY-TEST"
  RegSetValueEx( hKey,
     "Description",
     0L,
     REG_SZ, //
     (CONST BYTE*)((LPCTSTR)strDescription),
     strDescription.GetLength());

 //HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\Driver
 //键值: 字符串: "C:\WINDOWS\system32\odbcjt32.dll"
      //ODBC驱动的全路径----5
   RegSetValueEx(hKey,
     _T("Driver"),
     0,
     REG_SZ,//C:\\windows\\system32\\odbcjt32.dll
     (const unsigned char *)((LPCTSTR)sysDir),
     strlen((LPCTSTR)sysDir)+1);

 //HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\FIL
 //键值: 字符串: "MS Access;"
     //表的类型-------------6?
  strMy=_T("MS Access;");
  RegSetValueEx( hKey,
     _T("FIL"),
     0,
     REG_SZ,//"Ms Access"
     (const unsigned char *)((LPCTSTR)strMy),
     strlen((LPCTSTR)strMy)+1);

 //HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\UID
 //键值: DWORD: 25 (0x19)
     //必须项---------------7?
     strMy=_T("");
  RegSetValueEx( hKey,
     _T("UID"),
     0,
     REG_SZ,
     (const unsigned char *)((LPCTSTR)strMy),
     strlen((LPCTSTR)strMy)+1);

 //HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\DriverId
 //键值: DWORD: 25 (0x19)
     //必须项---------------8
  DWORD DriverId = (DWORD)25;
  RegSetValueEx( hKey,
     _T("DriverId"),
     0,
     REG_DWORD,
     (const BYTE *)(&DriverId),
     sizeof(DWORD));
 
 //HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\SafeTransactions
 //键值: DWORD: 0 (0x00)
  //可选项---------------9
  DWORD SafeTrans = (DWORD)0;
  RegSetValueEx( hKey,
     _T("SafeTransactions"),
     0,
     REG_DWORD,
     (const BYTE *)(&SafeTrans),
     sizeof(DWORD));
 RegCloseKey(hKey);

 //HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\Engines\
 //HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\Engines\Jet\/
 strMy=strDataSource;
  strMy+= "\\Engines\\Jet";

 RegCreateKeyEx(HKEY_CURRENT_USER,
     strMy,
     0,
     NULL,
     REG_OPTION_NON_VOLATILE,
     KEY_ALL_ACCESS,
     NULL,
     &hKey,
     &dwMy);

  //HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\Engines\Jet\ImplicitCommitSync
  //键值: 字符串: ""
  strMy="";
  RegSetValueEx( hKey,
     _T("ImplicitCommitSync"),
     0,
     REG_SZ,//"Ms Access"
     (const unsigned char *)((LPCTSTR)strMy),
     strlen((LPCTSTR)strMy)+1);

  //HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\Engines\Jet\Threads
  //键值: DWORD: 3 (0x3)
  dwMy = (DWORD)3;
  RegSetValueEx( hKey,
     _T("Threads"),
     0,
     REG_DWORD,
     (const BYTE *)(&dwMy),
     sizeof(DWORD));

  //HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\Engines\Jet\UserCommitSync
  //键值: 字符串: "Yes"
  strMy="Yes";
  RegSetValueEx( hKey,
     _T("UserCommitSync"),
     0,
     REG_SZ,//"Ms Access"
     (const unsigned char *)((LPCTSTR)strMy),
     strlen((LPCTSTR)strMy)+1);

 RegCloseKey(hKey);

 


 //HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\WBY-WBY\UID
 //键值: 字符串: ""
 //=========================================================
 AfxMessageBox(_T("注册表修改完成,配置ODBC数据源成功!"));
  return true;
}
  这样修改后,问题解决;试用如下VC界面运行后,再用RegEdit.exe查看注册表
和手工配置时的一样。
   

 该程序在XP,2000和98操作系统均调试通过.
关键词:VC MFC  注册表 ODBC 数据库

分享到:

上一篇:MCS51单片机学习

下一篇:学习CFileDialog类的微软代

评论 (0条) 发表评论

抢沙发,第一个发表评论
验证码