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の設定は出来ないのでしょうか?
出来るのでしたら設定する方法を教えてください。
宜しくお願い致します。
> 止まってしまいます。
エラーが出ると言うことですか?
ご使用のDelphiのバージョン, OS, データベースを明示した方が回答がつきやすいと思います。
情報が足らなくてすみません
バージョン=Delphi6
OS=Windows XP Professional
データベース=MSDE(SQL Serverでも)
です。
エラーは出てるかもしれませんし出ていないかもしれません。
サービスでエラーが出ているかどうか判断する方法が私わかりません。
とりあえずOpenに進みません。
1行おきにテキストで進行状況を出力して
Connectionstringを設定している場所で止まってると判断しました。
宜しくお願い致します。
ADOConnection1.Open; の前にCoInitialize(nil); を追加したら、どうでしょう。
> サービスでエラーが出ているかどうか判断する方法が私わかりません。
LogMessage メソッドを使えば、イベントログに出力できます。
ただしこのメソッドはリソースを作成して、レジストリに登録しないと使えません。
えーとねさん
返答ありがとうございます
ですが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プロパティは
設定できないのでしょうか?
回答宜しくお願い致します。
> 設定できないのでしょうか?
Delphi2006 SP2 + XP Pro SP2 + SQL Server 2000 SP3 では出来ます。
またLogMessage メソッドでイベントログを取った限り、私の環境では
> この後の処理に進めない
という事はありません。
まずはCoInitialize(nil); をお勧めします。
一番最初にCoInitializeした方が良いかもしれません。
ユニットのinitialization 節も試してみて下さい。
CoUninitialize; もお忘れなく。
プログラム側の問題ではなく
・SQLServerにサービスが起動するときのユーザの権限が与えられていないか
・DSNがシステムDSNじゃなくてユーザDSNに設定してあるか
のどちらかだと思いますよ。一度ご確認を。
原因を突き止めるには、データベースのエラーメッセージを見るのが一番です。
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;
ツイート | ![]() |