在运行时动态构造数据库连接字符串

完成Delphi数据库解决方案后,最后一步是将其成功部署到用户的计算机上。...

完成Delphi数据库解决方案后,最后一步是将其成功部署到用户的计算机上。

woman working on laptop

动态连接字符串

如果使用的是dbGo(ADO)组件,则TADOConnection的ConnectionString属性指定数据存储的连接信息。

显然,当创建要在各种机器上运行的数据库应用程序时,与数据源的连接不应硬编码在可执行文件中。换句话说,数据库可能位于用户计算机上的任何位置(或网络中的其他计算机上)——TADOConnect对象中使用的连接字符串必须在运行时创建。建议存储连接字符串参数的位置之一是Windows注册表(或者,您可能决定使用“普通”INI文件)。

通常,要在运行时创建连接字符串,您必须a)将数据库的完整路径放在注册表中;和b)每次启动应用程序时,从注册表中读取信息,“创建”连接字符串并“打开”连接。

数据库连接

为了帮助您理解这个过程,我们创建了一个示例“框架”应用程序,它由一个表单(应用程序的主表单)和一个数据模块组成。Delphi的数据模块提供了一个方便的组织工具,用于隔离应用程序中处理数据库连接和业务规则的部分。

数据模块的OnCreate事件是放置代码以动态构造ConnectionString并连接到数据库的地方。

procedure TDM.DataModuleCreate(Sender: TObject); begin if DBConnect then ShowMessage('Connected to Database!') else ShowMessage('NOT connected to Database!'); end;

注:数据模块的名称为“DM”。TADOConnect组件的名称为“ADOCON”。

DBConnect函数执行连接到数据库的实际工作,代码如下:

function TDM.DBConnect: boolean; var conStr : string; ServerName, DBName : string; begin ServerName := ReadRegistry('DataSource'); DBName := ReadRegistry('DataCatalog'); conStr := 'Provider=sqloledb;' + 'Data Source=' + ServerName + ';'+ 'Initial Catalog=' + DBName + ';'+ 'User Id=myUser;Password=myPasword'; Result := false; AdoConn.Close; AdoConn.ConnectionString := conStr; AdoConn.LoginPrompt := False; if (NOT AdoConn.Connected) then try AdoConn.Open; Result:=True; except on E:Exception do begin MessageDlg('There was an error connecting to the database. Error:' + #13#10 + e.Message, mtError, [mbOk],0); if NOT TDatabasePromptForm.Execute(ServerName, DBName) then Result := false else begin WriteRegistry('DataSource', ServerName); WriteRegistry('DataCatalog', DBName); //recall this function Result := DBConnect; end; end; end; end; //DBConnect

DBConnect函数连接到MS SQL Server数据库-ConnectionString使用本地connStr变量构造。

数据库服务器的名称存储在ServerName变量中,数据库的名称保存在DBName变量中。该函数首先从注册表中读取这两个值(使用自定义ReadRegistry()过程)。一旦组装好ConnectionString,我们只需调用AdoConn.Open方法。如果此调用返回“true”,则表示我们已成功连接到数据库。

注意:由于我们通过ConnectionString显式地传递登录信息,由于数据模块是在主窗体之前创建的,因此您可以安全地从主窗体的OnCreate event中的数据模块调用方法。LoginPrompt属性设置为false以防出现不必要的登录对话框。

如果发生异常,“乐趣”开始。虽然Open方法失败的原因可能有很多,但让我们假设服务器名称或数据库名称不正确。如果是这种情况,我们将让用户有机会通过显示自定义对话框表单来指定正确的参数。示例应用程序还包含一个附加表单(DatabasePromptForm),使用户可以为连接组件指定服务器和数据库名称。这个简单的表单只提供了两个编辑框,如果您想提供更友好的界面,可以添加两个组合框,并通过枚举可用的SQL Server和检索SQL Server上的数据库来填充这些组合框。

DatabasePrompt表单提供了一个名为Execute的自定义类方法,该方法接受两个变量(var)参数:ServerName和DBName。

对于用户提供的“新”数据(服务器和数据库名称),我们只需再次(递归)调用DBConnect()函数。当然,信息首先存储在注册表中(使用另一个自定义方法:WriteRegistry)。

确保datamodule是创建的第一个“表单”!

如果您尝试自己创建此简单项目,则在运行应用程序时可能会遇到访问冲突异常。默认情况下,添加到应用程序的第一个表单将成为main表单(创建的第一个表单)。将数据模块添加到应用程序时,数据模块将作为在主窗体之后创建的窗体添加到“自动创建窗体”列表中。现在,如果尝试在主窗体的OnCreate事件中调用数据模块的任何属性或方法,由于数据模块尚未创建,您将收到访问冲突异常。要解决此问题,您需要手动更改数据模块的创建顺序,并将其设置为应用程序创建的第一个表单(使用“项目属性”对话框或编辑项目源文件)。

由于数据模块是在主窗体之前创建的,因此可以在主窗体的OnCreate事件中从数据模块安全地调用方法。

  • 发表于 2021-10-05 08:21
  • 阅读 ( 191 )
  • 分类:编程

你可能感兴趣的文章

所有程序员都应该知道的13条最重要的sql命令

数据库驱动着现代网络。每个大的或动态的网站都以某种方式使用数据库,当与结构化查询语言(SQL)结合使用时,操纵数据的可能性真的是无穷无尽。如果您已经知道SQL,请确保您检查了所有网站开发人员都应该知道的编程技...

  • 发布于 2021-03-14 06:57
  • 阅读 ( 220 )

如何在linux上使用ip命令

...外部)IP地址。 让我们把收到的所有信息分类: lo:以字符串形式显示的网络接口名称。 <LOOPBACK,UP,LOWER\u UP>:这是一个环回接口。它是向上的,意味着它是可操作的。物理网络层(第一层)也在上升。 mtu 65536:最大传...

  • 发布于 2021-04-02 13:48
  • 阅读 ( 180 )

