【发布时间】:2012-03-20 15:23:14
【问题描述】:
尝试将一行数据插入 Access 时出现“条件表达式中的数据类型不匹配”错误。在搞砸了一点之后,我将其缩小到 DateTime 是问题所在。
这是我的代码:
class ABGDA
{
private OleDbConnection dbConn;
private OleDbCommand dbCmd;
private OleDbDataReader dbReader;
private string sConnection;
private string sql;
private ABG abg;
public void insertProgressNotes(ABG ABG)
{
abg = ABG;
sConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" +
"Data Source=SimEMR.accdb";
dbConn = new OleDbConnection(sConnection);
dbConn.Open();
sql = "INSERT INTO ABG (AccountNo, LabDate, PAO2, PACO2, SAO2, Bicarbonate, BaseExcess, " +
"O2Setting, SetRate, SetPEEP, FiO2) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
dbCmd = new OleDbCommand();
dbCmd.CommandText = sql;
dbCmd.Connection = dbConn;
dbCmd.Parameters.Add("AccountNo", OleDbType.Integer).Value = abg.AccountNo;
dbCmd.Parameters.Add("LabDate", OleDbType.DBTimeStamp).Value = abg.LabDate;
dbCmd.Parameters.Add("PAO2", OleDbType.Double).Value = abg.PAO2;
dbCmd.Parameters.Add("PACO2", OleDbType.Double).Value = abg.PACO2;
dbCmd.Parameters.Add("SAO2", OleDbType.Double).Value = abg.SAO2;
dbCmd.Parameters.Add("Bicarbonate", OleDbType.Double).Value = abg.Bicarbonate;
dbCmd.Parameters.Add("BaseExcess", OleDbType.Double).Value = abg.BaseExcess;
dbCmd.Parameters.Add("O2Setting", OleDbType.Char).Value = abg.O2Setting;
dbCmd.Parameters.Add("SetRate", OleDbType.Double).Value = abg.SetRate;
dbCmd.Parameters.Add("SetPEEP", OleDbType.Double).Value = abg.SetPeep;
dbCmd.Parameters.Add("FiO2", OleDbType.Double).Value = abg.FiO2;
dbCmd.ExecuteNonQuery();
dbConn.Close();
}
}
abg.LabDate 是使用 DateTime.Now 获得的
奇怪的是,我在另一个类中使用了 DBTimeStamp 作为插入语句,而且似乎工作得很好。有人知道我的问题可能是什么吗?
更新:我似乎找到了一个解决方案,但我不知道它为什么会起作用。我将 abg.LabDate 更改为字符串并保存了当前日期/时间。
abg.LabDate = DateTime.Now.ToString();
然后,当我将其插入数据库时,我将其解析回 DateTime 并且有效...
dbCmd.Parameters.Add("LabDate", OleDbType.DBTimeStamp).Value = DateTime.Parse(abg.LabDate);
【问题讨论】:
-
您能否在插入语句生成的 SQL 上进行打印...您的代码在传递到数据库之前生成的 SQL?您的约会对象可能只需要被八角形(AKA 磅或数字符号)包围
-
@gangreen 我该怎么做呢?当我将鼠标悬停在 dbCmd.CommandText 上时,它仍然只显示我设置的初始字符串
-
@TheColonel 你的 LabDate 会有几毫秒,我认为这不会被访问处理,所以试着截断那部分。
-
我希望您不会遇到语言环境问题,因为您经常会遇到模棱两可的日期,Access 将决定哪个日期应该是美国。如果 LabDate 始终为 Now(),为什么不直接将表中的默认值设置为 Now() 并将日期保留在更新之外?