我有一个函数,用于测试.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;
}
答案 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
中成功初始化。