2
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”中的语法错误(缺少运算符)。

4

3 回答 3

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));

我还建议:

  • 明确列出插入语句中的列。
  • 为您的文本框使用描述性名称。
于 2012-05-05T06:43:09.460 回答
2

我支持您应该始终使用参数的概念,否则您会打开数据库。例如,

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

可以变成

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

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

于 2012-05-05T07:06:36.800 回答
0

我支持你,因为这是人们一直不知道自己在做什么的非常基本的标准错误之一。

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

首先,有一个错误——您应该通过查看您生成的 SQL 知道这一点。

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

这在第一个“之前缺少',对不起。BLABLA作为文本变成

VALUES(BLABLA'

这是非法的sql。

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

其次,如果你的任何文本框包含一个 ' 你真的注定要失败 - 这是一种很好的表达方式(任何版主认为这是不恰当的,请删去这个词)。我可以通过操纵我们的文本框来注入任何我想要的任意 SQL,这称为 SQL 注入攻击。阅读它(“SQL 注入”作为 google 的关键字),然后修复它并使用参数。总是。你这样做的方式让你在一些项目组中被解雇,因为你不知道如何编写安全的 SQL 代码。

于 2012-05-05T06:42:14.560 回答