错误检查int值无效

时间:2014-06-26 12:51:57

标签: c#

我有一个函数,用于测试.csv中的字段是否包含有效的id(在本例中为ProfileID)。我想检查非数字条目并显示错误消息,如果这是真的。但是,我不明白为什么我设置的功能无法捕获错误。导入过程仍然会生成一个错误页面,其中包含以下消息:“将nvarchar值'9b'转换为数据类型int时转换失败”(9B是我在测试.csv文件中的无效值)。

这是代码:

    bool RetVal = true;

    //PROFILEID
    string ProfileID = GetValue(row, (int)ProfileColumns.ProfileId);
    try
    {
        ProfileID = ProfileID.ToLower();
        int profIDCount = 0;

        int pnumber;
        bool presult = Int32.TryParse(ProfileID, out pnumber);

        if (presult == false)
        {
            ErrorLabel.Text += "Error Line " + LineCount + ": on " + ProfileID + " Invalid ProfileID<br />";
            RetVal = false;
        }

        else
        {
            string profIDSqlStr = string.Format("SELECT COUNT(*) AS 'ProfileID' FROM ProductProfile WHERE ProfileID=@ProfileID");
            using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["AbleCommerce"].ToString()))
            {
                SqlCommand cmd = new SqlCommand(profIDSqlStr, cn);
                cmd.Parameters.AddWithValue("@ProfileID", ProfileID);
                cn.Open();

                using (IDataReader reader = cmd.ExecuteReader())
                {
                    if (reader.Read())
                    {

                        profIDCount = Convert.ToInt32(reader["ProfileID"].ToString());
                    }
                    if (profIDCount <= 0)
                    {
                        ErrorLabel.Text += "Error Line " + LineCount + ": on " + ProfileID + " Invalid  Product Profile<br />";
                        RetVal = false;

                    }
                }
                cn.Close();
            }
        }
    }
    catch
    {
        ErrorLabel.Text += "Error Line " + LineCount + ": on " + ProfileID + " Error looking up product profile<br />";
        RetVal = false;
    }

2 个答案:

答案 0 :(得分:0)

原因是这一行:

 cmd.Parameters.AddWithValue("@ProfileID", ProfileID);

您的ProfileID类型为字符串,因此您的C#代码会将其添加为字符串(由单引号括起来),这就是您收到错误的原因。您需要将解析后的值(int)传递给参数。

在try块之外声明你的int变量pnumber并用默认值初始化它。 (不需要,因为范围相同)

只需将pnumber作为参数值。

cmd.Parameters.AddWithValue("@ProfileID", pnumber);

答案 1 :(得分:0)

使用正确的类型,因此当它是int列时不要使用字符串。

替换

cmd.Parameters.AddWithValue("@ProfileID", ProfileID);

cmd.Parameters.AddWithValue("@ProfileID", pnumber);  

pnumber已在Int32.TryParse中成功初始化。