为什么OleDbCommand和OleDbType.Date不工作,没有错误?

时间:2015-09-01 05:48:26

标签: c# datetime ms-access oledb ole

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

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

使用AccessDB(我这里没有选择)。下面的代码对我有用,但是,当我有一个需要输入的日期时。它没有输入日期,也没有给我任何错误。

<td> <a class='btn btn-info btn-md' href="<?php echo base_url('index.php/Welcome/editvendor/'.$row->VendorId); ?>">Edit</a></td>

使用中:

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开头的是它无法正常工作。 (虽然我最初收到错误...)即使我删除了Parse代码,没有错误,并且SQL像正常一样传递,但也没有输入日期。

注意,我还生成了一个excel电子表格,其中包含日期和时间,没有任何问题,因此时间字符串正好被传递。

有什么想法吗?评论

1 个答案:

答案 0 :(得分:4)

您在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开始,那会更好。 (它并不是很清楚日期的来源,以及 是否在那里作为字符串。)

您拥有的日期/字符串转换越多,格式和文化的空间就越大 - 您只需要一步来格式化日期,以便下一步解析它不会期待整件事情失败。