【问题标题】:Insert DateTime into Access将日期时间插入 Access
【发布时间】:2012-10-16 19:43:00
【问题描述】:

问题: 我正在尝试使用 C# 中的 Oledb 接口将日期时间插入访问数据库。

黑客解决方案:在不使用 command.Properties 的情况下生成我的插入字符串

我可以毫无问题地将文本插入数据库,但是在尝试 datetime 时,我最终会遇到以下错误:System.Data.OleDb.OleDbException {"Data type mismatch in criteria expression."}

有几篇与此类似的帖子,可惜没有有效的解决方案。

这是我的代码:

void TransferData()
{
    string instCmd = Get_InsertCommand(0); // hard coded table 0 for testing

    Fill_ProductTable_ToInsert();

    con.Open();


    // It would be nice not to have to separate the date indexes
    int[] textIndex = { 0, 1, 2, 3, 4, 7 };
    int[] dateIndex = { 5, 6 };
    try
    {
        foreach (DataRow row in DataToStore.Tables[0].Rows)
        {
            OleDbCommand command = new OleDbCommand();
            command.Connection = con;

            command.CommandText = instCmd;

            foreach(int j in textIndex)
                command.Parameters.AddWithValue("@" + j, row[j]);
            foreach (int j in dateIndex)
            {

                // TESTING CODE
                ///////////////////////////////////////////////////////////////////////////

                string input = "#\'" +DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") +"\'#";
                command.Parameters.AddWithValue("@" + j,    input.ToString());
                Program.WriteLine(input.ToString());

                ///////////////////////////////////////////////////////////////////////////
            }


            command.ExecuteNonQuery();
        }
    }
    finally
    {
        con.Close();
    }
}

string Get_InsertCommand(int i)
{
    string sqlIns = "INSERT INTO " + DataToStore.Tables[0].TableName + " (";
    string temp = "VALUES (";
    for (int j = 0; j < expected_header[i].Length - 1; j++)
    {
        sqlIns += expected_header[i][j] + ", ";
        temp += "@" + j + ", ";
    }

    int lastIndex = expected_header[i].Length -1;
    sqlIns += expected_header[i][lastIndex] + ") ";
    temp += "@" + lastIndex + ")";
    sqlIns += temp;

    return sqlIns;
}

在标有测试代码的区域内,我尝试了所有我能想到的日期时间排列。 我用 # 和 ' 尝试了每种格式 我尝试了这些格式:yyyy-MM-dd、yyyyMMdd、yyyy\MM\dd、yyyy/MM/dd 我也试过 ToOADate() 还有 ToString()、ToShortDateString()

我也尝试将数据库设置为接受 ANSI-92 Sql

我的想法已经不多了。

注意:此代码设置为处理来自多个数据库的多个表,请注意循环...

【问题讨论】:

    标签: c# ms-access oledb


    【解决方案1】:

    正确使用参数,不要担心在查询中连接的日期时间值的格式。 我不明白您为什么要将日期时间值转换为字符串值?

    DateTime theDate = new DateTime(2012,10,16);
    var cmd = new OleDbCommand();
    cmd.CommandText = "INSERT INTO sometable (column) VALUES (@p_bar)";
    cmd.Parameters.Add ("@p_bar", OleDbType.DateTime).Value = theDate;
    

    【讨论】:

    • 同样的错误,使用 OleDbType.Date 和 OleDbType.DBDate 与 datetime 输入的许多变体,包括 DateTime.Now、DateTime.Now.Date、new DateTime(2012,2,3),全部到同样的结局。
    • 执行前将自己生成的sql语句打印到控制台,验证是否正确
    • 如何打印来自 OleDbCommand 对象的完整命令?命令格式正确,适用于字符串值,如果我将数据库中的字段切换为字符串,我可以将日期放入字段中,但我想将日期作为实际日期放入。
    【解决方案2】:

    我能够通过不使用命令属性来解决这个问题。我生成了自己的 sql 输入并将其设置为 cmd.commandText。日期时间到数据库的文本输入是#yyyy-MM-dd#

    【讨论】:

    • 它也需要#dd-MM-yy#。 #dd-MM-yy hh:mm:ss# 和 #hh:mm:ss dd-MM-yy# 也是。
    猜你喜欢
    • 2016-07-16
    • 2012-05-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    相关资源
    最近更新 更多