无法使用OleDb将DateTime插入Access

时间:2012-03-02 04:24:58

标签: c# winforms ms-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);

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

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

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

    dbCmd.Parameters.Add("LabDate", OleDbType.Date).Value = DateTime.Now;

答案 2 :(得分:-1)

<style name="Base.Widget.Design.TabLayout" parent="android:Widget">
        <item name="tabBackground">@drawable/tab_background</item>
        <item name="tabIndicatorColor">@color/colorAccent</item>
        <item name="tabIndicatorHeight">3dp</item>
</style>