1

Oracle 関数の 1 つのラッパーとして使用されている関数をマップしました (実際には、LINQ からその Oracle 関数を呼び出す必要があります)。

私のマッピングは(ストレージモデル)のようになります:

<Function Name="RunTranslate" IsComposable="false" BuiltIn="false">
    <CommandText>
        SELECT Translate(@DataToTranslate using char_cs) AS ResultData FROM dual
    </CommandText>
    <Parameter Name="DataToTranslate" Type="char" Mode="In" />
</Function>

と:

<FunctionImport Name="OracleTranslate" ReturnType="Collection(String)">
    <Parameter Name="DataToTranslate" Mode="In" Type="String" />
</FunctionImport>

私はこの方法でコードからそれを使用しようとします:

using (var context = new TestEntities())
{
    ....

    var result = from myData in context.OracleTranslate("test")
                 select myData;    // Error ORA-00936!
    ....
}

Entity Framework Profiler (EFProf) を使用して、実際に DB に送信されているクエリを確認してみました。傍受されたクエリは次のとおりです。

SELECT Translate('test' /*@DataToTranslate*/ using char_cs) AS ResultData FROM dual

(よく見える)

しかし、私のアプリケーションは次のエラーで停止します: ORA-00936: 式がありません

インターセプトされたクエリを VS2010 のサーバー エクスプローラー クエリ ウィンドウにコピー アンド ペーストすると、機能します。DBは正しいデータを返します!

では、どこに問題があるのでしょうか。私の場合、コードとクエリ ウィンドウの違いは何ですか? 私は彼らが同じプロバイダーを使用していると思っていました...

どうもありがとうございました!

編集

標準の Inet-sniffer を使用して、クエリの実行時にソケットとインターネット経由で送信される実際のデータを確認しました。

そして、それは最初のものと同じではありません!それはまさに私のソース SQL クエリです。

SELECT Translate(@DataToTranslate using char_cs) AS ResultData FROM dual

そのパラメータが認識されていないようですが、なぜですか?

4

1 に答える 1

1

解決策を見つけました。この情報が誰かに役立つことを願っています:

DataToTranslate パラメーターは、"@" ではなく、コロン記号 (":DataToTranslate") でマップする必要があります。

もう1つの重要な経験(私にとって):Entity Framework Profiler(EFProf)は、実際のデータではなく、必要なものを表示します.WiresharkのようなTCPスニファーを使用してそのデータを表示する方がはるかに優れています.

于 2012-08-23T14:14:18.403 に答える