1

我正在使用 Microsoft SQL Server R2 Express 创建数据库。

当我尝试使用 delphi 连接到数据库时,我必须使用此连接字符串:

ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Integrated Security=SSPI;Initial Catalog=db_formation;Data Source=EVILKID-pc\evilkid;';

其中“EVILKID-PC\evilkid”是我的电脑的名称, 在此处输入图像描述

如您所见,这仅适用于我的PC。我应该怎么做才能连接到本地主机?我尝试将“数据源”更改为“本地主机”,但它无法连接,我会得到:

[DBNETLIN][ConnectionOpen(Connect()).]SQL Server does not exist or access denied

知道问题出在哪里吗?

4

3 回答 3

4

即使您的实例位于本地主机上,它仍然是您需要在连接字符串中指定的命名实例:

ADOConnection1.ConnectionString := '... Data Source=localhost\evilkid;';
于 2012-11-20T19:51:35.860 回答
1

有几种方法可以解决这个问题。正如迈克尔所说,使用配置文件。其他可能的方法是使用 DSN 访问数据库。如果它始终是 localhost/machinename,您可以使用任意数量的方法检索机器名称。我在一些较旧的项目中使用 TtvAPIThing,JEDI 有一个系统信息组件可以让访问这些更容易。

于 2012-11-20T20:58:21.270 回答
1

我会在您 PC 上的本地应用程序数据路径中创建一个 UDL 文件 (Connection.UDL),并让应用程序中的连接字符串使用它

Var
  plainAppName : String;
  appDataPath : String;

Begin
  plainAppName := ChangeFileExt(ExtractFilePath(ParamStr(0)),'.EXE','');
  appDataPath := IncludeTrailingBackslash(GetSpecialFolderLocation(CSIDL_APPDATA))+plainAppName+'\';
  ADOConnection.Connectionstring := 'FILE NAME = '+appDataPath+'Connection.UDL';

Connection.UDL 包含

[oledb]
; Everything after this line is an OLE DB initstring
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=test;Data Source=YourPC\InstanceName

事实上,它可能是空的。但是,您(或客户)双击该文件,将打开 oleDB 连接对话框。现在设置服务器、实例、登录凭据、测试连接并保存。

完毕。

您的应用程序将打开文件(好吧,ADOConnection 将打开),您就安全了。

另一种更通用的方法是将服务器 pc 的 IP/名称简单地存储在 INI 文件中并在代码中替换它

CONST
  adoStr = 'Provider=SQLOLEDB.1;Integrated Security=SSPI;'
          +'Persist Security Info=False;Initial Catalog=test;'
          +'Data Source=%s';

ADOConnection.ConnectionString := Format(adoStr,[TheIPOrNameOfThePC]);
...
于 2012-11-20T22:22:39.363 回答