我收到“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 日期/时间格式匹配
解决该问题的一种方法是改用参数化查询。这样做让提供者担心类型,您不必担心用单引号分隔字符串值(有助于像 O'Donnel 这样的名字)或用 # 日期值。作为奖励,它避免了任何 SQL 注入(inject)攻击。
做这个用途?参数占位符
string sSQLCommand = "INSERT INTO ProgramLogin ( " +
"UserName, DateTime) VALUES (?,?)"
然后再添加参数
cmd.Parameters.AddWithValue("?", busObject.UserName);
cmd.Parameters.AddWithValue("?", busObject.DtDate);
我是一名优秀的程序员,十分优秀!