【问题标题】:Trouble inserting DateTime into Access with OleDb使用 OleDb 将 DateTime 插入 Access 时遇到问题
【发布时间】: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() 并将日期保留在更新之外?

标签: c# winforms ms-access


【解决方案1】:

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

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

【讨论】:

  • 我不知何故让它神奇地工作。检查我原来的帖子我做了什么。不知道为什么会这样
  • @TheColonel 我猜结果字符串没有毫秒部分,你试过Now() 函数吗?我认为这更适合你。
  • Now() 函数是否只在 sql 中有效?稍后有几件事将使用相同的 DateTime 连接到该对象
  • 我遇到了同样的问题。我发现如果 DateTime 对象的毫秒分量为 0,它就可以工作。如果它不是 0,则如您所描述的那样失败。
【解决方案2】:

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

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

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

【讨论】:

【解决方案3】:
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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多