Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过SQLC运行存储过程时,无法在C代码中收到结果_C#_Sql_Stored Procedures_Sql Server 2014 - Fatal编程技术网

C# 通过SQLC运行存储过程时,无法在C代码中收到结果

C# 通过SQLC运行存储过程时,无法在C代码中收到结果,c#,sql,stored-procedures,sql-server-2014,C#,Sql,Stored Procedures,Sql Server 2014,请查找我的表、数据、SP和C代码 表结构: ===================================================== 表数据: ========================================================== 存储过程: ================================================================== C代码: 在这里,当我第一次运行SP时,所有未删除的记录都将移动到临时表中

请查找我的表、数据、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获取输出

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