2

问题:我正在尝试使用 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

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

我的想法不多了。

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

4

2 回答 2

4

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

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;
于 2012-10-16T20:08:24.363 回答
0

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

于 2012-10-18T19:24:02.047 回答