5

我想知道是否有人可以提供以下帮助。

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 字符串。任务是重构一个类以在现有项目中工作。

上面的代码示例演示了一个我必须解决的问题,我想知道还有其他问题。本质上,问题在于创建一个将字符串转换为参数化查询的类。有没有人这样做过,沿途可能有什么陷阱或技巧?

4

1 回答 1

2

您的第一个查询需要是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
于 2012-07-12T12:24:50.907 回答