8

System.Data.OracleClientライブラリは廃止されたため、代わりにOracle Data Provider for .NET (ODP.NET)を使用するようにコード ベースを移行中です。私たちが遭遇した問題の 1 つは、System.Data.OracleClient が位置によるバインドではなくパラメーター名のバインドを使用し、すべてのコードが中間データ層を使用するのではなく、 System.Data.OracleClient.OracleCommandに直接アクセスすることです。

かなりの量のコードがあるため、ODP.NET OracleCommand.BindByName を強制的にデフォルトで true にする簡単な方法はありますか?それとも、使用するたびに値を確認して設定する必要がありますか? それに失敗した場合、そのコード行を Visual Studio 2008 に挿入する簡単な方法はありますか?

4

7 に答える 7

13

試していませんが、

私は次のようなものを見てきました

" cmd.GetType().GetProperty("BindByName").SetValue(cmd,true,null);" は PetaPoco.cs ファイルにあります。

多分それは助けることができます。

于 2011-09-02T11:37:38.160 に答える
10

このスレッドが古いことは知っていますが、今日も同じ問題が発生しており、他の誰かがこの問題を抱えている場合に備えて、解決策を共有したいと思いました。OracleCommandは封印されているので(これは最悪です)、OracleCommandをカプセル化する新しいクラスを作成し、インスタンス化時にBindByNameをtrueに設定しました。実装の一部は次のとおりです。

public class DatabaseCommand
{
    private OracleCommand _command = null;

    public DatabaseCommand(string sql, OracleConnection connection)
    {
        _command = new OracleCommand(sql, connection)
        {
            BindByName = true
        };
    }

    public int ExecuteNonQuery()
    {
        return _command.ExecuteNonQuery();
    }

    // Rest of impl removed for brevity
}

次に、コマンドをクリーンアップするために必要なのは、OracleCommandを検索し、DatabaseCommandに置き換えてテストすることだけでした。

于 2011-04-20T13:21:44.803 に答える
5

ASPXコードをOracle.DataAcees.Clientに移植した後、SqlDataSource Updateコマンドで同じ問題が発生し、次のようにSqlDataSource OnUpdatingハンドラーのOracleCommand.BindByNameプロパティを変更して解決しました。

protected void SqlDataSource_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
    Oracle.DataAccess.Client.OracleCommand b_OracleCommand = 
                  (Oracle.DataAccess.Client.OracleCommand)e.Command;
    b_OracleCommand.BindByName = true;
}
于 2012-12-19T09:49:09.803 に答える
1

SqlDataSource Updating イベントのハンドラーで BindByName プロパティを設定して、この問題を解決しました。

protected void SqlDataSource1_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
    ((Oracle.ManagedDataAccess.Client.OracleCommand)e.Command).BindByName = true;
    // ...
}
于 2016-04-19T12:52:45.250 に答える
0

次のコードを使用して、TableAdapter の部分クラスを追加し、必要に応じてメソッドまたはプロパティを追加します。

        for (int i = 0; (i < this.CommandCollection.Length); i = (i + 1))
        {
            if ((this.CommandCollection[i] != null))
            {
                ((global::Oracle.DataAccess.Client.OracleCommand)(this.CommandCollection[i])).BindByName = value;
            }
        }
于 2011-06-25T11:24:31.870 に答える