SQL Server 和 ADO.NET |异常:"不存在数据时尝试读取无效。



尝试读取从SQL返回的对象时,出现此异常

不存在数据时尝试读取无效

C# 代码:

using (SqlConnection con = new SqlConnection(connection))
{
SqlCommand cmd = new SqlCommand("PROC", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter ParamName1 = new SqlParameter("@Name1", "XYZ123");
SqlParameter ParamName2 = new SqlParameter("@Name2", "1234");
cmd.Parameters.Add(ParamName1);
cmd.Parameters.Add(ParamName2);
con.Open();
try
{
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
string result = rdr["Item"].ToString();
}
rdr.Close();
}
catch (Exception ex)
{
throw ex;
}
}

SQL 动态查询

ALTER PROCEDURE [dbo].[PROC]
@Name1 VARCHAR(128),
@Name2 VARCHAR(128)
AS
BEGIN                           
--DECLARE @Name1 VARCHAR(128) = 'XYZ123',
--        @Name2 VARCHAR(128) = '1234'
--DECLARE @SelectFromTable VARCHAR(MAX)
SET @SelectFromTable = 'SELECT [Item]
FROM [dbo].[' + @Name1 + ']
WHERE [ID] = ' + @Name2 + ' '
EXEC (@SelectFromTable)
--PRINT (@SelectFromTable)
END

我尝试过的

我已经使用 PRINT 函数在 SQL Server 中测试了动态 SQL 查询,以查看我是否从执行的语句中获取了正确的数据,确实如此。我已经查看了我的 C# 代码,但找不到那里的错误。

注意:我使用的是EXEC而不是sp_executesql是的,但我想知道为什么它不适用于EXEC

动态 SQL 看起来可能是错误的 - 尝试替换:

WHERE [ID] = ' + @Name2 + ' '

跟:

WHERE [ID] = ''' + @Name2 + ''''

我会重新设计它以使用sp_executesql。像这样的东西。

ALTER PROC [dbo].[PROC]
(
@Name1 varchar(128), --for an object I would prefer to use sysname instead
@Name2 varchar(128)
) AS
BEGIN                           
DECLARE @SelectFromTable nvarchar(MAX)
SET @SelectFromTable = N'SELECT Item
FROM dbo.' + QUOTENAME(@Name1) + '
WHERE ID = @Name2'
exec sp_executesql @SelectFromTable, N'@Name2 varchar(128)', @Name2 = @Name2
--PRINT (@SelectFromTable)
END

最新更新