复制到数据库时 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"。
不要使用字符串承认来构建查询。请改用参数:
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代码。