使用DateTime时INSERT INTO语句中的语法错误

时间:2012-04-27 15:33:45

标签: c# ms-access ado.net

我在插入INTO语句中遇到“语法错误,但我无法弄清楚原因。

我将这个陈述与我所做的那些工作相比较,并且找不到结构差异。唯一的区别是,在这一个中,我试图在我的MS Access数据库中保存DateTime。

我的MS Access中的数据库字段为日期/时间设置了一般格式,即MM / DD / YY HH:MM:SS AM(或PM)。我的DateTime格式设置相同。

当我设置断点并完成后,我可以看到传递的DateTime格式是正确的,并且与MS Access中的常规格式匹配。

我确信这个问题在我身上是正确的,但如果我能看到它,我会被愚弄。这是我的代码:

//method to save user input to database
public static void SaveData(ProgramLoginBOL busObject)
{
    try
    {
        String sSQLCommand = "INSERT INTO ProgramLogin ( " +
            "UserName, DateTime) VALUES ('" + busObject.UserName + 
            "','" + busObject.DtDate + "')";

        if (aConnection.State == ConnectionState.Closed)
        {
            aConnection.Open();
        }

        OleDbCommand cmd = aConnection.CreateCommand();
        cmd.CommandText = sSQLCommand;
        // Execute the SQL command
        cmd.ExecuteNonQuery();
        aConnection.Close();

        MessageBox.Show("Data Saved");                 
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
        MessageBox.Show("Error! Data was not saved.");
    }
}

正如我所说,调试显示busObject.DtDate符合MS Access日期/时间格式

3 个答案:

答案 0 :(得分:4)

解决问题的一种方法是使用参数化查询。这样做会让提供者担心类型,并且您不必担心使用单引号分隔字符串值(帮助使用像O'Donnel这样的名称)或者使用#来约定日期值。作为奖励,它可以避免任何SQL注入攻击。

要做到这一点吗?参数的占位符

   string sSQLCommand = "INSERT INTO ProgramLogin ( " +
            "UserName, DateTime) VALUES (?,?)" 

然后添加参数

   cmd.Parameters.AddWithValue("?", busObject.UserName);
   cmd.Parameters.AddWithValue("?", busObject.DtDate);

答案 1 :(得分:1)

使用Access,您必须用#字符包围日期。

因此,请将命令更改为:

String sSQLCommand = "INSERT INTO ProgramLogin (UserName, DateTime) VALUES ('" + busObject.UserName + "',#" + busObject.DtDate + "#)"; 

格式化您的日期字符串,以获得最佳效果:

#2012-04-21 13:21:25#

答案 2 :(得分:1)

您分配给“访问日期/时间”列的显示格式与查询中日期/时间值的正确字符串格式无关。

您可以在DateTime值上调用ToString的相应重载,将其格式化为Access要求,或者,如SLaks所评论,您可以使用参数。使用参数更安全,这也意味着您不必担心值的格式。 OleDb提供商将为您解决这个问题。

相关问题