C# 为什么不是';t OLEDB命令和OLEDB类型。日期不起作用,并且没有错误?

C# 为什么不是';t OLEDB命令和OLEDB类型。日期不起作用,并且没有错误?,c#,datetime,ms-access,oledb,ole,C#,Datetime,Ms Access,Oledb,Ole,很抱歉,这个问题有点站不住脚。。。但这是我的困境 我在这里试图尽可能减少重复代码,因为我有几个类似的查询,只是参数计数不同 使用AccessDB(我在这里没有选择)。然而,当我有一个需要输入的日期时,下面的代码对我有效。它没有输入日期,也没有给我任何错误 public bool DoUpdate(string query, string[] data) { using (OleDbConnection conn = new OleDbConnection(this.ConnSt

很抱歉,这个问题有点站不住脚。。。但这是我的困境

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

使用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;
    }
日期列为“FinishTime”。请注意,我在SQL中尝试了几种变体。例如:[FinishTime]=?/[Finishtime]=#?#/[Finishtime]='?'/Finishtime='?'。。。 还有,让我在DateTime.TryParse中加入的原因是它不起作用。(虽然我最初收到了一个错误…)即使我删除了解析代码,没有错误,并且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
,这会更好。(目前还不清楚日期从何而来,也不清楚是否必须以字符串的形式出现。)


日期/字符串转换越多,格式和区域性就越有空间搞乱-只需一个步骤就可以格式化日期,使下一步解析日期时不会失败。

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
,因此根本不需要字符串表示。养成避免不必要的字符串转换的习惯是值得的。谢谢你的建议。我会把它保存在我的日记里,以备将来之用。:)谢谢你的提示。两次调整中的一次解决了这个问题。日期来自用户选择的
DateTimePicker
或“今天”复选框,在我的代码中默认为
DateTime.Today()
。我的代码只在我工作的房子里使用,用于一个不离开大楼的小项目。我不认为文化会把这里搞得一团糟。也许这只是我的业余编码,那时还在做字符串。再次感谢@TonyArnold:在这两种情况下,听起来您应该能够获得
DateTime
,因此根本不需要字符串表示。养成避免不必要的字符串转换的习惯是值得的。谢谢你的建议。我会把它保存在我的日记里,以备将来之用。:)