Don*_*idh 1 c# sql ms-access ms-access-2007
我正在开发一个程序,该程序从访问数据库中提取字符串字段,从日期中分离出名称(名字和姓氏),然后将名称与日期分开保存在不同的访问数据库中。
除了一些日期值为空之外,我已经完成了所有工作,因此我需要对 SQL 进行参数化,但我无法弄清楚如何使参数化工作。
我已经为变量输入了虚拟值,并将它们添加到表格中就好了。我已经删除了下面代码片段中的其他变量,因为它们都重复了那里的内容。os 是一个包含结构中数据的列表。
string sqlcmd = "INSERT INTO signatures VALUES ('" + os.QASignature + "', 'QADate = @QADATE'";
System.Data.OleDb.OleDbCommand SQLCommand = new System.Data.OleDb.OleDbCommand(sqlcmd, Connection);
using (SQLCommand)
{
SQLCommand.Parameters.Add("@QADATE", System.Data.OleDb.OleDbType.Date).Value = os.QADate;
SQLDataReader = SQLCommand.ExecuteReader();
}
Run Code Online (Sandbox Code Playgroud)
类似以下的内容应该是您想要的:
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
}
Run Code Online (Sandbox Code Playgroud)
如果 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});
}
Run Code Online (Sandbox Code Playgroud)
请注意,您不应该像原始示例中那样混合字符串连接和参数 - 它是其中之一!实际上,它应该只是参数化以防止 SQL 注入,并获得其他好处(例如更容易键入,并且在某些 RDBMS 中,参数化查询性能更好)。
另请注意,OleDBCommand 不会从命名参数中受益 - 参数必须按照它们在 SQL 中出现的顺序添加到查询中。这就是 SQL 查询包含两个问号的原因——它们只是占位符。