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'。
答案 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));
我还建议:
答案 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代码。