复制到数据库时 C# 程序中出错

本文关键字:程序 出错 数据库 复制 | 更新日期: 2023-09-27 18:33:11

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"。

复制到数据库时 C# 程序中出错

不要使用字符串承认来构建查询。请改用参数:

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

我还建议:

  • 显式列出插入语句中的列。
  • 对文本框使用描述性名称。

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

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

可以成为

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

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

我投了赞成票,因为这是非常基本的标准错误之一,人们一直不知道自己在做什么。

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

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

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

这在第一个"之前缺少一个',对不起。文本变成的布拉布拉

VALUES(BLABLA'

这是非法的 SQL。

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

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