我正在处理用于验证用户以Excel文件的形式上载的数据的Web表单。代码遍历电子表格中的每一行,并根据各种规则进行检查,其中之一是引用必须是唯一值。我有一个存储过程,是以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)尝试不同的场景,我得到想要的输出如存在参考时为“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
时结果不一致 - 至少如此?它似乎总是读VS一个“1”的价值,但在SSMS变化
编辑:这是我的转换方法的代码:
public static bool ConvertToBool(object value)
{
bool result = false;
if (value != null)
{
bool.TryParse(value.ToString(), out result);
}
return result;
}
在Docnumber上划一个断点。语句评估为True时的值是多少? –
目前它是'12324' - 在[[tbl_TransactionMst]' – Daniel
'转换器的代码在哪里?也许这不符合你的想法。我建议你在调试器中通过convertor.ConvertToBool。 – Polyfun