如何参数化查询?

时间:2011-02-23 07:50:35

标签: c#

 private void button1_Click(object sender, EventArgs e)
    {
        OleDbCommand cmd = new OleDbCommand();
        cmd.CommandType = CommandType.Text;
        string query = @"insert into Contacts (fname,lname,llnum,mobnum,e-mail,street,city,country) values (@fname,@lname,@llnum,@mobnum,@e-mail,@street,@city,@country)";
        cmd.CommandText = query;//@"insert into Contacts (fname,lname,llnum,mobnum,e-mail,street,city,country) values ('" + textBox1.Text + "','" + textBox2.Text +  "','" + textBox3.Text + "','" + textBox4.Text + "','" + textBox5.Text + "','" + textBox6.Text + "','" + textBox7.Text + "','" + textBox8.Text + "')";
        OleDbParameter myParm = cmd.Parameters.Add("@fname", OleDbType.VarChar, 50);
        myParm.Value = textBox1.Text;
        myParm = cmd.Parameters.Add("@lname", OleDbType.VarChar, 50);
        myParm.Value = textBox2.Text;
        myParm = cmd.Parameters.Add("@llnum", OleDbType.Integer, 12);
        myParm.Value = textBox2.Text;
        myParm = cmd.Parameters.Add("@mobnum", OleDbType.Integer, 12);
        myParm.Value = textBox2.Text;
        myParm = cmd.Parameters.Add("@e-mail", OleDbType.VarChar, 50);
        myParm.Value = textBox2.Text;
        myParm = cmd.Parameters.Add("@street", OleDbType.VarChar, 50);
        myParm.Value = textBox6.Text;
        myParm = cmd.Parameters.Add("@city", OleDbType.VarChar, 50);
        myParm.Value = textBox7.Text;
        myParm = cmd.Parameters.Add("@country", OleDbType.VarChar, 50);
        myParm.Value = textBox8.Text;

        cmd.Connection = myconn;
        myconn.Open();
        cmd.ExecuteNonQuery();
        System.Windows.Forms.MessageBox.Show("User Account Succefully Created", "Caption", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
        myconn.Close();
    }

这是我对字段进行参数化的方法,但我得到“无法将参数值从字符串转换为Int32”。错误

6 个答案:

答案 0 :(得分:1)

您将所有值都指定为参数的“字符串”,这是不正确的。 例如,您已将llnum参数声明为整数,因此您为此参数指定的值应为整数:

    myParm = cmd.Parameters.Add("@llnum", OleDbType.Integer, 12);
    myParm.Value = Convert.ToInt32(textBox2.Text);

答案 1 :(得分:1)

哪里你得到了那个错误?您有各种非文本参数,但您仍然只是尝试为它们提供文本参数值。

就我个人而言,我会自己进行解析,例如

myParm = cmd.Parameters.Add("@llnum", OleDbType.Integer, 12);
myParm.Value = int.Parse(textBox2.Text, ...); // Whatever options you want to use

通过这种方式,您可以完全控制文本转换为数据库参数的方式,而不是依赖数据库提供程序来完全按照您的意愿执行操作 - 如果它确实尝试执行那么< / em>,它可能没有。

(我还建议声明不同的变量,而不是对不同的参数重复使用相同的变量。)

答案 2 :(得分:1)

如果您将使用更容易:

cmd.Parameters.Add("@llnum", OleDbType.Integer, 12).Value =Convert.ToInt32(textbox.text);

问候!

答案 3 :(得分:0)

好吧,如果您有指定类型OleDbType.Integer的参数,则必须提供整数值!

您在此处设置的只是另一个字符串:

myParm = cmd.Parameters.Add("@llnum", OleDbType.Integer, 12);
myParm.Value = textBox2.Text;

你需要做这样的事情:

myParm = cmd.Parameters.Add("@llnum", OleDbType.Integer, 12);
myParm.Value = Convert.ToInt32(textBox2.Text);

然后你需要一步一步地调试,找出错误发生在代码中的 where - 然后修复它。

答案 4 :(得分:0)

您有两个参数定义为Integer,但指定了一个字符串:

    myParm = cmd.Parameters.Add("@llnum", OleDbType.Integer, 12);
    myParm.Value = textBox2.Text;
    myParm = cmd.Parameters.Add("@mobnum", OleDbType.Integer, 12);
    myParm.Value = textBox2.Text;

您应该首先将textBox2.Text的值转换为int,然后分配它。

答案 5 :(得分:0)

您应该使用Convert.ToInt32将整数参数转换为整数 你应该为所有非字符串的类型进行转换。因为TextBox.Text属性是字符串值。