精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Delphi>>数据库技术>>Delphi数据库编程技巧

主题:Delphi数据库编程技巧
发信人: r_hayes(Hayes)
整理人: teleme(2003-06-09 16:31:22), 站内信件
1. 如何动态设置ODBC源 
2. 如何动态设置BDE别名 
3. 如何扑捉运行SQL语句时的错误 
1. 如何动态设置ODBC源 

  很多时候程序员需要自动生成ODBC数据源,而不是指导客户"打开控制面板… … ",到底如何去做呢?相信很多人会选择编程修改注册表来实现这项功能,因为ODBC的详细信息全部存放在注册表的下述键值内: 

   "HKEY_LOCAL_MACHINE\SOFTWARE\ODBC" 

修改一下ODBC的配置,通过前后的注册表比较,你可以发现一定的规律。在这里我只是想说,哥们,别这么犯傻了(如果我让你写一个通用的ODBC源处理程序,你得累死),用这个Windows ODBC API函数吧, 

   function SQLConfigDataSource(hwndParent: Integer; fRequest: Integer; 

   lpszDriverString: String; lpszAttributes: String): Integer; 

   stdcall;external ``ODBCCP32.DLL``; 

  了解数据库编程的朋友都知道,数据库的访问方式不论DAO、ADO、ODBC或是BDE或是其它第三方的数据库连接控件,归根结底,都是一些个函数集,只要你愿意,你可以编写出自己的数据库访问方式用以替代。深入研究这些底层函数,很多时候会为你提供相当地便利。 

  SQLConfigDataSource这个函数MSDN有详细的说明,我不想整段翻译下来让你扁我,我只是结合流行的SQL Server谈谈如何有技巧的调用该函数。其它的数据库大同小异。 

   SQLConfigDataSource(0, ODBC_ADD_SYS_DSN,``SQL Server``, 
  ``DSN=Record_ODBC``+ chr(0) + 
  ``Server=(local)``+ chr(0) + 
  ``Database=master``+ chr(0) + 
  ``Description=DragonPC SQLServer ODBC Source``+ chr(0)); 

   
  这是我的Delphi程序中调用该函数的一个实例,第一个参数是父窗口句柄,设置为0则该函数不显示任何对话框。第二个参数是操作类型,你需要定义如下的操作类型常量: 

Const 
  ODBC_ADD_DSN = 1; // Add a new user data source. 
  ODBC_CONFIG_DSN = 2; // Configure (modify) an existing user data source. 
  ODBC_REMOVE_DSN = 3; // Remove an existing user data source. 
  ODBC_ADD_SYS_DSN = 4; // Add a new system data source. 
  ODBC_CONFIG_SYS_DSN = 5; // Modify an existing system data source. 
  ODBC_REMOVE_SYS_DSN = 6; // Remove an existing system data source. 



  从名字我们知道,要添加ODBC源,我们需要调用的是ODBC_ADD_SYS_DSN 或是ODBC_ADD_DSN参数。第三个参数也没有什么好说的,我们添加的是SQL Server数据库的ODBC源,所以填入``SQL Server``参数,如果需要建立Excel文件的ODBC数据源,我们可以填入``Excel Files (*.xls)``,这些字符串参数相信各位同志在添加ODBC源时,已经多次见过。 

  关键的是第三个参数的设置,不同的数据库类型所支持的关键字是不一样的,这里仅仅就SQL Server所支持的关键字作一个简单说明: 

  DSN:你的ODBC数据源名称。 

  Server:你的数据库服务器名称,使用(local)指的是本地计算机安装的数据库。注:最新的SQL Server 2000支持一台计算机运行多个SQL Server服务,这个时候你需要指定SqlSever的InstanceName。 

  Address:指定SQL Server服务器的网络IP地址。 

  Database:指定默认数据库名称。 

  Language:指定默认语言。 

  Description:备注信息。 

  详细的参数和信息可以查阅微软网站的以下网址。 

  http://msdn.microsoft.com/library/psdk/dasdk/odch3kit.htm 

  http://msdn.microsoft.com/library/psdk/sql/od_odbc_c_99yd.htm 


2. 如何动态设置BDE别名 

  这个问题其实是考察程序员对BDE的TSession组件的熟悉程度,一个数据库程序的建立,即使你没有显式的添加TSession组件,系统中依然存在一个名字为Session的TSession对象,你可以在任何位置调用该对象的方法和属性。TSession类的很多方法可以帮助我们的应用程序获取系统BDE环境,下面介绍一个代码片断用以添加一个BDE别名: 

   
