我在插入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日期/时间格式
答案 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提供商将为您解决这个问题。