9

名前でパラメーターバインディングを行う whichを使用System.Data.OracleClientしており、 CommandText とパラメーターが同期していることを確認しています。

    public string CommandText { get; set; }
    public IEnumerable<OracleParameter> Parameters { get; set; }

    private void VerifyThatAllParametersAreBound()
    {
        var variableNames = Regex.Matches(CommandText, ":\\w+")
            .Cast<Match>().Select(m => m.Value).ToArray();
        var parameteterNames = Parameters.Select(p => p.ParameterName).ToArray();

        var unboundVariables = variableNames.Except(parameteterNames).ToArray();
        if (unboundVariables.Length > 0)
        {
            throw new Exception("Variable in CommandText missing parameter: "
                + string.Join(", ", unboundVariables) + ".");
        }

        var unboundParameters = parameteterNames.Except(variableNames).ToArray();
        if (unboundParameters.Length > 0)
        {
            throw new Exception("Parameter that is not used in CommandText: "
                + string.Join(", ", unboundParameters) + ".");
        }
    }

まだ 1 つのクエリがスローされORA-01008: not all variables boundます。パラメーター値を問題のある CommandText に手動で挿入すると、クエリが実行されるため、CommandText とパラメーター値は問題ないはずです。私は : を変数とパラメーター名の両方のプレフィックスとして使用しており、他のクエリでも機能しています。

この例外の原因を特定するにはどうすればよいですか?

4

5 に答える 5

9

間違いは、NULL 値に DBNull.Value を指定していませんでした。そう

new OracleParameter(":Foo", item.Foo)

で置き換える必要がありました

item.Foo == null 
    ? new OracleParameter(":Foo", DBNull.Value) 
    : new OracleParameter(":Foo", item.Foo)

以前は null チェックなしで ODT.NET で動作していたと思いますが、確認していません。どうやらSystem.Data.OracleClientnull値のパラメータを落としているようです。

于 2011-04-18T10:12:14.720 に答える
3

パラメータ値としてnullを渡すと、「すべての変数がバインドされていません」というメッセージが表示されます。DBNull.Valueを渡すと、OracleClient のどこかで実行時エラーが発生します。NULL を渡すには、string.Emptyを使用します。OracleClient は、すべてのデータベース タイプに対してそれをNULLに変換します。

于 2012-12-06T09:38:02.460 に答える
0

Microsoftは約2年前にADO.NETの一部としてOracleClientを廃止したと思います。

Oracleのデータアクセスコンポーネント(ODAC odp.net)の使用を検討することをお勧めします。OracleParameterクラスを使用して、パラメータを簡単に構築(およびカウントをチェック)できます。ここにあるドキュメントをセットアップしてインストールします。ああ、あなたは彼らのEntity Framework(そしてLINQ)のサポートにも入ることができます(まだベータ版だと思いますか?)。

とにかく真剣に検討する何か。

于 2011-04-15T16:03:15.740 に答える