为啥 OleDbCommand 和 OleDbType.Date 不起作用,并且没有错误?

Posted

技术标签:

【中文标题】为啥 OleDbCommand 和 OleDbType.Date 不起作用,并且没有错误?【英文标题】: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 电子表格,没有问题,所以时间字符串传递得很好。

有什么想法吗?评论?

【问题讨论】:

【参考方案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,因此根本不需要字符串表示。养成避免不必要的字符串转换的习惯是值得的。 感谢您的建议。我会把它保存在我的未来的努力中。 :)

以上是关于为啥 OleDbCommand 和 OleDbType.Date 不起作用,并且没有错误?的主要内容,如果未能解决你的问题,请参考以下文章

我一直在使用 OleDbConnection 和 OleDbCommand 插入记录而崩溃

OleDbCommand 的用法

AUTOINCREMENT 不适用于 OleDbCommand

在 OleDbCommand 的插入语句中指定函数

在参数化的 OleDbCommand 中使用 DateTime 的异常

OleDbCommand 在有效的命令文本上抛出异常