37

動的選択を含むストアド プロシージャがあります。このようなもの:

ALTER PROCEDURE [dbo].[usp_GetTestRecords] 
    --@p1 int = 0, 
    --@p2 int = 0
    @groupId nvarchar(10) = 0
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @query  NVARCHAR(max)

    SET @query = 'SELECT * FROM CUSTOMERS WHERE Id = ' + @groupId
    /* This actually contains a dynamic pivot select statement */

    EXECUTE(@query);
END

SSMS では、ストアド プロシージャは正常に実行され、結果セットが表示されます。

Entity Framework を使用する C#では、 ?のint代わりにを返すことが示されます。IEnumerable

private void LoadTestRecords()
{
    TestRecordsDBEntities dataContext = new TestRecordsDBEntities();
    string id = ddlGroupId.SelectedValue;

    List<TestRecord> list = dataContext.usp_GetTestRecords(id); //This part doesn't work returns int
    GridView1.DataSource = list;
}

の生成関数usp_GetTestRecords

public virtual int usp_GetTestRecords(string groupId)
{
    var groupIdParameter = groupId != null ?
        new ObjectParameter("groupId", groupId) :
        new ObjectParameter("groupId", typeof(string));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("usp_GetTestRecords", groupIdParameter);
}
4

17 に答える 17

31

これは、次のような一時テーブルへの「exec」呼び出しを含むストアド プロシージャがある場合に発生します。

insert into #codes (Code, ActionCodes, Description)
exec TreatmentCodes_sps 0

Entity Framework は、プロシージャによって何を返すべきかについて混乱しているようです。私が遭遇した解決策は、これをsprocの先頭に追加することです:

SET FMTONLY OFF

この後、すべて順調です。

于 2014-10-21T13:39:24.480 に答える
30

私は同じ問題を抱えていて、ここで解決策を見つけました

  1. .edmx に移動します
  2. Model Browser Window/Function Imports でプロシージャを見つけてダブルクリックします
  3. 戻り値の型を必要に応じて変更します
  4. .edmx を保存し、戻り値の型をもう一度確認します。

スクリーンショット

それが今、あなたに必要なものになるはずです。

于 2015-12-08T08:33:04.243 に答える
7

ストアド プロシージャの結果セットに主キーがない場合、Entity Framework は自動的にスカラー値を返します。したがって、Entity Framework がストアド プロシージャの結果セットを返すようにするには、select ステートメントに主キー列を含めるか、主キーを持つ一時テーブルを作成する必要があります。

于 2016-10-10T18:33:04.017 に答える
2

私は同じ問題を抱えていました。戻りフィールドの名前を「AS」キーワードで変更し、問題に対処しました。この問題の 1 つの理由は、列名に SQL Server の予約済みキーワードを使用していることです。

例は休閑地です:

ALTER PROCEDURE [dbo].[usp_GetProducts]

AS
BEGIN

 SET NOCOUNT ON;

 SELECT 
      , p.Id
      , p.Title
      , p.Description AS 'Description'

    FROM dbo.Products AS p
END
于 2016-06-21T04:50:16.657 に答える
2

私が見つけた最善の解決策は、少しごまかすことです。

ストア プロシージャで、すべてにコメントを付け、最初の行に aselect [foo]='', [bar]=''などを入力します。モデルを更新し、マップされた関数に移動して、複合型を選択し、 をクリックしてGet Column InformationからをクリックしますCreate Complex Type

ここで、偽の select にコメントを付け、実際のストア プロシージャ本体のコメントを外します。

于 2018-11-28T02:04:03.107 に答える
1

ストアド プロシージャのモデル クラスを生成したときに、誤ってスカラー戻り結果を選択しました。エンティティ モデルからストアド プロシージャを削除してから、ストアド プロシージャを再度追加する必要があります。ストアド プロシージャのダイアログで、期待する戻り値の型を選択できます。 生成されたコードを編集するだけではいけません.これは今はうまくいくかもしれませんが、モデルに他の変更を加えると、生成されたコードを置き換えることができます.

于 2013-08-15T12:03:24.337 に答える
1

これを行う必要がある場合は、dbcontext の一部を作成し、SqlQuery を使用して必要なデータを返す C# 関数を自分で作成する方がよい場合があります。他のいくつかのオプションに対する利点は次のとおりです。

  1. モデルの更新時に何も変更する必要はありません
  2. 生成されたクラスで直接実行しても上書きされません(上記の誰かがこれをオプションであるかのように言及しています:))
  3. 現在または後で副作用が発生する可能性のある proc 自体に何も追加する必要はありません。

コード例:

 public partial class myEntities
    {
       public List<MyClass> usp_GetTestRecords(int _p1, int _p2, string _groupId)
       {
          // fill out params
          SqlParameter p1 = new SqlParameter("@p1", _p1);
          ...
          obj[] parameters = new object[] { p1, p2, groupId };

          // call the proc
          return this.Database.SqlQuery<MyClass>(@"EXECUTE usp_GetTestRecords @p1, @p2, @groupId", parameters).ToList();
       }
    }
于 2018-01-08T19:38:16.327 に答える
0

私もこの問題を抱えていましたが、何時間もオンラインで検索した後、上記の方法はどれも役に立ちませんでした。最後に、ストア プロシージャが一部のパラメーターを null として取得し、クエリの実行でエラーが発生した場合に発生することを知りました。Entity Framework は、複雑なエンティティ モデルを定義することにより、ストア プロシージャのメソッドを生成します。その null 値により、ストア プロシージャは int 値を返します。

null 値を持つ空の結果セットを提供するストア プロシージャを確認してください。それはあなたの問題を解決します。うまくいけば。

于 2018-08-28T19:53:06.800 に答える
0

に変更するだけ

ALTER PROCEDURE [dbo].[usp_GetTestRecords] 
    --@p1 int = 0, 
    --@p2 int = 0
    @groupId nvarchar(10) = 0
AS
BEGIN
    SET NOCOUNT ON;


    SELECT * FROM CUSTOMERS WHERE Id =  @groupId

END
于 2015-05-16T08:56:40.920 に答える
0

SQL 認証が設定されている場合は、Entity Framework をデータベースに接続するために使用されているユーザー資格情報に、CUSTOMERS テーブルから読み取るための適切な権限があることを確認してください。

Entity Framework が SQL 認証を使用して複雑なオブジェクト (つまり、複数の列を選択するストアド プロシージャ) をマップする場合、そのようなストアド プロシージャ内のいずれかのテーブルに読み取りアクセス許可が設定されていない場合、マッピングは代わりに INT を返します。目的の結果セットの。

于 2020-05-13T16:23:13.950 に答える