开发者社区> 技术小甜> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Delphi数据库编程技巧

简介:
+关注继续查看

我原来在万千的新闻组(news://news.webking.com.cn/)Delphi版上闲逛那段时间,发现经常有人提出一些数据库方面的技巧性问题,问题其实不难,但是要一个简单的解决方案,可能也破费思量,特别在此简单谈谈:

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就会返回异常的信息,程序员就可以加以判断以处理不同的情况。











本文转自鹅倌51CTO博客,原文链接: http://blog.51cto.com/kaixinbuliao/1198698,如需转载请自行联系原作者




版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
论云数据库编程能力的重要性
云为我们提供了便利,降低了开发和运维的成本。但是也必须思考一个问题,我们的云组件之间的的网络延迟?(相比较局域网的服务器和服务器之间)你可以用各种方法测试验证一下。以往我们把数据放在数据库,数据库只提供简单的增删改查,大部分的业务逻辑放在应用服务器来完成。但是在云时代,如果我们还这样的话,应用服务.
4122 0
编程技巧
编程技巧 java C++ C++ 比如在判断两个浮点数 a 和 b 是否相等时,不要用 a==b,应该判断二者之差的绝对值 fabs(a-b) 是否小于某个阈值,例如 1e-9。
1181 0
081_《Delphi串口通信编程》
《Delphi串口通信编程》 Delphi 教程 系列书籍 (081) 《Delphi串口通信编程》 网友(邦)整理 EMail: shuaihj@163.
1631 0
102_《Delphi5编程实例与技巧》
《Delphi5编程实例与技巧》 Delphi 教程 系列书籍 (102) 《Delphi5编程实例与技巧》 网友(邦)整理 EMail: shuaihj@163.com 下载地址: 下载 作者: 王华等 丛书名: 软件开发技术丛书 出版社:机械工业出版社 ISBN:7111078012 上架时间:2000-7-1 出版日期:2000 年2月 页码:432 版次:1-1 内容简介 Delphi是由Inprise公司推出的面向对象的可视化软件开发工具。
1400 0
083_《Delphi数据库开发经典实例精解》
《Delphi数据库开发经典实例精解》 Delphi 教程 系列书籍 (083) 《Delphi数据库开发经典实例精解》 网友(邦)整理 EMail: shuaihj@163.
1498 0
037_《Delphi7高效数据库程序设计》
《Delphi7高效数据库程序设计》 Delphi 教程 系列书籍 (037) 《Delphi7高效数据库程序设计》 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Pdf 附书源码 作者: 李维 丛书名: 李维作品系列 出版社:机械工业出版社 ISBN:7111112261 上架时间:2002-12-24 出版日期:2003 年1月 开本:16开 页码:412 版次:1-1 内容简介 dbExpress是Borland公司下一代数据访问技术。
1393 0
022_《Delphi模式编程》
《Delphi模式编程》 Delphi 教程 系列书籍 (022) 《Delphi模式编程》 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Pdf   作者: 刘艺 丛书名: Borland/Inprise核心技术丛书 出版社:机械工业出版社 ISBN:7111149491 上架时间:2004-9-11 出版日期:2004 年9月 开本:16开 页码:509 版次:1-1 内容简介 《delphi模式编程》是一本delphi程序员的模式入门和实践读物。
1265 0
Delphi中的几种数据库引擎
Delphi中经常出现的词汇是ADO,BDE,dbExpress等等,那么他们之间到底有什么异同呢,Delphi中的数据库引擎又到底有多少种呢?也许应该从整体上把握一下,才能有的放矢.
1226 0
+关注
10136
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载