2

C# ベースの asp.net ページに SqlCommand オブジェクトがあります。SQL と渡されたパラメーターは、ほとんどの場合機能しています。動作しないケースが 1 つあります。次のエラーが表示されます。

文字列型やバイナリは省略されます。ステートメントは終了されました。

エラーを理解しましたが、データベース内のすべての列は、送信されるすべてのものを保持するのに十分な長さである必要があります。

私の質問、

データベースに送信されている実際の SQL が SqlCommand オブジェクトからのものであることを確認する方法はありますか? エラーが発生したときに SQL をメールで送信できるようにしたいと考えています。

ありがとう、ジャスティン

4

4 に答える 4

8

Enterprise Manager などにプラグインして実行することはできませんが、ロギングには機能します。

public static string ToReadableString(this IDbCommand command)
{
    StringBuilder builder = new StringBuilder();
    if (command.CommandType == CommandType.StoredProcedure)
        builder.AppendLine("Stored procedure: " + command.CommandText);
    else
        builder.AppendLine("Sql command: " + command.CommandText);
    if (command.Parameters.Count > 0)
        builder.AppendLine("With the following parameters.");
    foreach (IDataParameter param in command.Parameters)
    {
        builder.AppendFormat(
            "     Paramater {0}: {1}",
            param.ParameterName,
            (param.Value == null ? 
            "NULL" : param.Value.ToString())).AppendLine();
    }
    return builder.ToString();
}
于 2010-04-12T20:26:20.460 に答える
7

アプリケーションからの情報を監視するには、SQL Server プロファイラーを使用する必要があります。必要な SQL とパラメーターを表示できると思います。

于 2010-04-09T22:50:23.923 に答える
4

完璧ではありませんが、これは私がTSQL用に何かをノックアップしたものです-他のフレーバー用に簡単に微調整できます...他に何もなければ、それはあなた自身の改善の出発点を与えるでしょう:)

これは、SSMS で「ストアド プロシージャの実行」を使用する場合と同様に、データ型や出力パラメータなどで問題なく動作します。主にSPを使用したため、「テキスト」コマンドはパラメーターなどを考慮していません

public static String ParameterValueForSQL(this SqlParameter sp)
  {
   String retval = "";

   switch (sp.SqlDbType)
   {
    case SqlDbType.Char:
    case SqlDbType.NChar:
    case SqlDbType.NText:
    case SqlDbType.NVarChar:
    case SqlDbType.Text:
    case SqlDbType.Time:
    case SqlDbType.VarChar:
    case SqlDbType.Xml:
    case SqlDbType.Date:
    case SqlDbType.DateTime:
    case SqlDbType.DateTime2:
    case SqlDbType.DateTimeOffset:
     retval = "'" + sp.Value.ToString().Replace("'", "''") + "'";
     break;

    case SqlDbType.Bit:
     retval = (sp.Value.ToBooleanOrDefault(false)) ? "1" : "0";
     break;

    default:
     retval = sp.Value.ToString().Replace("'", "''");
     break;
   }

   return retval;
  }

  public static String CommandAsSql(this SqlCommand sc)
  {
   StringBuilder sql = new StringBuilder();
   Boolean FirstParam = true;

   sql.AppendLine("use " + sc.Connection.Database + ";");
   switch (sc.CommandType)
   {
    case CommandType.StoredProcedure:
     sql.AppendLine("declare @return_value int;");

     foreach (SqlParameter sp in sc.Parameters)
     {
      if ((sp.Direction == ParameterDirection.InputOutput) || (sp.Direction == ParameterDirection.Output))
      {
       sql.Append("declare " + sp.ParameterName + "\t" + sp.SqlDbType.ToString() + "\t= ");

       sql.AppendLine(((sp.Direction == ParameterDirection.Output) ? "null" : sp.ParameterValueForSQL()) + ";");

      }
     }

     sql.AppendLine("exec [" + sc.CommandText + "]");

     foreach (SqlParameter sp in sc.Parameters)
     {
      if (sp.Direction != ParameterDirection.ReturnValue)
      {
       sql.Append((FirstParam) ? "\t" : "\t, ");

       if (FirstParam) FirstParam = false;

       if (sp.Direction == ParameterDirection.Input)
        sql.AppendLine(sp.ParameterName + " = " + sp.ParameterValueForSQL());
       else

        sql.AppendLine(sp.ParameterName + " = " + sp.ParameterName + " output");
      }
     }
     sql.AppendLine(";");

     sql.AppendLine("select 'Return Value' = convert(varchar, @return_value);");

     foreach (SqlParameter sp in sc.Parameters)
     {
      if ((sp.Direction == ParameterDirection.InputOutput) || (sp.Direction == ParameterDirection.Output))
      {
       sql.AppendLine("select '" + sp.ParameterName + "' = convert(varchar, " + sp.ParameterName + ");");
      }
     }
     break;
    case CommandType.Text:
     sql.AppendLine(sc.CommandText);
     break;
   }

   return sql.ToString();
  }

これにより、これらの行に沿って出力が生成されます...

use dbMyDatabase;
declare @return_value int;
declare @OutTotalRows BigInt = null;
exec [spMyStoredProc]
 @InEmployeeID = 1000686
 , @InPageSize = 20
 , @InPage = 1
 , @OutTotalRows = @OutTotalRows output
;
select 'Return Value' = convert(varchar, @return_value);
select '@OutTotalRows' = convert(varchar, @OutTotalRows);
于 2010-11-10T16:26:02.830 に答える
3

この質問をチェックしてください。探しているものが提供されるはずです。

生成された SQL ステートメントを SqlCommand オブジェクトから取得しますか?

于 2010-04-10T07:22:30.483 に答える