Какой SQL отправляется из объекта SqlCommand
У меня есть объект SqlCommand на моем c# на основе asp.net страница. SQL и передаваемые параметры работают большую часть времени. У меня есть один случай, который не работает, я получаю следующую ошибку:
Строковые или двоичные данные будут усечены. Заявление было прекращено.
Я понимаю ошибку, но все столбцы в базе данных должны быть достаточно длинными, чтобы содержать все отправляемые данные.
Мои вопросы,
Есть ли способ увидеть, что такое фактический SQL отправка в базу данных происходит из объекта SqlCommand? Я хотел бы иметь возможность отправить SQL по электронной почте, когда возникает ошибка.
Спасибо, Джастин
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?