C# 通过SQLC运行存储过程时,无法在C代码中收到结果
请查找我的表、数据、SP和C代码 表结构: ===================================================== 表数据: ========================================================== 存储过程: ================================================================== C代码: 在这里,当我第一次运行SP时,所有未删除的记录都将移动到临时表中,然后所有记录都将移动到删除状态 当我在SQLServer中运行它并提供预期结果时,它将正常工作。这意味着,当我在SQL Server 2014版本中运行此SP时,它将返回未移动到删除状态的表数据。如果再次运行此SP,它将返回空数据。因为,在select语句之后,我已将所有记录移动到delete状态 当我在C中通过sqlcommand运行同一个SP时,它不会返回任何值 如果我要从SP中删除更新查询update extest SET IsDeleted=1或修改更新查询update extest SET DeleteDate=GETUTCDATE,C代码将返回以下输出 根据我的分析,当我更新select语句的where条件中使用的相同字段时,就会出现此问题。在这里,我在update查询中更新了一个IsDeleted字段,相同的字段将在select语句中使用 我已按如下所示更改了SP,但仍然无法从SP获取输出C# 通过SQLC运行存储过程时,无法在C代码中收到结果,c#,sql,stored-procedures,sql-server-2014,C#,Sql,Stored Procedures,Sql Server 2014,请查找我的表、数据、SP和C代码 表结构: ===================================================== 表数据: ========================================================== 存储过程: ================================================================== C代码: 在这里,当我第一次运行SP时,所有未删除的记录都将移动到临时表中
ALTER PROCEDURE UpdateAndSelect
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Result TABLE
(
Id INT,
IsDeleted BIT,
DeleteDate DateTime
)
DECLARE @UpdatedRecordIdList TABLE
(
Id INT
)
UPDATE extest SET IsDeleted = 1
OUTPUT INSERTED.Id INTO @UpdatedRecordIdList
WHERE IsDeleted = 0
INSERT INTO @Result
SELECT * FROM ExTest WHERE Id IN (SELECT Id FROM @UpdatedRecordIdList)
SELECT * FROM @Result
END
有人面临这个问题吗?
有人能帮我找到这个问题的解决方案吗?我已经从代码中删除了cmd.ExecuteNonQuery行。现在一切都会好起来的
出现此问题的原因:
我调用了ExecuteOnQuery和ExecuteReader方法。因此,存储过程已经执行了两次。因此,表值会在第一次执行时得到服务器的更新。第二次运行同一存储过程时,它返回空数据
当我们考虑上面的例子: 调用ExecuteOnQuery方法时更新表值。现在,表数据将如下所示:IsDeleted字段值从0更新为1
Id IsDeleted DeleteDate
1 1 2017-07-10 09:12:03.960
2 1 2017-07-10 09:12:07.000
当运行ExecuteReader方法时,表中的所有记录都被删除。因此,它不会返回任何值。我已经从代码中删除了cmd.ExecuteNonQuery行。现在一切都会好起来的
出现此问题的原因:
我调用了ExecuteOnQuery和ExecuteReader方法。因此,存储过程已经执行了两次。因此,表值会在第一次执行时得到服务器的更新。第二次运行同一存储过程时,它返回空数据
当我们考虑上面的例子: 调用ExecuteOnQuery方法时更新表值。现在,表数据将如下所示:IsDeleted字段值从0更新为1
Id IsDeleted DeleteDate
1 1 2017-07-10 09:12:03.960
2 1 2017-07-10 09:12:07.000
当运行ExecuteReader方法时,表中的所有记录都被删除。因此,它不会返回任何值。标记您正在使用的dbms。该代码是特定于产品的。您知道您正在执行该命令两次吗?ExecuteOnQuery和ExecuteReaderIt不会回答您的问题,但为什么需要在代码中调用ExecuteOnQuery?如果您想获得@Result table的内容,ExecuteReader就足够了。@vitalygolub实际上这就是answer@Crowcoder你说得对。我已删除ExecuteOnQuery。现在它工作得很好。谢谢。标记您正在使用的dbms。该代码是特定于产品的。您知道您正在执行该命令两次吗?ExecuteOnQuery和ExecuteReaderIt不会回答您的问题,但为什么需要在代码中调用ExecuteOnQuery?如果您想获得@Result table的内容,ExecuteReader就足够了。@vitalygolub实际上这就是answer@Crowcoder你说得对。我已删除ExecuteOnQuery。现在它工作得很好。谢谢
using (SqlConnection con = new SqlConnection(connection))
{
using (SqlCommand cmd = new SqlCommand("UpdateAndSelect", con))
{
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
cmd.ExecuteNonQuery();
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
Console.WriteLine("Rows available {0} - {1} ", dr.GetFieldType(0), dr.GetInt32(0));
}
}
}
}
ALTER PROCEDURE UpdateAndSelect
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Result TABLE
(
Id INT,
IsDeleted BIT,
DeleteDate DateTime
)
DECLARE @UpdatedRecordIdList TABLE
(
Id INT
)
UPDATE extest SET IsDeleted = 1
OUTPUT INSERTED.Id INTO @UpdatedRecordIdList
WHERE IsDeleted = 0
INSERT INTO @Result
SELECT * FROM ExTest WHERE Id IN (SELECT Id FROM @UpdatedRecordIdList)
SELECT * FROM @Result
END
Id IsDeleted DeleteDate
1 1 2017-07-10 09:12:03.960
2 1 2017-07-10 09:12:07.000