0

我在访问数据库中插入当前日期时遇到问题。我已经尝试了所有可能的方法。

这就是我现在拥有的

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();
}

如果我取出日期部分,它会起作用。我尝试了一切,不使用参数,使用 ', # ,使用不同的格式。我究竟做错了什么?

4

2 回答 2

2

请不要从字符串文字构造 SQL 插入。使用真实参数。正如 Preston Guillot 所指出的,OleDb 不支持命名参数。无论如何,您使用的@-prefixed 语法是特定于 SQL Server 的。

相反,您只需使用问号,并按顺序提供参数。您仍然可以为参数对象命名以帮助澄清您的代码,但 OleDb 提供程序将简单地忽略这些名称。

另一个问题:您使用“日期”作为列名,这是 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();
}
于 2013-10-23T01:28:17.267 回答
-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();
}

如果不起作用,则发布错误消息。看看出了什么问题。

于 2013-10-23T01:15:19.843 回答