我在访问数据库中插入当前日期时遇到问题。我尝试过各种方法。
这就是我现在所拥有的
OleDbConnection vcon = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=abcd.accdb");
private void Form1_Load(object sender, EventArgs e)
{
vcon.Open();
string vsql = string.Format("insert into pending (val1, val2, val3, val4, val5, date) values('{0}', '{1}', '{2}', '{3}', '{4}', @date)", v1.ToString(), v2.ToString(), v3.ToString(), v4.ToString(), v5.ToString());
OleDbCommand vcom = new OleDbCommand(vsql, vcon);
vcom.Parameters.AddWithValue("@date", DateTime.Now);
vcom.ExecuteNonQuery();
vcom.Dispose();
}
如果我取出日期部分,它会起作用。我尝试了一切,不是使用参数,使用',#,使用不同的格式。我做错了什么?
答案 0 :(得分:2)
请不要从字符串文字构造SQL插入。使用真实参数。正如Preston Guillot所说,OleDb不支持命名参数。无论如何,您使用的@
- 前缀语法特定于SQL Server。
相反,您只需使用问号,并按顺序提供参数。您仍然可以为参数对象指定名称以帮助澄清您的代码,但OleDb提供程序将忽略这些名称。
另一个问题:您使用“date”作为列的名称,这是Access SQL中的保留字(以及大多数其他SQL变体)。要安全地命名该列,您应将其括在方括号中:[date]
。
总之,这就是你应该做的事情:
private string connectionString = "...";
using(var con = new OleDbConnection(connectionString)) {
con.Open();
using(var cmd = con.CreateCommand()) {
cmd.CommandText = @"
insert into [pending] ( [val1], [val2], [val3], [val4], [val5], [date] )
values ( ?, ?, ?, ?, ?, ? )";
// Parameter names are just to clarify what we're doing
cmd.Parameters.AddWithValue("val1", v1);
cmd.Parameters.AddWithValue("val2", v2);
cmd.Parameters.AddWithValue("val3", v3);
cmd.Parameters.AddWithValue("val4", v4);
cmd.Parameters.AddWithValue("val5", v5);
cmd.Parameters.AddWithValue("date", DateTime.Now);
cmd.ExecuteNonQuery();
}
con.Close();
}
答案 1 :(得分:-2)
试试这个。使用#date#而不是''
private void Form1_Load(object sender, EventArgs e)
{
vcon.Open();
string vsql = string.Format("insert into pending (val1, val2, val3, val4, val5, date) values('{0}', '{1}', '{2}', '{3}', '{4}', #{5}#)", v1.ToString(), v2.ToString(), v3.ToString(), v4.ToString(), v5.ToString(), DateTime.Now.Date);
OleDbCommand vcom = new OleDbCommand(vsql, vcon);
vcom.ExecuteNonQuery();
vcom.Dispose();
}
如果不起作用,则发布错误消息。看看出了什么问题。