无法使用OleDb将DateTime插入Access

尝试在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); 

我认为错误是由于DateTime中存在的毫秒部分将不会由Access处理,因此您可以截断毫秒部分并尝试插入,或者如果它只有DateTime.Now然后使用等效的Now()函数访问。

 insert into table1 (datecolumn) values (Now()) // Date() if not interested in the time part 

我知道这个问题很老了。 但是,在使用Access和MS SQL数据库时,我只是与此相关。 Access中的字段是日期/时间类型,在日期时间类型的MSSQL中。

我的解决方案是使用OleDbType.Date

  dbCmd.Parameters.Add("LabDate", OleDbType.Date).Value = DateTime.Now; 
 OleDbConnection con = new OleDbConnection(); con.ConnectionString = "provider = microsoft.ace.oledb.12.0;data source = E:\\Sohkidatabase\\Sohki.accdb"; OleDbCommand cmd = new OleDbCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = @"INSERT INTO Challan_No(challan,goods,quantity,nwlm,rate,total,ident,taaff,dateissue,nature,factory,expected,palce,date)VALUES (" + labelchallan.Text + ",'" + textGood.Text + "'," + combQuit.Text + "," + combNwlm.Text + "," + textRate.Text + "," + textvalu.Text + ",'" + textIdent.Text + "','" + texttfclass.Text + "','" + dateTimeIssue.Text + "','" + textNatup.Text + "','" + textFact.Text + "','" + textExpDu.Text + "','" + textPlace.Text + "','" + dateTimeDate.Text + "')"; cmd.Connection = con; con.Open(); cmd.ExecuteNonQuery(); System.Windows.Forms.MessageBox.Show("Recrod Succefully Created"); con.Close();