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文字列に値を挿入することです。タスクは、既存のプロジェクトで機能するようにクラスをリファクタリングすることです。

上記のコードサンプルは、私が解決しなければならない1つの問題を示していますが、他にもあるのではないかと思います。問題は、基本的に、文字列をパラメータ化されたクエリに変換するクラスを作成することです。誰かがこれをしましたか、そして途中でどんな罠やトリックがあるかもしれませんか?

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 に答える