2

SQL Serverでは、Open Queryを使用してリンクサーバーからデータをクエリする単純なselectステートメント(SET NOCOUNT OFFを使用)を起動するストアドプロシージャを作成しました。SQL Serverでこのデータをクエリすると、正しい結果が返されます。例:

SELECT * FROM OPENQUERY(SERVER, ''SELECT * FROM db.table WHERE field = ' + '''' + '''' + @var+ '''' + ''''')'

これで、Entity Framework v4を使用してデータにアクセスするC#WinFormsアプリケーションがあり、このストアドプロシージャにコードでアクセスしたいと考えています。

通常の「データベースからモデルを更新」を実行し、ストアドプロシージャを追加してから、関数のインポート(たとえば、getDataと呼ばれる)を追加することを選択しました。[列情報を取得]をクリックした後、次のメッセージが表示されました。

'The selected stored procedure returns no columns'

この時点で、[OK]をクリックして、SPにアクセスするための簡単なコードを記述しました(次のように)。

using(var context = new MyContext())
{
    var result = context.getData('paramdata');
}

コードをステップスルーすると、結果は「-1」に設定されます。いくつかの読み取りを行った後、誰かが私が行ったストアドプロシージャでNOCOUNTをOFFに設定することを提案しましたが、違いはありませんでした。

これがSQLServerのクエリから機能するのに、Entity Frameworkでは機能しない理由がわかりませんか?

これを機能させる方法はありますか?

前もって感謝します。

4

3 に答える 3

2

OpenQueryを使用しているため、列リストはSQLサーバーに認識されません。

テーブル変数を作成し、openqueryの結果をその変数に挿入して、テーブル変数から選択してみてください。

declare @t table(ID int, value nvarchar(50))
insert @t (ID, value)
select Id,Value FROM OPENQUERY(SERVER, 'SELECT * FROM db.table')

select ID, Value from @t
于 2012-09-24T12:37:53.403 に答える
0

クエリはデータを返さないため、行情報は返されません。クエリを修正して、実行しているデータベースを確認してください。そして、選択した*を修正します。これは、データベースを検索するための実際の悪いパターンです。

于 2012-09-24T11:45:05.900 に答える
0
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @Query nvarchar(max);
DECLARE @LinkServer varchar(20);
DECLARE @CatalogSch varchar(20);

DECLARE @DIVISION_NO INT;
DECLARE @BLOCK_NO INT;
DECLARE @LOT_NO INT

/* With this code I get the server and catalog (production or develpment environment)*/
EXEC [dbo].[usp_GetLinkServerAndSchema] 'ACTJO', @LinkServer out, @CatalogSch out;

/* Declare the table */
declare @t table(Division_no int, block_no int, lot_no int)

/* Build the query to get the three values */
SET @Query = 'SELECT @DIVISION_NO = [DIVISION_NO], @BLOCK_NO = [BLOCK_NO], @LOT_NO = [LOT_NO] FROM OPENQUERY ('+@LinkServer+',''
          SELECT DIVISION_NO, BLOCK_NO, LOT_NO
            FROM '+@CatalogSch+'.[CSS_PREMISE]
            WHERE ACCOUNT_NO = '+convert(varchar,@account)+''')'

/* execute the query */ 
EXEC sp_executesql @Query, N'@DIVISION_NO INT output, @BLOCK_NO INT output, @LOT_NO INT output', @DIVISION_NO output, @BLOCK_NO output, @LOT_NO output;

/* insert the values into the table */
insert @t (Division_no,block_no,lot_no)
    select @DIVISION_NO, @BLOCK_NO, @LOT_NO;

/* query the temporary table */
select Division_no,block_no,lot_no from @t
于 2014-05-19T15:11:46.723 に答える