我正在处理一个网页表单,该表单验证用户以Excel文件形式上传的数据。代码遍历电子表格中的每一行并检查各种规则,其中一个规则是引用必须是唯一值。我有一个存储过程,它将userID
和referenceNum
作为参数:
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;
}
答案 0 :(得分:2)
bool.TryParse
没有做转换器(原文如此)代码认为它做的事情。
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)
}
}
}