【问题标题】:Why isn't OleDbCommand and OleDbType.Date not working, and no error?为什么 OleDbCommand 和 OleDbType.Date 不起作用,并且没有错误?
【发布时间】:2015-09-01 05:48:25
【问题描述】:

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

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

使用 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]=? / [完成时间]=#?# / [完成时间]='?' / 完成时间='?' ... 此外,是什么让我一开始就放入 DateTime.TryParse 是它不起作用。 (虽然我最初收到了错误...)即使我剪掉了 Parse 代码,没有错误,并且 SQL 正常传递,也只有日期没有输入。

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

有什么想法吗?评论?

【问题讨论】:

    标签: c# datetime ms-access oledb ole


    【解决方案1】:

    您在 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 就更好了。 (目前还不清楚日期的来源,以及它是否必须在那里作为字符串。)

    您拥有的日期/字符串转换次数越多,格式和文化就越有可能搞砸 - 您只需要一个步骤来格式化日期,以使下一步解析它不期望整件事都失败了。

    【讨论】:

    • 感谢您的提示。您的两个调整之一解决了这个问题。日期来自用户选择,DateTimePicker 或“今天”复选框,在我的代码中默认为 DateTime.Today()。我的代码仅在我的工作中使用,用于不离开建筑物的小项目。我不认为文化会把它搞砸。也许它只是我的业余编码,那时还在做字符串。再次感谢!
    • @TonyArnold:在这两种情况下,听起来您应该能够获得DateTime,因此根本不需要字符串表示。养成避免不必要的字符串转换的习惯是值得的。
    • 感谢您的建议。我会把它保存在我的未来的努力中。 :)
    猜你喜欢
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多