在C#中将当前日期插入访问数据库

时间:2013-10-23 01:09:55

标签: c# database ms-access datetime

我在访问数据库中插入当前日期时遇到问题。我尝试过各种方法。

这就是我现在所拥有的

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

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

2 个答案:

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

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