2

在 SQL Server 中,我创建了一个存储过程,它使用 Open Query 触发一个简单的选择语句(SET NOCOUNT OFF)来从链接服务器查询数据。在 SQL Server 中查询此数据时,会返回正确的结果,例如:

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

我现在有一个 C# WinForms 应用程序,它使用 Entity Framework v4 来访问数据,并希望在代码中访问这个存储过程。

我做了通常的“从数据库更新模型”并添加了存储过程,然后选择添加函数导入(例如称为 getData)。然后我注意到单击“获取列信息”后,我收到了以下消息:

'The selected stored procedure returns no columns'

此时我点击了确定,然后写了一些简单的代码来访问SP(如下):

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

单步执行代码时,结果设置为“-1”。在做了一些阅读之后,有人建议在我所做的存储过程中将 NOCOUNT 设置为 OFF,但没有任何区别。

我不确定为什么这适用于 SQL Server 中的查询而不是实体框架?

有没有办法让这个工作?

提前致谢。

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
-- 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 回答
0

您的查询不返回任何数据,因此不返回行信息。尝试修复您的查询并检查您正在运行的数据库。并修复您选择 *,这是查询数据库的真正糟糕模式。

于 2012-09-24T11:45:05.900 回答