【问题标题】:Change Datatable Column Date Format更改数据表列日期格式
【发布时间】:2018-02-28 22:29:16
【问题描述】:

我正在处理一个 txt 文件,我必须将该数据插入 mysql 数据库。 所以我在Datatable 中获取该信息,然后我可以在我的gridview 中获取该数据,并且我必须将该数据插入数据库中。我可以这样做,但日期列有问题。

例如,当我尝试插入时,如果我在 datagridview 中有这个日期:12/01/2018 没问题,但如果我有 17/01/2018 没有插入,我已经手动更改并且我已经探测过了.

这是读取的txt:

string LogAutoriz_fileName = Server.MapPath("~/Files/") + User.Identity.Name.ToString() + "_" + Path.GetFileName(fup_LogAutoriz_File.PostedFile.FileName);
    fup_LogAutoriz_File.SaveAs(LogAutoriz_fileName);

    DataTable dt = new DataTable();

    List<string[]> list = new List<string[]>();
    int maxItem = 0;
    using (System.IO.TextReader tr = File.OpenText(LogAutoriz_fileName))
    {
        string line;
        while ((line = tr.ReadLine()) != null)
        {
            string[] items = line.Trim().Split('    ');
            if (maxItem <= items.Count())
            {
                maxItem = items.Count();
            }
            list.Add(items);
        }


        //Crear las columnas del DataTable de Datos
        dt.Columns.Add("Comprobante", typeof(string));
        dt.Columns.Add("Serie_Comprobante", typeof(string));
        dt.Columns.Add("Ruc_Emisor", typeof(string));
        dt.Columns.Add("RazonSoc_Emisor", typeof(string));
        dt.Columns.Add("Fecha_Emision", typeof(string));
        dt.Columns.Add("Fecha_Autoriz", typeof(string));
        dt.Columns.Add("Tipo_Emision", typeof(string));
        dt.Columns.Add("Ident_Receptor", typeof(string));
        dt.Columns.Add("Basura", typeof(string));
        dt.Columns.Add("Clave_Acceso", typeof(string));
        dt.Columns.Add("Numero_Autor", typeof(string));
        dt.Columns.Add("Importe_Total", typeof(string));



        foreach (var items in list)
        {
            dt.Rows.Add(items);
        }


        //cargar al grid
        this.gvwAutorizaciones.DataSource = dt;
        this.gvwAutorizaciones.DataBind();

这是为了在数据库中插入每个 gridview 记录:

try
{
    using (MySqlConnection sqlCon = new MySqlConnection(conn))
    {
        using (MySqlCommand cmd = new MySqlCommand())
        {
            cmd.CommandText = "Insert into autorizaciones " +
                "(comprobante, Serie_Comprobante, Ruc_Emisor, RazonSoc_Emisor, " +
                "Fecha_Emision, Fecha_Autorizacion, " +
                "Tipo_Emision, Ident_Receptor, Clave_Acceso, Numero_Autorizacion) " +
                "values(" +
                "'" + comprob + "', " +
                "'" + serComprob + "', " +
                "'" + rucEmisor + "', " +
                "'" + razSocEmi + "', " +
                "'" + FecEmisor + "', " +
                "'" + FecAutoriz + "', " +
                "'" + tipoEmision + "', " +
                "'" + identRecep + "', " +
                "'" + claveAcceso + "', " +
                "'" + numAutoriz + "')";
            cmd.Connection = sqlCon;
            sqlCon.Open();
            cmd.ExecuteNonQuery();
            sqlCon.Close();
        }
    }
}

catch (MySqlException ex)
{
}

我在 foreach 中调用它,我可以插入记录,但是对于日期,我有这个问题。

有没有办法格式化列数据表,例如“yyyy-mm-dd”?

如果有人可以帮助我,

非常感谢 最好的问候

【问题讨论】:

  • 警告:此代码充满了SQL injection bugs,因为 SQL 语句内联原始内容而没有适当的转义。尽可能考虑使用带有占位符值的准备好的语句
  • 您的日期时间字段在表中的哪一列?是什么格式的?
  • DateTime 变量没有格式。只有当您在某处使用它或调用 ToString 时,它们才会以特定格式表示。如果要将字符串转换为 DateTime,则必须确保它们的格式正确,为此,仅 SO 就有大量的例子。
  • 谢谢VDWWD,对了,我必须处理格式

标签: c# mysql asp.net


【解决方案1】:

我想,您应该更改列的类型,因为它是一种字符串。

DateTime newDate= DateTime.Parse(stringDate);---> 你可以用它把字符串转换成日期,

string s = "13/5/2014 12:00:00 AM";    
var date = DateTime.ParseExact(s, "dd/M/yyyy hh:mm:ss tt",
                                   CultureInfo.InvariantCulture); 

您可以使用上面的代码块来更改日期时间的格式。

您还可以在创建数据表列之前确定它的类型,

DataColumn colDateTime = new DataColumn("DateTimeCol");   
colDateTime.DataType = System.Type.GetType("System.DateTime");

我的意思是,我认为你有类型问题,所以我希望这会有所帮助。

【讨论】:

  • 非常感谢 Rojalin,使用正确的日期格式可以正常工作: var FechaAutorizacion = DateTime.ParseExact( grd_Row.Cells[5].Text.Remove(10,9), "dd/M/yyyy ", CultureInfo.InvariantCulture);
【解决方案2】:

12/01/2018 没问题,但如果我有 17/01/2018 不插入

您的实际值在 DD/MM/YYYY 但插入 mysql,格式为 MM/DD/YYYY。因此,您可以将该特定列值格式化为 MM/DD/YYYY。我正在考虑 identRecep 是一个日期时间字段。

try
 {
   using (MySqlConnection sqlCon = new MySqlConnection(conn))
     {
       using (MySqlCommand cmd = new MySqlCommand())
        {
          cmd.CommandText = "Insert into autorizaciones " +
          "(comprobante, Serie_Comprobante, Ruc_Emisor, RazonSoc_Emisor, " +
          "Fecha_Emision, Fecha_Autorizacion, " +
          "Tipo_Emision, Ident_Receptor, Clave_Acceso, Numero_Autorizacion) " + 
 "values(@comprob,@serComprob,@rucEmisor,@razSocEmi,@FecEmisor,@FecAutoriz,@tipoEmision,@identRecep,@claveAcceso,@numAutoriz)";
     cmd.Parameters.AddWithValue("@comprob", comprob);
     cmd.Parameters.AddWithValue("@serComprob", serComprob);
     cmd.Parameters.AddWithValue("@razSocEmi", razSocEmi);
     cmd.Parameters.AddWithValue("@FecEmisor", FecEmisor);
     cmd.Parameters.AddWithValue("@FecAutoriz", FecAutoriz);
     cmd.Parameters.AddWithValue("@tipoEmision", tipoEmision);
     cmd.Parameters.AddWithValue("@identRecep", DateTime.Parse(identRecep,"MM/DD/YYYY"));
     cmd.Parameters.AddWithValue("@claveAcceso", claveAcceso);
     cmd.Parameters.AddWithValue("@numAutoriz", numAutoriz);
     cmd.Connection = sqlCon;
     sqlCon.Open();
     cmd.ExecuteNonQuery();
     sqlCon.Close();
  }
 }
}
catch (MySqlException ex)
    {
    }

【讨论】:

    【解决方案3】:

    非常感谢 Rojalin,我更改了这部分代码:

    private void RegistrarAutorizacion()
    {
        try
        {
            foreach (GridViewRow grd_Row in this.gvwAutorizaciones.Rows)
            {
                string Comprobante = Convert.ToString(grd_Row.Cells[0].Text.Replace("&nbsp;", ""));
                string SerieComprobante = Convert.ToString(grd_Row.Cells[1].Text.Replace("&nbsp;", ""));
                string RucEmisor = Convert.ToString(grd_Row.Cells[2].Text.Replace("&nbsp;", ""));
                string RazSocEmisor = Convert.ToString(grd_Row.Cells[3].Text.Replace("&nbsp;", ""));
                //DateTime FechaEmision = Convert.ToDateTime(grd_Row.Cells[4].Text.Replace("&nbsp;", ""));
                //DateTime FechaAutorizacion = Convert.ToDateTime(grd_Row.Cells[5].Text.Replace("&nbsp;", ""));
                var FechaEmision = DateTime.ParseExact(
                    grd_Row.Cells[4].Text.Replace("&nbsp;", ""), 
                    "dd/M/yyyy", CultureInfo.InvariantCulture); 
                var FechaAutorizacion = DateTime.ParseExact(
                    grd_Row.Cells[5].Text.Remove(10,9),
                    "dd/M/yyyy", CultureInfo.InvariantCulture); //file text has time, but for my process is not important the hour
    
    
                string TipoEmision = Convert.ToString(grd_Row.Cells[6].Text.Replace("&nbsp;", ""));
                string IdentidadRecepetor = Convert.ToString(grd_Row.Cells[7].Text.Replace("&nbsp;", ""));
                string ClaveAcceso = Convert.ToString(grd_Row.Cells[9].Text.Replace("&nbsp;", ""));
                string NumeroAutorizacion = Convert.ToString(grd_Row.Cells[10].Text.Replace("&nbsp;", ""));
    
    
                autorizDL.RegistrarAutorizacion(
                    Comprobante, SerieComprobante, RucEmisor, RazSocEmisor,
                    Convert.ToDateTime(FechaEmision),
                    Convert.ToDateTime(FechaAutorizacion),
                    TipoEmision, IdentidadRecepetor, ClaveAcceso, NumeroAutorizacion);
    
            }
        }
        catch (System.FormatException sfex) { }
        //catch (Exception ex) { }
    
    }
    

    我可以插入新的数据库条目。 再次感谢。

    最好的问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 2021-04-14
      • 2019-01-20
      • 2020-02-04
      • 1970-01-01
      • 2013-03-01
      • 2019-03-30
      相关资源
      最近更新 更多