如何使用ssh隧道访问受限服务器并安全浏览

...net的本地网络资源。例如,假设您想从家中访问办公室的数据库服务器。出于安全原因,该数据库服务器仅配置为接受来自本地办公网络的连接。但是,如果您可以访问办公室的SSH服务器,并且该SSH服务器允许从办公室网络外部...

  • 发布于 2021-04-08 08:02
  • 阅读 ( 211 )

如何在linux上使用netstat

...,并搜索“sshd” sudo netstat -anp | grep "sshd" grep找到了目标字符串,我们看到sshd守护进程正在使用端口22。 当然,我们也可以反过来做。如果我们搜索“:22”,我们可以找出哪个进程正在使用该端口(如果有的话)。 sudo netstat -...

  • 发布于 2021-04-14 19:17
  • 阅读 ( 165 )

jdbc语句(jdbc statement)和编制报表(preparedstatement)的区别

...BC(javadatabaseconnectivity)是一个javaapi,用于连接和执行与数据库的查询。它是独立于数据库的连接的行业标准,提供了通用的数据访问,尤其是存储在关系数据库中的数据。它使用用Java编程语言编写的JDBC驱动程序将任何Java应用...

  • 发布于 2021-06-25 10:39
  • 阅读 ( 261 )

常数(constant)和只读(readonly)的区别

...它可以是任何基本数据类型,例如整数常量、浮点常量或字符串文本。 什么是只读(readonly)? Readonly关键字是一个修饰符,只能用于字段,不能用于局部变量。只读字段可以在声明时初始化,也可以在同一类的构造函数中初始...

  • 发布于 2021-06-25 14:54
  • 阅读 ( 281 )

执行(exe)和动态链接库(dll)的区别

...操作系统的帮助下执行。他们不需要任何其他应用程序来运行。另一方面,DLL文件不是独立运行的。它们需要一个EXE文件来执行。EXE是最常见的文件扩展名之一。它主要表示用于Microsoft windows的可执行文件。它们是能够独立运行...

  • 发布于 2021-07-10 23:23
  • 阅读 ( 212 )

javascript语言(javascript)和html格式(html)的区别

...Script具有对象表示法和具有不同类型(如数字、布尔值、字符串、日期、时间等)的结构。HTML的静态内容将从服务器端显示,而JavaScript的脚本则从web浏览器的客户端执行。HTML支持各种数据类型,如标题、页眉、页脚、内容、图...

  • 发布于 2021-07-11 15:44
  • 阅读 ( 265 )

JAVA(java)和菲律宾比索(php)的区别

...主要用于创建动态Web页面。它的主要优点是与多种类型的数据库兼容。此外,PHP可以使用IMAP、SNMP、NNTP、POP3或HTTP在网络上进行通信。 PHP包含命令行界面功能,可以在独立的图形应用程序中使用。PHP命令可以直接嵌入到HTML源文...

  • 发布于 2021-07-13 05:58
  • 阅读 ( 186 )

构建高级gmail过滤器和持久性搜索

...使用OR的问题在于,复杂的查询往往会变成无穷无尽的OR字符串,而且它们不是那么容易管理。相反,用花括号{}包围析取搜索项。使用{to:adam subject:iPhone}搜索Gmail将产生与上面的OR搜索相同的结果,同时允许您有更多的空间来调...

  • 发布于 2021-08-01 00:20
  • 阅读 ( 77 )
py1ja6507
py1ja6507

0 篇文章

相关推荐