2011-02-21 17 views
8

データセットではなく値を返すストアドプロシージャがあり、EF4を使用するには問題があります。パラメータを使用してストアドプロシージャを呼び出す

私はこれを見てきました:私はモデルに手順を追加し、機能をインポート:http://dotnet.dzone.com/news/how-retrieve-stored-procedureここ

は私がやったことです。

私の最初の問題は、プロシージャのパラメータの名前が@_Parameter_inのようになっていたことです。これにより、EFはp_Parameter_inという名前になりました。最初の文字としてアンダースコアを使用できないためです。その後、ストアドプロシージャを呼び出すと、SQLプロファイラ呼び出しで@p_Parameter_inが見つかることがわかりましたが、もちろんそれに問題がありました。

ここでパラメータの名前を変更し、SQLトレースを調べました。すべてが見た目と機能が素晴らしいです。問題は、私が価値を得ることができないということです。私のコードがどのように見えるかですここで:

System.Data.Objects.ObjectParameter newKey = new System.Data.Objects.ObjectParameter("NewKey_out", typeof(Int32)); 
newKey.Value = 0; 
context.GetNextSurrogateKey_v2("tTest", newKey); 

newKey.Valueを呼び出した後、それは常に0ですか私はそれを設定するどのような値。それは価値をもたらすものではありません。私は私の問題が私はどのように関数をインポートすると思われる。私はScalarsとデータタイプInt32を使用します。何らかの理由で "Create Complex complex type"が無効になっています。誰もがその問題を抱えていた?

答えて

7

あなたが呼び出しているストアドプロシージャが表示されないので、ここで推測しています。ストアドプロシージャで定義されている出力パラメータの値ではなく、ストアドプロシージャによって返されたスカラー値を取得する必要があると思います。

私はあなたがEDM内で新しい機能を定義し、これをストアドプロシージャで指し示したいと思うと思います。簡単にGoogleは、この潜在的な解決策があります。http://www.devtoolshed.com/using-stored-procedures-entity-framework-scalar-return-values

HTH

+0

これは見るべきことですが、私はちょうどこのように動作する手順を変更するかもしれません。現在、スカラー値は返されません。ストアドプロシージャのOUTPUTパラメータに値を割り当てます。 – katit

+0

これはうまくいきません。 「店舗のデータプロバイダから返されたデータリーダーに、要求されたクエリの列が足りない」というエラーが表示される – katit

+0

ストアドプロシージャの最後に@MyValueを配置することで、 – katit

2

をDataReaderオブジェクトが読み取りを終了した後、問題はそのEFプロセスの出力パラメータです。これは通常、DataBind()関数を呼び出した後です。 長い処理手順で同じ問題が発生しました。 ObjectResultで.ToList()関数を使用してこれを解決します。

var rowsCount = new ObjectParameter("RowsCount", typeof(Int32));  
var result = db.GetProductList(pageSize, pageNumber, rowsCount).ToList(); 
this.ProductsCount = (int?)rowsCount.Value; 

FirstOrDefault()関数を使用すると、単一の行または値を解決できます。

0

Jan Remundaと同じ問題がありました。誰かが戻り値の型をIntegerからEntity.Core.Objects.ObjectResult(Integer?)に変更しました。この結果、常に何も返されませんでした。

解決策は、.FirstOrDefault()関数をリターンに追加することによって、EFにストアドプロシージャの戻り値を強制的に読み取らせることでした。