8

次の .Net コードを実行すると:

using (var c = Shared.DataSources.BSS1.CreateCommand())
{
    c.CommandText = "\r\nSelect c1, c2, c3, rowid \r\nFrom someSpecificTable \r\nWhere c3 = :p0";
    var p = c.CreateParameter() as Oracle.DataAccess.Client.OracleParameter;
    c.Parameters.Add(p);
    p.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2;
    p.DbType = System.Data.DbType.AnsiString;
    p.Size = 20;
    p.Value = "007";
    p.ParameterName = ":p0";
    using (var r = c.ExecuteReader())
    {
        r.Read();
    }
}

次のエラーが表示されます。

ORA-01460: unimplemented or unreasonable conversion requested
ORA-02063: preceding line from XXX

これは私のデータベースではなく、取得した select ステートメントを制御することはできません。そのテーブルはデータベース リンクからのものです。

面白いことに、ExecuteReader の直前に次のコードを追加すると、問題なく動作します。

c.CommandText = c.CommandText.Replace("\r\n", " ");

残念ながら、SQL を制御できないため、私の場合は良い解決策ではありません。そのように変更することはできません。

テーブル自体に関しては、列は c1 Number(5) c2 varchar2(40) c3 varchar2(20) です。

後に続くORA-02063はデータベースリンクに関する何かを示していることは知っていますが、シノニムテーブルを調べたところ、データベースリンクからのものではなく、\r\nがデータベースリンクに影響を与えるとは思いません.

バインドされたパラメーターなしでクエリを実行しようとしましたが、うまくいきましたが、一般的な用語でそうするのは悪い習慣です。

問題は、.Net ベースではない競合ツールが動作しているため、一般的な問題ではないことです。

私自身の環境でも問題を再現できませんでした。これは顧客データベースとサイトです。私はインスタントクライアント11.1.6.20を使用しており、インスタントクライアント11.2.3.0でもテストしました

db は 10 で、db リンクは oracle v8 データベースへのリンクです

どんな助けでもいただければ幸いです

4

4 に答える 4

6

ついに答えを見つけました!!!

調査してコードに反映した後、パラメーターの方向を入出力に変更することで問題が解決したことがわかりました。

p.Direction = ParameterDirection.InputOutput;
于 2014-08-04T14:01:38.417 に答える
2

多くの調査の結果、ODP.NET から使用されるパラメーターをバインドし、DBLINK から V8 Oracle サーバーにテーブルをターゲットにしているという事実がすべてであることがわかりました。

バインドされたパラメーターを削除すると、すべて機能しました。

少し前のことですが、バインドされたパラメーターに送信される文字列の文字列の長さがさまざまであることと関係があると思います。size プロパティを無視したようです。最初のクエリで長さ 10 の文字列を送信し、2 番目の文字列で長さ 12 の文字列を送信すると、そのエラーが発生します。

それに関するオラクルの記事も見つけました: https://community.oracle.com/thread/2460796?tstart=0

およびそのパッチ: https://support.oracle.com/CSP/main/article?cmd=show&type=NOT&id=745005.1

しかし、実際にそれを解決するコードの修正を見つけました-次の回答を参照してください。

これが誰にも役立つことを願っています。

于 2012-11-10T08:11:47.780 に答える