为什么不是OleDbCommand和OleDbType.日期不工作,没有错误

本文关键字:工作 有错误 日期 OleDbCommand OleDbType 为什么不 | 更新日期: 2023-09-27 18:10:42

不好意思,这个问题有点蹩脚…但这是我的困境……

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

使用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='?"…还有,是什么让我输入了日期时间。从TryParse开始,如果它不工作。(虽然我最初收到了一个错误…)即使我删除了Parse代码,也没有错误,SQL也像正常一样传递,只是没有输入日期。

注意,我还生成了一个excel电子表格,上面没有日期和时间的问题,所以时间字符串可以很好地传递。

任何想法?评论?

为什么不是OleDbCommand和OleDbType.日期不工作,没有错误

您在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开始,那就更好了。(不太清楚日期是从哪里来的,以及它是否有在那里作为字符串。)

日期/字符串转换越多,格式和文化就越有可能把事情搞砸——你只需要一步就可以格式化日期,而在下一步的解析中不会出现整个过程失败的情况。