我正在使用oledb方法在c#程序中执行insert sql命令,因为代码将会显示。
执行了操作,它甚至向我显示了一条消息,我已经在那里指示它是否有效但是当我手动打开数据库时,我使用代码插入的数据不会出现
我使用c#和Acess作为数据库
类型为
的数据库中的表时间=时间/日期
标头=文字
important = int
body = text
至于代码中的变量所有字符串但我使用datetimepicker来允许用户通过选择而不是键入来选择日期
OleDbConnection conn1 = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source = Database.accdb");
conn1.Open();
string sql = "INSERT INTO notes ([time], [Header], [importance], [body])" + "VALUES ('" + dateTimePicker1.Value + "', '" + textBox1.Text + "','" + int.Parse(comboBox1.Text) + "','" + textBox2.Text + "');";
OleDbCommand cmd2 = new OleDbCommand(sql, conn1);
try
{
OleDbDataReader rd2 = cmd2.ExecuteReader();
conn1.Close();
MessageBox.Show("Added");
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
this.Close();
答案 0 :(得分:0)
问题1:在将数据插入数据库时调用ExecuteReader()
方法。
解决方案1:您需要使用ExecuteNonQuery()
方法执行INSERT
,UPDATE
或DELETE
命令。
替换它:
OleDbDataReader rd2 = cmd2.ExecuteReader();
有了这个:
cmd2.ExecuteNonQuery();
问题2:您将DateTime
值分配为time
列作为字符串。如果time
列不支持字符串格式,则INSERT操作将不会成功。
解决方案2:
所以我建议您使用Parameterised queries
,原因如下:
parameterised queries
阻止SQL Injection Attacks
发生。parameterised queries
会向parameters
发送正确的数据类型。 建议:在检查命令执行状态时,需要读取ExecuteNonQuery()
方法的返回值。因为它返回命令执行后插入表中的总行数。因此,只有当返回的计数大于零时,您才能读取并显示成功消息。
完整代码:
int status=0;
OleDbConnection conn1 = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source = Database.accdb");
conn1.Open();
string sql = "INSERT INTO notes ([time], [Header], [importance], [body]) " + "VALUES (?,?,?,?);";
OleDbCommand cmd2 = new OleDbCommand(sql, conn1);
cmd2.Parameters.AddWithValue("@time",dateTimePicker1.Value);
cmd2.Parameters.AddWithValue("@Header",textBox1.Text);
cmd2.Parameters.AddWithValue("@importance",int.Parse(comboBox1.Text) );
cmd2.Parameters.AddWithValue("@body",textBox2.Text);
try
{
status=cmd2.ExecuteNonQuery();
conn1.Close();
if(status>0)
MessageBox.Show("INSERT Command Executed Successfully!");
else
MessageBox.Show("INSERT Command Failed!");
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
this.Close();
答案 1 :(得分:0)
您需要使用ExecuteNonQuery
在数据库上执行插入查询。
cmd2.ExecuteNonQuery();
当您想要从ExecuteReader
查询中检索数据库中的数据时使用 SELECT
。
另请使用参数化查询以避免Sql Injection
string sql = "INSERT INTO notes ([time], [Header], [importance], [body]) VALUES (@time, @header, @importance, @body);";
cmd2.Parameters.AddWithValue("@time", Convert.ToDateTime(dateTimePicker1.Value));
cmd2.Parameters.AddWithValue("@header", textBox1.Text);
cmd2.Parameters.AddWithValue("@importance", Convert.ToInt32(comboBox1.Text));
cmd2.Parameters.AddWithValue("@body", textBox2.Text);
cmd2.ExecuteNonQuery();
答案 2 :(得分:0)
我不是一个非常狡猾的程序员,但实际上你不应该将cmd.executeReader()分配给一个变量我认为你应该只在该行上编写命令以便执行
答案 3 :(得分:0)
尝试这样的事情希望它有所帮助
OleDbConnection conn1 = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source = Database.accdb");
conn1.Open();
string sql = "INSERT INTO notes ([time], [Header], [importance], [body]) " + "VALUES (?,?,?,?);";
OleDbCommand cmd2 = new OleDbCommand(sql, conn1);
cmd2.CommandType = CommandType.Text;
cmd2.Parameters.Add("@time", OleDbType.Date).Value = DateTime.Parse(dateTimePicker1.Value);
cmd2.Parameters.Add("@Header", OleDbType.VarChar).Value = textBox1.Text;
cmd2.Parameters.Add("@importance", OleDbType.Integer).Value = int.Parse(comboBox1.Text);
cmd2.Parameters.Add("@body", OleDbType.VarChar).Value = textBox2.Text;
try
{
status = cmd2.ExecuteNonQuery();
conn1.Close();
if (status > 0)
MessageBox.Show("INSERT Command Executed Successfully!");
else
MessageBox.Show("INSERT Command Failed!");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
this.Close();