Узнайте текст запроса перед выполнением ExecuteNonQuery()

Вот пример использования OleDbCommand и ExecuteNonQuery (взял из мануала на msdn.microsoft.com). Я хотел бы проверить запрос, который был сгенерирован, прежде чем выполнять его.

private static void OleDbCommandPrepare(string connectionString)
{
    using (OleDbConnection connection = new
               OleDbConnection(connectionString))
    {
        connection.Open();

        // Create the Command.
        OleDbCommand command = new OleDbCommand();

        // Set the Connection, CommandText and Parameters.
        command.Connection = connection;
        command.CommandText =
            "INSERT INTO dbo.Region (RegionID, RegionDescription) VALUES (?, ?)";
        command.Parameters.Add("RegionID", OleDbType.Integer, 4);
        command.Parameters.Add("RegionDescription", OleDbType.VarWChar, 50);
        command.Parameters[0].Value = 20;
        command.Parameters[1].Value = "First Region";

        // Call  Prepare and ExecuteNonQuery.
        command.Prepare();

узнайте, какой запрос выполняется здесь

        command.ExecuteNonQuery();

        // Change parameter values and call ExecuteNonQuery.
        command.Parameters[0].Value = 21;
        command.Parameters[1].Value = "SecondRegion";
        command.ExecuteNonQuery();
    }
}

Есть ли способ сделать это? Я использую PgSqlCommand, который является эквивалентом OleDbCommand в PostgreSQL и получает неописанное исключение. Я смог построить этот запрос и выяснить, в чем была ошибка, задействовав Command.Parameters и заменив символы вопроса в Command.CommandText значениями пареметра, но я надеюсь, что есть встроенный метод для получения этого запроса.


person plavozont    schedule 30.06.2016    source источник
comment
Связанный: stackoverflow.com/questions/178857/   -  person    schedule 30.06.2016
comment
Способ исправить запрос: stackoverflow.com/questions/37670358/   -  person plavozont    schedule 01.07.2016


Ответы (1)


Нет прямого способа проверить сгенерированный запрос, но в качестве альтернативы вы можете использовать строковый формат вместо команды.

var query= String.Format(
            "INSERT INTO dbo.Region (RegionID, RegionDescription)
              VALUES ({0}, {1})", 20,"First Region" );
command.CommandText = query;## Heading ##

Другой способ проверить запрос - использовать Profiler, т.е. в случае SQL-сервера SQL Profiler показывает, какой запрос запущен в базе данных.

person Pranay Rana    schedule 30.06.2016
comment
Разве это не склонно к SQL-инъекциям? - person Clodoaldo Neto; 30.06.2016
comment
@ClodoaldoNeto - да, это вызывает внедрение sql, но это просто проверка того, какой запрос сгенерирован ... просто альтернатива проверке того, что такое запрос - person Pranay Rana; 30.06.2016