从“布尔”到“日期时间”的转换无效-将日期时间列插入数据库

时间:2019-06-12 12:28:13

标签: c# mysql .net excel datetime

我想写两天的代码,该代码将从MS excel(Office 365)导入数据到datagridview,然后再导入mysql数据库。在这种情况下,我在ms excel表中有工作表:

enter image description here

我做了什么?

我已经编写了将ms excel表格中的数据下载到datagridview并显示它们的代码。

现在我正在尝试将所有数据插入mysql数据库。我将重点放在下面的代码中:

 for (int i = 0; i < datagrdStatus_order.Rows.Count; i++)
                    {
                        MySqlCommand cmd = new MySqlCommand("INSERT IGNORE INTO try1.order_status(ID_WORKER, ID_ORDER, ID_MODULE, ID_PROJECT, AMOUNT_OF_PRODUCTS, BEGIN_DATE, END_DATE) SELECT workers.ID_WORKER, orders.ID_ORDER, module.ID_MODULE, projects.ID, @AMOUNT_OF_PRODUCTS, @BEGIN_DATE, @END_DATE FROM try1.workers INNER JOIN try1.orders INNER JOIN try1.modules INNER JOIN try1.projects WHERE workers.FNAME = @FNAME AND workers.LNAME = @LNAME AND workers.ID_WORKER = @ID_WORKER AND orders.ORDER_DESC = @ORDER_DESC AND orders.ORDER_NUMBER = @ORDER_NUMBER AND modules.NAME = @MODULES_NAME AND projects.PROJECT_NAME = @PROJECT_NAME", connection);

                        DateTime begin_date;

                        bool value = DateTime.TryParse(datagrdStatus_order.Rows[i].Cells[8].Value.ToString(), out begin_date);

                        if (!value)
                        {
                            begin_date = Convert.ToDateTime(value);
                        }

                        DateTime end_date;

                        bool value2 = DateTime.TryParse(datagrdStatus_order.Rows[i].Cells[9].Value.ToString(), out end_date);

                        if (!value2)
                        {
                           end_date = Convert.ToDateTime(value2);
                        }

                        cmd.Parameters.AddWithValue("@ID_WORKER", datagrdStatus_order.Rows[i].Cells[0].Value);
                        cmd.Parameters.AddWithValue("@FNAME", datagrdStatus_order.Rows[i].Cells[1].Value);
                        cmd.Parameters.AddWithValue("@LNAME", datagrdStatus_order.Rows[i].Cells[2].Value);
                        cmd.Parameters.AddWithValue("@ORDER_DESC", datagrdStatus_order.Rows[i].Cells[3].Value);
                        cmd.Parameters.AddWithValue("@NUMBER_ORDER", datagrdStatus_order.Rows[i].Cells[4].Value);
                        cmd.Parameters.AddWithValue("@MODULES_NAME", datagrdStatus_order.Rows[i].Cells[5].Value);
                        cmd.Parameters.AddWithValue("@PROJECT_NAME", datagrdStatus_order.Rows[i].Cells[6].Value);
                        cmd.Parameters.AddWithValue("@AMOUNT_OF_PRODUCTS", datagrdStatus_order.Rows[i].Cells[7].Value);
                        cmd.Parameters.AddWithValue("@BEGIN_DATE", begin_date);
                        cmd.Parameters.AddWithValue("@END_DATE", end_date);
                        cmd.ExecuteNonQuery();
                    }

然后我编译了该代码,但有一个例外:

  

从“布尔”到“日期时间”的无效转换

并将其指向代码行:

 begin_date = Convert.ToDateTime(value);

我正在寻找其他解决方案,但我仍然不知道如何解决。有任何想法吗?寻求帮助。

3 个答案:

答案 0 :(得分:-1)

您有value作为布尔类型

 bool value = DateTime.TryParse(datagrdStatus_order.Rows[i].Cells[8].Value.ToString(), out begin_date);

然后您将其称为:Convert.ToDateTime(value); 之所以抛出异常,是因为Convert.ToDateTime()接受的是DateTime数据类型,而不是bool类型。

答案 1 :(得分:-1)

您要尝试检查DateTime的值是否正确?

解决方案很简单。您应该将DateTime?变量使用bool而不是value。这表示一个Nullable DateTime

答案 2 :(得分:-1)

如果解析成功,

DateTime.TryParse 只会返回布尔值。 “ out”参数是返回值,应该很有趣。

这两个ifs对我来说都是不必要的。当 DateTime.TryParse 返回false时,无法将字符串解析为datetime。您应该查看 datagrdStatus_order.Rows [i] .Cells [8] .Value.ToString()给您的内容,以及是否可以将其解析为DateTime。

也许documentation应该更清楚