【问题标题】:ExecuteNonQuery and Return Value from SQL Server, C#从 SQL Server、C# 执行非查询和返回值
【发布时间】:2011-03-24 06:29:25
【问题描述】:

我想为用户提供一个网络服务来插入或更新表格中的一些值。用户输入一个 ID 和三个参数。如果数据库中不存在 ID 我想返回 0,失败或类似。当我测试下面的代码并提供一个不存在的 ID 时,存储过程返回 1 个单元格(返回值)和 0,但状态设置为 1。我猜这是因为我在执行查询时使用了 ToString()它返回 1 个单元格。那么我应该如何改进下面的代码呢?

我在方法中有这段代码:

string status = "";

    SqlParameter[] param = { 
        new SqlParameter("@ID", ID),
        new SqlParameter("@Flag", Flag),
        new SqlParameter("@C_Interval", C_Interval),
        new SqlParameter("@D_Interval", D_Interval)
    };

    status = DatabaseHelper.ExecuteNonQuery("sp_InsertInstruction", param);

return status;

在 ExecuteNonQuery 中,我将存储过程命令传递给数据库

// skipped some of the code this example
    status = cmd.ExecuteNonQuery().ToString();
    return status;

我的存储过程如下:

ALTER PROCEDURE dbo.sp_InsertInstruction
@Flag char(1) = null,
@C_Interval int=null,
@D_Interval int=null,
@ID char(20),

AS

DECLARE @Entity_ID int
SET @Entity_ID = (SELECT ID FROM Entity WHERE ID = @ID)

INSERT INTO Instructions(Flag, C_Interval, D_Interval, Entity_ID)
VALUES (@Flag, @C_Interval, @D_Interval, @Entity_ID)

提前致谢。

【问题讨论】:

    标签: c# sql-server


    【解决方案1】:

    ExecuteNonQuery 返回受影响的行数。在这种情况下,您总是插入一行。

    将您的 SP 更改为如下所示:

    ALTER PROCEDURE dbo.sp_InsertInstruction
        @Flag char(1) = null,
        @C_Interval int=null,
        @D_Interval int=null,
        @ID char(20),
    
    AS
    
    DECLARE @Entity_ID int
    SET @Entity_ID = (SELECT ID FROM Entity WHERE ID = @ID)
    
    IF (@Entity_ID IS NOT NULL)
    BEGIN
        INSERT INTO Instructions(Flag, C_Interval, D_Interval, Entity_ID)
        VALUES (@Flag, @C_Interval, @D_Interval, @Entity_ID)
    END
    

    即仅当实体 ID 确实存在时才插入。

    【讨论】:

      【解决方案2】:

      将此代码放在存储过程的顶部

      ALTER PROCEDURE dbo.sp_InsertInstruction
      @Flag char(1) = null,
      @C_Interval int=null,
      @D_Interval int=null,
      @ID char(20),
      
      AS
      
          IF NOT EXISTS
          (
              SELECT ID 
              FROM Entity 
              WHERE ID = @ID
          )
          BEGIN
              RETURN 0;
          END
      
      -- Your remaining SQL Code here....
      

      【讨论】:

      • 嗯,返回值为 0 但是当我使用 status = cmd.ExecuteNonQuery().ToString();它被设置为 1
      【解决方案3】:

      显示为“1”的返回值是执行查询后返回的总行数。

      这是您可能需要做的事情的草稿,这只是关于您的程序中的数据如何被处理的一个想法 在代码上处理。我正在修改您的 sql 过程以返回您期望的值。

      对于背后的代码:

      using System.Data.SqlClient;
      using System.Data;
      
      public class DBAccess{
          private string strCon = "Data Source=YourServer;Initial Catalog=YourDBName;etc";
          public string GetResult(){
      
              string strQuery = "Exec YourProcedure Param1";
              SqlCommand cmdSql = new SqlCommand(strQuery);
              SqlConnection conSql = new SqlConnection(strCon);
              conSql.Open();
              cmdSql.Connection=conSql;
              SqlDataReader dreSql = cmdSql.ExecuteReader();
              dreSql.Read();
              // here I'm trying to read the item of the row on the column named Result
              return dreSql["Result"].ToString();
      
          }
      }
      

      您的程序:

      ALTER PROCEDURE dbo.sp_InsertInstruction   
          @Flag char(1) = null,   
          @C_Interval int=null,   
          @D_Interval int=null,   
          @ID char(20)      AS      
      
          DECLARE @Entity_ID int   
          SET @Entity_ID = (SELECT ID FROM Entity WHERE ID = @ID)      
      
          if(@Entity_ID is not null)
              begin
                  INSERT INTO Instructions(Flag, C_Interval, D_Interval, Entity_ID)   
                  VALUES (@Flag, @C_Interval, @D_Interval, @Entity_ID)  
      
                  -- this will return as a table with the result of 1
                  select Result='1'
              end
          else
              begin
                  -- this will return as a table with the result of 0
                  select Result='0'
              end
      

      【讨论】:

        猜你喜欢
        • 2011-08-03
        • 1970-01-01
        • 2012-12-16
        • 2011-01-17
        • 2012-10-09
        • 2021-03-26
        • 2011-03-05
        • 2012-04-05
        • 1970-01-01
        相关资源
        最近更新 更多