将DateTime插入Access

时间:2012-10-16 19:43:01

标签: c# ms-access oledb

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

黑客攻击解决方案:在不使用command.Properties

的情况下生成插入字符串

我可以毫无问题地将文本插入数据库,但在尝试datetime时,我最终会遇到此错误:System.Data.OleDb.OleDbException {“条件表达式中的数据类型不匹配。”}

有几个类似的帖子但是没有可行的解决方案。

这是我的代码:

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

我的想法已经不多了。

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

2 个答案:

答案 0 :(得分:4)

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

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;

答案 1 :(得分:0)

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