存储过程提供不一致的返回值

时间:2017-08-24 16:03:23

标签: c# sql-server stored-procedures

我正在处理一个网页表单,该表单验证用户以Excel文件形式上传的数据。代码遍历电子表格中的每一行并检查各种规则,其中一个规则是引用必须是唯一值。我有一个存储过程,它将userIDreferenceNum作为参数:

BEGIN
    SET NOCOUNT ON;

    DECLARE @Status AS BIT

    IF EXISTS (SELECT [TransactionMstID] 
               FROM [dbo].[tbl_TransactionMst] 
               WHERE [TransactionRef] = @DocumentNumber 
                 AND [SupplierID] = @SupplierID)
    BEGIN 
        SET @Status = 0
    END
    ELSE
    BEGIN
        SET @Status = 1
    END

    SELECT @Status AS [Status]
END

当我在SQL Server Management Studio(SSMS)中尝试不同的场景时,我得到了所需的输出,例如a" 0"当参考存在时," 1"当它没有。

问题出现在我的C#代码中,它执行存储过程,但在我的测试中,无论数据是否存在,我都得到相同的结果。

这里是C#的核心:

    bool returnValue = true;

    if (Docnumber != null)
    {
        SqlConnection con = new SqlConnection(GlobalSettings.connection);
        con.Open();

        SqlCommand Cmd = new SqlCommand("p_ValRefNumber", con);
        Cmd.CommandType = System.Data.CommandType.StoredProcedure;

        Cmd.Parameters.AddWithValue("@DocumentNumber", Docnumber);
        Cmd.Parameters.AddWithValue("@SupplierID", SupplierID);

        Cmd.ExecuteNonQuery();

        SqlDataReader dr = Cmd.ExecuteReader();

        while (dr.Read())
        {
            bool Status = convertor.ConvertToBool(dr["Status"]);
            string test = dr["Status"].ToString();
            int testint = convertor.ConvertToInt(dr["Status"].ToString());

            if (Status == false)
            {
                //throw new System.Exception(CEObj.GetErrorDesc(101));
                returnValue = false;
            }
        }

        dr.Close();
        con.Close();
    }

    return returnValue;
}

无论docnumber的价值在测试中,它始终显示为True。我添加了一个断点,以便每次检查然后在SSMS中进行测试,结果会产生冲突。

我的逻辑错了吗? Visual Studio是否以不同方式处理这些值?将其转换为string时,结果如何不一致?似乎总是读取" 1"在VS中,但在SSMS中有所不同

编辑:这是我的转换方法的代码:

public static bool ConvertToBool(object value)
{
        bool result = false;

        if (value != null)
        {
            bool.TryParse(value.ToString(), out result);
        }

        return result;
}

1 个答案:

答案 0 :(得分:2)

bool.TryParse没有做转换器(原文如此)代码认为它做的事情。

如果value参数等于bool.TrueString,则

bool.TryParse返回true,这是文字字符串“True”。它为任何其他值返回false,这意味着它对0和1都返回false。

此外,T-SQL bit values是数字。转换器代码不是必需的 - 只需将返回值转换为Int32并进行比较。

using (var con = new SqlConnection(GlobalSettings.connection))
{
  con.Open();
  using (var cmd = new SqlCommand() { Connection = con, CommandType = CommandType.StoredProcedure, CommandText = "p_ValRefNumber" })
  {
    /* Assuming both parameters are integers.
       Change SqlDbType if necessary. */
    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@DocumentNumber", SqlDbType = SqlDbType.Int, Value = Docnumber });
    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@SupplierID", SqlDbType = SqlDbType.Int, Value = SupplierID });

    using (var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
    {
      return dr.Read() && (Convert.ToInt32(dr["Status"]) == 1)
    }
  }
}