Подключить Delphi к базе данных SQL

Я использую 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" — это имя моего компьютера, введите здесь описание изображения

Как вы можете показаться, это будет работать только на моем ПК. Что мне сделать, чтобы он подключился к локальному хосту? Я попытался изменить «Источник данных» на «localhost», но он не будет подключаться, и я получу:

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

Есть идеи, где проблема?


person Ouerghi Yassine    schedule 20.11.2012    source источник


Ответы (3)


Несмотря на то, что ваш экземпляр находится на локальном хосте, он по-прежнему является именованным экземпляром, который вам нужно будет указать в строке подключения:

ADOConnection1.ConnectionString := '... Data Source=localhost\evilkid;';
person Michael Fredrickson    schedule 20.11.2012
comment
да, я попробовал это, и это сработало, но что, если бы мне пришлось использовать его на другом компьютере? что у него нет такого же имени экземпляра? - person Ouerghi Yassine; 21.11.2012
comment
@yassine_hell Тогда вам нужно сделать строку подключения настраиваемой и прочитать ее из файла .config или из другого места, которое вы можете изменить при перемещении вашего приложения в другие среды. - person Michael Fredrickson; 21.11.2012
comment
@yassine_hell Извините, я совершенно не знаком с delphi ... но на высоком уровне вы просто поместите строку подключения в плоский файл, а затем прочитаете ее в своем приложении и вместо этого назначите ее свойству connectionString использования жестко запрограммированной строки.... - person Michael Fredrickson; 21.11.2012

Пара способов обойти это. Как сказал Майкл, используйте файл конфигурации. Другие возможности — использовать DSN для доступа к БД. Если это всегда localhost/machinename, вы можете получить имя машины, используя любое количество методов. Я использую TtvAPIThing в некоторых старых проектах, а в JEDI есть компонент системной информации, облегчающий доступ к ним.

person Mike    schedule 20.11.2012

Я бы создал файл 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 откроет), и вы в безопасности.

Другой более общий подход заключается в том, чтобы просто сохранить 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]);
...
person alzaimar    schedule 20.11.2012