为啥 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 插入记录而崩溃
AUTOINCREMENT 不适用于 OleDbCommand