为什么 OleDbCommand 和 OleDbType.Date 不工作,而且没有错误?

Why isn't OleDbCommand and OleDbType.Date not working, and no error?

抱歉这个相当蹩脚的问题...但这是我的困境...

我在这里尽量减少重复代码,因为我有几个类似的查询,只是参数数量不同。

使用 AccessDB(我在这里别无选择)。下面的代码对我有用,但是,当我有一个需要输入的日期时。它没有输入日期,也没有给我任何类型的错误。

public bool DoUpdate(string query, string[] data) {

        using (OleDbConnection conn = new OleDbConnection(this.ConnStr))
        {
            try
            {
                OleDbCommand cmd = new OleDbCommand(query, conn);
                DateTime tmp;
                for (int i = 0; i < data.Length; i++)
                {
                    if (DateTime.TryParse(data[i], out tmp)) // Checks if valid date...
                        cmd.Parameters.Add(new OleDbParameter("?", OleDbType.Date) { Value = tmp.ToString() });
                    else
                        cmd.Parameters.AddWithValue("?", data[i]);
                }
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
            }
            catch (OleDbException ex)
            {
                MessageBox.Show(ex.ErrorCode.ToString() + "\n\n" + ex.Message + "\n\n" + query);
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                    return false;
                }
            }
        }
        return true;
    }

正在使用:

// [ time string is DateTime.Now.ToString("M/dd/yyyy h:mm:ss tt") ]
if ( DB.DoUpdate("UPDATE Loads SET Customer='?', FinishTime=?, Carrier='?', Reference='?', Tags='?', Status='Received' WHERE LoadID = ?",
         new string[] { Item["Customer"], Item["FinishTime"], Item["Carrier"], Item["Reference"], Item["TagIDs"], Item["LoadID"] }) ) { ... }

日期列是 "FinishTime"。请注意,我已经在 SQL 中尝试了几种变体。如:[FinishTime]=? / [Finishtime]=#?# / [FinishTime]='?' / FinishTime='?' ... 另外,是什么让我开始输入 DateTime.TryParse 是因为它不起作用。 (虽然我最初收到了一个错误...)即使我删除了 Parse 代码,也没有错误,并且 SQL 像正常一样传递,也只有日期没有输入。

请注意,我还生成了一个 excel 电子表格,其中包含日期和时间,没有任何问题,因此时间字符串传递得很好。

有什么想法吗?评论?

您在 SQL 中对大部分参数进行了引号,这意味着其他参数不会出现在您期望的位置。您的 SQL 应该是:

UPDATE Loads
SET Customer=?, FinishTime=?, Carrier=?, Reference=?, Tags=?, Status='Received'
WHERE LoadID = ?

此外,我强烈建议不要将所有数据作为字符串传递。如果可以的话,根本不要将 DateTime 值转换为字符串 ,当然不要在 SQL 语句中。您目前拥有:

cmd.Parameters.Add(new OleDbParameter("?", OleDbType.Date) { Value = tmp.ToString() });

这样会更好:

cmd.Parameters.Add("?", OleDbType.Date).Value = tmp;

... 但如果您甚至不需要解析字符串来获取 tmp 就更好了。 (不太清楚日期的来源,以及它是否 必须 作为字符串存在。)

您拥有的 date/string 转换次数越多,格式和文化混乱的空间就越大 - 您只需要一个步骤来格式化日期,下一步就不会解析它'期望整个事情都失败。