var 
  BDEList : TStringList ; 
  ... 
  begin 
  ... 
  BDEList := TStringList.Create () ; 
  try 
  Session.GetAliasNames(BDElist) ; // 获取系统所有BDE别名列表 
  if BDEList.IndexOf(``DragonPC``)= -1 then begin // 如果没有我们的BDE别名"DragonPC" 
  BDEList.Clear ; 
  BDEList.Add(``SERVER NAME=`` + ``SQLServerName``)); // 数据库服务器名称 
  BDEList.Add(``DATABASE NAME=master``) ; // 默认数据库 
  BDEList.Add(``USER NAME=sa``); // 用户名 
  Session.AddAlias(``DragonPC``, ``MSSQL``, BDEList) ; // 添加一个MSSQL类型的BDE别名 
  ShowMessage(``系统即将建立BDE别名!``) ; 
  Session.SaveConfigFile() ; // 存储BDE配置 
  end; 
  finally 
  BDEList.Free ; 
  end; 



  这么简单,用户就可以随时建立、删除和修改BDE别名(有兴趣的朋友可以查看TSession组件的源代码,看看调用了哪些BDE函数)。另外像DeleteAlias,ModifyAlias,GetDatabaseNames,GetDriverNames,GetStoredProcNames,GetTableNames,GetPassword等等TSession类的方法,使用起来非常简单,通过Delphi的随机帮助,读者可以试着自己调用一下看看。通过对Session的灵活应用,再配合我下面将要提到的扑捉SQL异常的技巧,你完全可以写一个媲美SQL Explorer的通用数据库查询工具。 


3. 如何扑捉运行SQL语句时的错误 

  老是有朋友在开发一些开放的数据库接口(比如Delphi的SQL Explorer工具)时发愁,既然是开放的,当然需要允许用户使用SQL语句访问数据库,这些还好办,一旦用户的运行SQL语句出现错误,程序员如何扑捉该异常呢?很简单,看看下面的函数: 

   
Const 
  ExecSQLMode = 0 ; 
  OpenSQLMode = 1 ; 
  ResultRight = ``SQL query result is right`` ; 
  ... 
  function RunSql(RunQuery: TQuery; Sqls: TStringList; var ErrorMsg: string; 
  Mode: integer) : integer ; 
  begin 
  ErrorMsg := ResultRight ; 
  Result := 0 ; 
  try 
  RunQuery.DatabaseName := ``RecordDB`` ; 
  RunQuery.SQL.Clear() ; 
  RunQuery.SQL.AddStrings(Sqls) ; 
  if Mode = ExecSQLMode then 
  RunQuery.ExecSQL() 
  else 
  RunQuery.Open() ; 
  except 
  on e:exception do 
  ErrorMsg := e.Message + #13 + #10 +``--- 错误是俺发现的 ---``; 
  end; 
  end; 
  朋友看明白了吧,我的函数很简单,将SQL语句代码段作为参数传递给TQuery组件,通过设置查询方式(ExecSQLMode、OpenSQLMode)来处理有结果集返回的数据查询语句(select)或是没有结果集返回的数据操作语言(update、delete、insert、create等)。而异常的扑捉呢,我们扑捉所有异常的老祖宗Exception,因为Delphi的所有异常都是从Exception继承下来的,这样一个简单的SQL语句运行和异常处理函数就完成了,一旦返回的ErrorMsg的值不是ResultRight,ErrorMsg就会返回异常的信息,程序员就可以加以判断以处理不同的情况。 




----

                    灌灌 
                    灌灌 
                    灌灌 
                    灌灌          灌灌 
                    灌灌      灌灌灌 
    灌灌灌灌灌灌灌  灌灌  灌灌灌 
      灌灌灌灌灌灌灌灌灌灌灌灌 
                灌灌灌灌灌灌 
               灌灌灌灌灌灌灌  
              灌灌  灌灌  灌灌 
             灌灌   灌灌    灌灌 
            灌灌    灌灌      灌灌 
          灌灌      灌灌      灌灌灌 
          灌灌      灌灌        灌灌灌灌 
        灌灌        灌灌        灌灌灌灌灌 
      灌灌          灌灌          灌灌灌灌灌  
    灌灌            灌灌            灌灌 
                灌灌灌灌 
                  灌灌灌 
                    灌    

[关闭][返回]