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

复制到数据库时c#程序出错,c#,database,forms,syntax,C#,Database,Forms,Syntax,错误是: 查询中未处理oledb异常语法错误(缺少运算符) 表达式“2”、“wse”、“22”、“assd” 我投了你一票,因为这是一个非常基本的标准错误,人们总是不知道自己在做什么 问题在于如何将文本框中的字符串放入SQL字符串 首先,有一个错误——通过查看生成的SQL,您应该知道这一点 namespace DB1 { public partial class Form1 : Form { private void button1_Click(object se

错误是:

查询中未处理oledb异常语法错误(缺少运算符) 表达式“2”、“wse”、“22”、“assd”


我投了你一票,因为这是一个非常基本的标准错误,人们总是不知道自己在做什么

问题在于如何将文本框中的字符串放入SQL字符串

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

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();
        }
    }
}
这缺少一个“在第一个之前”,抱歉。当文本变成

...Student VALUES("+textBox1.Text+"'...
这是非法的sql

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


第二,如果你的任何文本框中包含“你真的注定要失败了”——这是一个很好的表达方式(任何版主觉得这不合适,请编辑这个词)。我可以通过操纵文本框来注入任意SQL,这称为SQL注入攻击。请仔细阅读(“SQL注入”作为谷歌的关键字)然后修复它并使用参数。始终如此。这样做会使您在某些项目组中因不知道如何编写安全的SQL代码而被解雇。

不要使用字符串关联来生成查询。请改用参数:

VALUES(BLABLA'
我还建议:

  • 在insert语句中显式列出列
  • 为文本框使用描述性名称

我赞同这样一种观点,即您应该始终使用参数,否则您的数据库将保持打开状态。 比如说,

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 _+"'";

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

您在这里给出了两个查询-为什么?大概只有一个查询失败。请说明失败的地方。此外,您的代码当前容易受到SQL注入攻击-请使用参数化SQL。格式化凌乱的代码,写下关于错误的所有信息,至少在您得到错误的地方,写下quest问题是使用c#将学生的信息存储到ms acess数据库中,错误是cmd.ExceetenOnQueryAre您是否也在编辑以显示新查询的外观?+1给出了SQL注入的示例。
SELECT * FROM tablename WHERE column='';SELECT 'i can hack you if you do this'