1

我在 Insert 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 日期/时间格式匹配

4

3 回答 3

4

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

做这个用?参数的占位符

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

然后稍后添加参数

   cmd.Parameters.AddWithValue("?", busObject.UserName);
   cmd.Parameters.AddWithValue("?", busObject.DtDate);
于 2012-04-27T15:38:10.833 回答
1

使用 Access,您必须用 # 字符将日期括起来。

因此,将您的命令更改为:

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

像这样格式化您的日期字符串以获得最佳结果:

#2012-04-21 13:21:25#
于 2012-04-27T15:39:58.063 回答
1

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

您可以在 DateTime 值上调用适当的重载ToString,以按照 Access 的要求对其进行格式化,或者,正如 SLaks 评论的那样,您可以使用参数。使用参数更安全,也意味着您无需担心值的格式。OleDb 提供者会为您处理这些问题。

于 2012-04-27T15:41:12.330 回答