复制到数据库时c#程序中的错误

时间:2012-05-05 06:34:37

标签: c# database forms syntax

namespace DB1
{
    public partial class Form1 : Form
    {
        private void button1_Click(object sender, EventArgs e)
        {
            String query="INSERT INTO  Student 
            VALUES("+textBox1.Text+"','"+textBox2.Text+"','"+textBox3.Text+"',
            '"+textBox4.Text+")";

            OleDbConnection conn = new 
            OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;
            Data Source=C:\\Database11.accdb");
            OleDbCommand cmd = new OleDbCommand(query,conn);
            conn.Open();
            cmd.ExecuteNonQuery();
            MessageBox.Show("data stored succesfully");
            conn.Close();
            textBox1.Text = (Convert.ToInt32(textBox1.Text) + 1).ToString();
            textBox2.Text = (Convert.ToInt32(textBox2.Text) + 1).ToString();
            textBox3.Text = (Convert.ToInt32(textBox3.Text) + 1).ToString();
            textBox4.Text = (Convert.ToInt32(textBox4.Text) + 1).ToString();
            textBox1.Focus();

        }
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            autonum();
        }

        private void autonum()
        {
            string query;

            query = "Select max(Stdno) from student";
            OleDbConnection conn = new      
            OleDbConnection("Provider=Micrsoft.ACE.OLEDB.12.0;
            Data Source=datasource");
            OleDbCommand cmd = new OleDbCommand(query,conn);
            conn.Open();
            try
            {
             OleDbDataReader dr =cmd.ExecuteReader();
                if(dr.Read())
                {
                    textBox1.Text = (Convert.ToInt32(dr[0])+1).ToString();
                }
                else
                {
                    textBox1.Text="1001";
                }

                dr.Close();
            }
        catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
               textBox1.Text = "1001";
            }
            conn.Close();
        }
    }
}

错误是:

  

oledb异常未处理查询中的语法错误(缺少运算符)   表达'2','wse','22','assd'。

3 个答案:

答案 0 :(得分:5)

不要使用字符串标注来构建查询。改为使用参数:

string query = "INSERT INTO Student VALUES (@P1, @P2, @P3, @P4)";
// ...
cmd.Parameters.Add(new OleDbParameter("@P1", textBox1.Text));
cmd.Parameters.Add(new OleDbParameter("@P2", textBox2.Text));
cmd.Parameters.Add(new OleDbParameter("@P3", textBox3.Text));
cmd.Parameters.Add(new OleDbParameter("@P4", textBox4.Text));

我还建议:

  • 明确列出insert语句中的列。
  • 为文本框使用描述性名称。

答案 1 :(得分:2)

我认为您应该始终使用参数,否则您将数据库保持打开状态。 例如,

sql = "SELECT * FROM tablename WHERE column='" + var _+"'";

可以成为

SELECT * FROM tablename WHERE column='';SELECT 'i can hack you if you do this'

参数可以防止这种情况发生。

答案 2 :(得分:0)

我赞成你,因为这是一个非常基本的标准错误,人们不知道他们一直在做什么。

您的问题是将字符串中的字符串放入SQL字符串的方式。

首先,有一个错误 - 你应该知道通过查看你生成的SQL。

...Student VALUES("+textBox1.Text+"'...

这是错过了'在第一个之前',抱歉.BLABLA随着文字变成

VALUES(BLABLA'

这是非法的sql。

您应该只是在分配它之后查看查询变量的值,而不是来到这里 - 在调试器中很容易做到,你可以看到你没有形成你认为正在形成的SQL。 / p>

其次,如果你的任何文本框都包含'你确实注定要失败 - 这是一个很好的说法(任何主持人觉得这是不合适的,请编辑一下这个词)。我可以通过操作我们的文本框注入任何我想要的任意SQL,这称为SQL注入攻击。阅读它(“SQL注入”作为谷歌的关键字),然后修复它并使用参数。总是。你这样做会让你在一些项目组中被解雇,因为他们不知道如何编写安全的SQL代码。