将数据类型从datagrid转换为datatable时出错

时间:2017-06-09 20:23:22

标签: c# .net

.net中的初学者:我使用Datagrid显示excel表,当有空记录时,我收到此错误消息 “System.FormatException:'字符串未被识别为有效的DateTime。'”

代码:

for (int i = 0; i < GridView1.Rows.Count - 1; i++)
    {

        command.Parameters.AddWithValue("@Name", GridView1.Rows[i].Cells[0].Text);
        command.Parameters.AddWithValue("@Day_of_the_Week", Convert.ToDateTime(GridView1.Rows[i].Cells[1].Text));
        command.Parameters.AddWithValue("@Hours_Total", GridView1.Rows[i].Cells[2].Text);
        command.ExecuteNonQuery();
        command.Parameters.Clear();
    }

4 个答案:

答案 0 :(得分:1)

您应该尝试转换输入字段并使用转换参数进行设置。如果转换失败,则您需要为字段使用预定义值或将其设置为DBNull.Value(如果数据库可以为该字段接受null)

DateTime minValue = new DateTime(1900,1,1); // Arbitrary for missing values 
command.Parameters.Add("@Name", SqlDbType.NVarChar);
command.Parameters.Add("@Day_of_the_Week", SqlDbType.DateTime);
command.Parameters.AddWithValue("@Hours_Total", SqlDbType.NVarChar);
for (int i = 0; i < GridView1.Rows.Count - 1; i++)
{
    DateTime day;
    if(!DateTime.TryParse(GridView1.Rows[i].Cells[1].Text, out day)
       day = minValue;

    command.Parameters["@Name"].Value = GridView1.Rows[i].Cells[0].Text;
    command.Parameters["@Day_of_the_Week"].Value = day;
    command.Parameters["@Hours_Total"].Value = GridView1.Rows[i].Cells[2].Text;
    command.ExecuteNonQuery();
}

另请注意,我不使用AddWithValue。这是一种方便的方法,但要注意some serious problems。 Add方法允许您准确指定数据类型,并且此数据类型应与您的数据库类型匹配 最后,所有参数都可以在循环外声明,只需在循环内设置值(不需要在每个循环中重新创建它们)

答案 1 :(得分:0)

这几乎检查您尝试检索的单元格的内容是否是有效的日期时间,如果是,则转换为否则返回excel或....的原始信息。

DateTime outDate;
    for (int i = 0; i < GridView1.Rows.Count - 1; i++)
    {

        command.Parameters.AddWithValue("@Name", GridView1.Rows[i].Cells[0].Text);
        command.Parameters.AddWithValue("@Day_of_the_Week", DateTime.TryParse(GridView1.Rows[i].Cells[1].Text, out outDate) ? Convert.ToDateTime(GridView1.Rows[i].Cells[1].Text) : GridView1.Rows[i].Cells[1].Text);
        command.Parameters.AddWithValue("@Hours_Total",  GridView1.Rows[i].Cells[2].Text);
        command.ExecuteNonQuery();
        command.Parameters.Clear();
    }

...如果您的@Day_of_the_Week参数是日期时间类型,则返回日期时间最小日期:

DateTime outDate;
    for (int i = 0; i < GridView1.Rows.Count - 1; i++)
    {

        command.Parameters.AddWithValue("@Name", GridView1.Rows[i].Cells[0].Text);
        command.Parameters.AddWithValue("@Day_of_the_Week", DateTime.TryParse(GridView1.Rows[i].Cells[1].Text, out outDate) ? Convert.ToDateTime(GridView1.Rows[i].Cells[1].Text) : DateTime.MinValue);
        command.Parameters.AddWithValue("@Hours_Total",  GridView1.Rows[i].Cells[2].Text);
        command.ExecuteNonQuery();
        command.Parameters.Clear();
    }

答案 2 :(得分:0)

让自己成为一个帮助函数,单行,即可进行小额检查(如果你知道它可以为NULL,则为NULL),然后决定你想要提供什么作为默认值。我通常为#34;普通原始类型类型制作一个&#34; (意思是CLR&#39; s),一种用于SQL类型。您还可以覆盖可空变体以保证安全。

在你的情况下,由于你正在做UI,你可能需要第三种 - 显示字符串默认值。如果缺少某些日期时间,则相应的默认值可能只是空字符串或短字,例如&#34;未给出&#34;。这方面很大程度上取决于给定UI的目的。

答案 3 :(得分:0)

我不清楚你想在“Day_of_the_Week” - 工作日,数字索引,完整日期之间准确输入的数据类型是什么?

但是,如果只是一个完整的日期时间,您可以使用STRING语法将其附加到SQL中,如“YYYYMMDD”:

DateTime outDate;
IFormatProvider culture = new CultureInfo("en-US", true)

    for (int i = 0; i < GridView1.Rows.Count - 1; i++)
    {

        command.Parameters.AddWithValue("@Name", GridView1.Rows[i].Cells[0].Text);
        command.Parameters.AddWithValue("@Day_of_the_Week",  Datetime.ParseExact(GridView1.Rows[i].Cells[1].Text, "yyyy-MM-dd", culture);
        command.Parameters.AddWithValue("@Hours_Total",  GridView1.Rows[i].Cells[2].Text);
        command.ExecuteNonQuery();
        command.Parameters.Clear();
    }