int的格式不正确

时间:2014-06-13 08:36:04

标签: c# sql-server database datagrid sql-injection

我有一个Form包含3个TextBox,一个comboBox和一个DatagridView,其中一个客户端为TextBox1添加一个int或者在TextBox2或TextBox3中一个Text的一部分,或者对于更多规范,他可以选择一个comboBox1的项目结果显示在dataGridView(numeo_cpte,intitulé_cpte)中。我的问题是我在dataGridview中获得了结果的northig并且int =>转换的错误输入数据的格式不正确

这是我的代码:

private void button5_Click(object sender, EventArgs e)
        {   
            int a =Convert.ToInt32(textBox1.Text); //format of enetered data is incorrect
            String b = textBox3.Text;
            String c = comboBox1.SelectedItem.ToString();
            String d = textBox4.Text;

            SqlConnection connection = new SqlConnection(connectionString);
            connection.Open();
            req="select numero_cpte,intitulé_cpte from compte where numero_cpte='"+a+"' OR intitulé_cpte like '%"+b+"%' OR type_cpte='"+c+"' OR index_full_text_cpte like'%"+d+"%';";       
            SqlCommand sql = new SqlCommand(req,connection); 
            int o = sql.ExecuteNonQuery();
            MessageBox.Show(o + " succès");
            dr = new SqlDataAdapter(req, connection);
            dr.Fill(ds, "compte");
            compteDataGridView.DataSource = ds.Tables["compte"];
            connection.Close();

我添加了一行

        int n=0;
        int a =int.TryParse(textBox1.Text,out n)?n:0;

这就是我得到的,没有错误,但我没有在datagridView中显示任何结果:

enter image description here

我为测试做了“成功” 再次感谢您的帮助

4 个答案:

答案 0 :(得分:2)

如果字符串未格式化为整数,则会发生此错误。 例如:

Convert.ToInt32("1")        // returns 1
Convert.ToInt32("1.1")      // is not in a recognizable format

您应该尝试使用正则表达式首先应用某些格式或使用try / catch语句。如果您仍然遇到问题,可以在此位置设置调试断点并向我们提供textbox1.Text提供的有问题字符串的副本吗?

希望这有帮助!

答案 1 :(得分:2)

添加try catch来处理任何错误并记录它们:

StreamWriter sw=new StreamWriter(path,true);
private void button5_Click(object sender, EventArgs e)
        {  try
           { 
            int a = Int32.Parse(textBox1.Text);
            ///...
            }
            catch (Exception ex)
            {
               sw.WriteLine(ex.Message);
            }
         }

编辑: 正如大多数人所指出的那样,很可能你的问题在于Textbox1没有被有效的字符串重复整数所取代。但无论如何,这个结论必须来自外部日志而不是你的程序,因为它无法处理给定的异常。

答案 2 :(得分:1)

从以下陈述中替换int a =Convert.ToInt32(textBox1.Text);

int n = 0;
int a = int.TryParse(textbox1.Text, out n)?n:0;

在上述情况下,如果textbox1.Text是有效整数,那么您将获得a的结果,否则您将得到0。

答案 3 :(得分:1)

您是否使用此参数检查您的直接查询(如

--Replace the value with actual value
select numero_cpte,intitulé_cpte from compte where numero_cpte=cast(123 as int) OR intitulé_cpte like '%abc%' OR type_cpte='ddd' OR index_full_text_cpte like'%dasdf%';";   

请在您的查询中添加强制转换,并删除 a 参数附近的单引号(')。

req="select numero_cpte,intitulé_cpte from compte where numero_cpte=cast("+a+" as int) OR intitulé_cpte like '%"+b+"%' OR type_cpte='"+c+"' OR index_full_text_cpte like'%"+d+"%';";