Какой SQL отправляется из объекта SqlCommand


У меня есть объект SqlCommand на моем c# на основе asp.net страница. SQL и передаваемые параметры работают большую часть времени. У меня есть один случай, который не работает, я получаю следующую ошибку:

Строковые или двоичные данные будут усечены. Заявление было прекращено.

Я понимаю ошибку, но все столбцы в базе данных должны быть достаточно длинными, чтобы содержать все отправляемые данные.

Мои вопросы,

Есть ли способ увидеть, что такое фактический SQL отправка в базу данных происходит из объекта SqlCommand? Я хотел бы иметь возможность отправить SQL по электронной почте, когда возникает ошибка.

Спасибо, Джастин

4 2

4 ответа:

Вам нужно использовать профилировщик SQL Server, чтобы следить за тем, что поступает из приложения. Я считаю, что он может показать вам SQL и параметры, которые вам нужно будет увидеть.

Хотя вы не сможете подключить is к чему-то вроде 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();
}

Хотя и не идеально, вот что-то, что я стукнул что - то для TSQL-можно было бы легко настроить для других вкусов... Если ничего другого, это даст вам отправную точку для ваших собственных улучшений:)

Это делает нормальную работу с типами данных и выходными параметрами и т. д. аналогично использованию "execute stored procedure" в SSMS. Мы в основном использовали SPs, поэтому команда" text " не учитывает параметры etc

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);

Проверьте этот вопрос, он должен обеспечить то, что вы ищете.

Получить сгенерированную инструкцию SQL из объекта SqlCommand?