Правильное использование параметров в FirebirdSql

Интересно, кто-нибудь может помочь со следующим.

using (FbConnection conn = new FbConnection(ConnectionString))
{
    conn.Open();

    // --------------------------------------------------------------------------
    FbCommand command1 = new FbCommand("SELECT @AN_INT FROM RDB$DATABASE", conn);
    command1.Parameters.Add("AN_INT", FbDbType.Integer);
    try
    {
        command1.Prepare();  //  Message=Dynamic SQL Error
                            //SQL error code = -804
                            //Data type unknown
                            //  Source=FirebirdSql.Data.FirebirdClient
                            //  ErrorCode=335544569
                            //  SQLSTATE=42000
    }
    catch(Exception E)
    {
        MessageBox.Show(E.Message);
    }
    // --------------------------------------------------------------------------
    FbCommand command2 = new FbCommand("SELECT 123 FROM RDB$DATABASE WHERE 789 >= @AN_INT", conn);
    command2.Parameters.Add("AN_INT", FbDbType.Integer);
    try
    {
        command2.Prepare();  // No Problem
    }
    catch (Exception E)
    {
        MessageBox.Show(E.Message);
    }
}

Моя проблема в том, что я выбрал проект у другого кодера и думаю, что, если возможно, мне следует изменить компонент базы данных, чтобы использовать параметризованные запросы; существующий метод заключается в том, чтобы вводить значения в строки Sql. Задача состоит в том, чтобы изменить класс для работы в существующем проекте.

Пример кода выше демонстрирует одну проблему, которую я должен решить, и мне интересно, есть и другие. По сути, проблема заключается в создании класса, который будет превращать строки в параметризованные запросы. Кто-нибудь сделал это, и какие ловушки или уловки могут быть по пути?

1 ответ

Решение

Ваш первый запрос должен быть SELECT cast(@AN_INT as int) FROM RDB$DATABASE, Еще Firebird не знает, что это за тип параметра (даже если он указан в коде C#).

Вы можете попробовать запустить этот фрагмент кода прямо в Firebird, чтобы увидеть ограничение самого движка.

execute block
as
begin
    execute statement ('select :foobar from rdb$database')(foobar := 10);
end
Другие вопросы по тегам