像下面这样的东西应该是你想要的:
string sqlcmd = "INSERT INTO signatures (QASignature, QADate) VALUES (?, ?)";
using (System.Data.OleDb.OleDbCommand SQLCommand = new System.Data.OleDb.OleDbCommand(sqlcmd, Connection))
{
SQLCommand.Parameters.Add(new OleDbParameter() { Name = "QASignature", Value = os.QASignature, DbType = DbType.String});
SQLCommand.Parameters.Add(new OleDbParameter() { Name = "QADATE", Value = os.QADate, DbType = DbType.DateTime});
SQLCommand.ExecuteNonQuery(); //Use ExecuteReader or ExecuteScalar when you want to return something
}
如果 os.QADate 可以为空(DateTime?
或System.Nullable<DateTime>
),那么您将执行以下操作:
if(os.QADate == null) //Could easily be os.QADate == DateTime.MinValue too, for example
{
SQLCommand.Parameters.Add(new OleDbParameter() { Name = "@QADATE", Value = DBNull.Value, DbType = DbType.DateTime});
}
else{
SQLCommand.Parameters.Add(new OleDbParameter() { Name = "@QADATE", Value = os.QADate, DbType = DbType.DateTime});
}
请注意,您不应该像在原始示例中那样混合字符串连接和参数 - 它是一个或另一个!实际上,它应该只是参数化以防止 SQL 注入,并获得其他好处(例如更容易键入,并且在某些 RDBMS 中,参数化查询性能更好)。
另请注意,OleDBCommand 不会从命名参数中受益——参数必须按照它们在 SQL 中出现的顺序添加到查询中。这就是 SQL Query 包含两个问号的原因——它们只是占位符。