サービスでADOの接続先を変更するには?


ペータ  2006-12-25 18:51:32  No: 24379

exeでは

procedure TForm1.FormCreate(Sender: TObject);
begin
  ADOConnection1.Close;
  ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Password=testpas;Persist Security Info=True;User ID=testuser;Initial Catalog=testdb;Data Source=svTEST';

  ADOConnection1.Open;

end;

でデータベースに接続できるんですが
同じことをサービスで出来ません。
Connectionstringを設定している場所で止まってしまいます。
サービスでConnectionstringの設定は出来ないのでしょうか?
出来るのでしたら設定する方法を教えてください。
宜しくお願い致します。


えーとね  2006-12-25 19:10:20  No: 24380

> 止まってしまいます。
エラーが出ると言うことですか?

ご使用のDelphiのバージョン, OS, データベースを明示した方が回答がつきやすいと思います。


ペータ  2006-12-25 19:26:29  No: 24381

情報が足らなくてすみません
バージョン=Delphi6
OS=Windows XP Professional
データベース=MSDE(SQL Serverでも)
です。
エラーは出てるかもしれませんし出ていないかもしれません。
サービスでエラーが出ているかどうか判断する方法が私わかりません。
とりあえずOpenに進みません。

1行おきにテキストで進行状況を出力して
Connectionstringを設定している場所で止まってると判断しました。

宜しくお願い致します。


えーとね  2006-12-26 00:46:53  No: 24382

ADOConnection1.Open; の前にCoInitialize(nil); を追加したら、どうでしょう。

> サービスでエラーが出ているかどうか判断する方法が私わかりません。
LogMessage メソッドを使えば、イベントログに出力できます。
ただしこのメソッドはリソースを作成して、レジストリに登録しないと使えません。


ペータ  2006-12-26 02:18:50  No: 24383

えーとねさん
返答ありがとうございます
ですがOpenでエラーになってる場合は
それで解決できる可能性はありますが

procedure TForm1.FormCreate(Sender: TObject);
begin
  ADOConnection1.Close;

  //進行状況出力①
  
ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Password=testpas;Persist Security Info=True;User ID=testuser;Initial Catalog=testdb;Data Source=svTEST';

  //進行状況出力②

  ADOConnection1.Open;

  //進行状況出力③

end;

①は出力されるのですが②が出力されません。
ですので

ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Password=testpas;Persist Security Info=True;User ID=testuser;Initial Catalog=testdb;Data Source=svTEST';

でエラーが発生していると思われます。
この後の処理に進めないので
ConnectionStringの後に何をしても解決は出来ないと思います。

そもそもサービスでTADOConnectionのConnectionStringプロパティは
設定できないのでしょうか?

回答宜しくお願い致します。


えーとね  2006-12-26 02:57:04  No: 24384

> 設定できないのでしょうか?
Delphi2006 SP2 + XP Pro SP2 + SQL Server 2000 SP3 では出来ます。

またLogMessage メソッドでイベントログを取った限り、私の環境では
> この後の処理に進めない
という事はありません。

まずはCoInitialize(nil); をお勧めします。


えーとね  2006-12-26 03:01:30  No: 24385

一番最初にCoInitializeした方が良いかもしれません。
ユニットのinitialization 節も試してみて下さい。

CoUninitialize; もお忘れなく。


りっきぃ  2006-12-26 04:20:47  No: 24386

プログラム側の問題ではなく
・SQLServerにサービスが起動するときのユーザの権限が与えられていないか
・DSNがシステムDSNじゃなくてユーザDSNに設定してあるか
のどちらかだと思いますよ。一度ご確認を。


えーとね  2006-12-26 16:10:24  No: 24387

原因を突き止めるには、データベースのエラーメッセージを見るのが一番です。

1.リソースエディタをインストールして、起動します。
http://www.wilsonc.demon.co.uk/d10resourceeditor.htm
2.右クリックして、MessageTableを追加します。
3.右クリックでAddStringを選択します。
4.%1と入力します。
5.もう1つエントリを作成します。3-4を繰り返します。
6.右クリックでChangeIDを選択し、0番にします。
7.resファイルをプロジェクトのディレクトリに保存します。

1.Delphi のプロジェクトファイルに{$R 名前.res}を追加します。
2.AfterInstall イベントに
var
  reg : TRegistry;
  keyName : string;
begin
  reg := TRegistry.Create (KEY_READ or KEY_WRITE);
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    keyName := 'SYSTEM\CurrentControlSet\Services\EventLog\Application\' + Service1.Name;
    if reg.OpenKey (keyName, True) then
    begin
      reg.WriteExpandString('EventMessageFile', ParamStr (0));
      reg.WriteInteger('TypesSupported', 7)
    end
  finally
    reg.Free
  end;
end;
3.AfterUnInstallイベントに
var
  reg : TRegistry;
  keyName : string;
begin
  reg := TRegistry.Create (KEY_READ or KEY_WRITE);
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    keyName := 'SYSTEM\CurrentControlSet\Services\EventLog\Application\';
    if reg.OpenKey(keyName, False) then
      reg.DeleteKey(Service1.Name);
  finally
    reg.Free
  end
end;
4.StartServiceイベントに
begin
  try
    ADOConnection1.Close;
    ADOConnection1.ConnectionString := 
    ADOConnection1.Open;
  except
    on E: exception do
    begin
      Sender.LogMessage(E.Message, EVENTLOG_WARNING_TYPE, 0, 1);
      raise;
    end;
  end;
end;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加