14

ADO.NETを使用してSQLServer2005にアクセスしており、呼び出しているT-SQLストアドプロシージャの内部からログに記録できるようにしたいと考えています。それはどういうわけか可能ですか?

ADO.NETを使用しているときに、「print」ステートメントからの出力を表示できません。ロギングを使用したいので、理想的なソリューションは、SysInternalsからDebugViewにメッセージを送信することです。

4

11 に答える 11

9

ログテーブルへの書き込みが私の好みだと思います。

または、2005を使用している場合は、EventLogをラップアラウンドする簡単なSQLCLRプロシージャを作成できます。

または、SQLログに書き込みたい場合は、 xp_logeventを使用できます

于 2008-09-12T11:23:54.233 に答える
9

Eric Z Beardが提案したように、SQLCLRプロシージャを作成することでこれを解決しました。アセンブリは、厳密な名前のキーファイルで署名する必要があります。

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static int Debug(string s)
    {
        System.Diagnostics.Debug.WriteLine(s);
            return 0;
        }
    }
}

キーとログインを作成しました:

USE [master]
CREATE ASYMMETRIC KEY DebugProcKey FROM EXECUTABLE FILE =
'C:\..\SqlServerProject1\bin\Debug\SqlServerProject1.dll'

CREATE LOGIN DebugProcLogin FROM ASYMMETRIC KEY DebugProcKey 

GRANT UNSAFE ASSEMBLY TO DebugProcLogin  

SQL Serverにインポートしました:

USE [mydb]
CREATE ASSEMBLY SqlServerProject1 FROM
'C:\..\SqlServerProject1\bin\Debug\SqlServerProject1.dll' 
WITH PERMISSION_SET = unsafe

CREATE FUNCTION dbo.Debug( @message as nvarchar(200) )
RETURNS int
AS EXTERNAL NAME SqlServerProject1.[StoredProcedures].Debug

次に、を使用してT-SQLプロシージャにログインできました。

exec Debug @message = 'Hello World'
于 2009-02-13T10:00:18.107 に答える
7

新しい行を挿入するだけでテーブルにログを記録するか、CLRストアドプロシージャを実装してファイルに書き込むことができます。

アクションがトランザクションで発生し、トランザクションがロールバックされると、ログエントリが表示されなくなるため、テーブルへの書き込みには注意してください。

于 2008-09-12T11:20:47.423 に答える
5

SQL sproc内からのロギングは、データベース自体に対して行う方が適切です。T-SQLはファイルに書き込むことができますが、実際にはそのために設計されていません。

于 2008-09-12T11:22:33.080 に答える
3

PRINTコマンドがありますが、クエリできるようにテーブルにログインすることをお勧めします。

于 2008-09-12T11:24:13.467 に答える
1

価値があるのは、SqlConnection に InfoMessage ハンドラーを割り当てない場合、次のことがわかりました。

sqlConnection.InfoMessage += new SqlInfoMessageEventHandler(MySqlConnectionInfoMessageHandler);

InfoMessageHandler の署名は次のようになります。

MySqlConnectionInfoMessageHandler(object sender, SqlInfoMessageEventArgs e)

次に、Stored Procs の PRINT ステートメントが DbgView に表示されません。

于 2009-11-19T18:04:43.730 に答える
1

ストアド プロシージャ内からログ テーブルに行を書き込むことができます。他の人が指摘したように、CLR や xp_logevent を使用してテキスト ファイルやその他のログに書き込むことはできますが、そのような用途に実用的であるよりも多くのボリュームが必要なようです。

トランザクションが失敗すると、困難なケースが発生します (実際にログが必要になるのはこれらのケースです)。これらのトランザクション中に発生するログは、それらが含まれるトランザクションと共にロールバックされるため、クライアントがエラーをログに記録するために使用できるログ API を用意することをお勧めします。これは、同じデータベースまたは共有データベースにログを記録する単純な DAL にすることができます。

于 2008-10-05T23:06:15.190 に答える
0

Log4TSQLを確認することをお勧めします。SQL Server 2005 ~ 2008 のストアド プロシージャとトリガーのデータベース ログを提供します。プロシージャ/トリガーごとに個別の独立したログ レベルを設定できます。

于 2009-12-15T08:18:54.830 に答える
0

メッセージを返すために出力変数を使用できますが、それはエラーなしで実行される proc に依存しています。

create procedure usp_LoggableProc 

@log varchar(max) OUTPUT 

as

-- T-SQL statement here ...

select @log = @log + 'X is foo'

そして、あなたのADOコードで何か:

string log = (string)SqlCommand.Parameters["@log"].Value;

raiserror を使用して、必要な情報を含む独自のカスタム エラーを作成できます。この情報は、ADO コードの通常の SqlException Errors コレクションを通じて利用できます。

RAISERROR('X is Foo', 10, 1)

うーん、ええ、デバッグのためだけに感じずにはいられません。あなたの状況では、他の人が提案したようにvarcharメッセージをエラーテーブルに挿入し、デバッグ時に*を選択してください。

于 2008-09-12T13:48:45.977 に答える