在表中存储时的转换日期

本文关键字:转换 日期 存储 | 更新日期: 2023-09-27 18:01:18

我在DataTable中有一个字段日期

jeudi 12 mars 2015
vendredi 13 mars 2015
samedi 14 mars 2015

我需要将其存储在sql server test的表中,该表具有列datedes类型date

SqlCommand command = new SqlCommand("INSERT INTO [test] ([Datedes]) VALUES('" + dt.Rows[i][j] + "')", con);
command.ExecuteNonQuery();

上面的代码总是在转换日期返回错误。

如何解决?

在表中存储时的转换日期

你需要这样做:

  • rows[i][j]转换为DateTime
  • 在ADO中正确使用参数化的查询。. NET插入日期

编写如下代码:

// this might not work right now - you need to adapt this to that
// you can convert your strings like 'vendredi 13 mars 2015' to a
// valid "DateTime" object
DateTime dateTimeFromRow = Convert.ToDateTime(dt.Rows[i][j]);
// set up your DB connection string    
string connectionString = "....";
// define your insert query with PARAMETERS
string insertQuery = "INSERT INTO [test]([Datedes]) VALUES(@DateDes);";
// use "using" blocks to properly dispose of connection and command    
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand(insertQuery, conn)
{
    //  define and set value for parameter
    command.Parameters.Add("@DateDes", SqlDbType.Date);
    command.Parameters["@DateDes"].Value = dateTimeFromRow;
    // open connection, execute INSERT, close connection        
    conn.Open();
    command.ExecuteNonQuery();
    conn.Close();
}

在您的示例中,您尝试将string插入到date类型表列,这显然是错误的。

取决于你在做什么;

  • date类型列更改为nvarchar并插入字符串
  • 将字符串解析为DateTime,并使用参数化查询插入该值。

对于第一个选项,只需将列类型更改为nvarchar

对于第二个选项,您需要使用fr-FR区域性(如果它不是CurrentCulture)解析字符串并直接传递此值。

var s = "samedi 14 mars 2015";
var dt = DateTime.Parse(s, CultureInfo.GetCultureInfo("fr-FR"));
using (var con = new SqlConnection(conString))
using (var cmd = con.CreateCommand())
{
    cmd.CommandText = "INSERT INTO [test] ([Datedes]) VALUES(@date)";
    cmd.Parameters.Add("@date", SqlDbType.Date).Value = dt;
    con.Open();
    cmd.ExecuteNonQuery();
}

你做错的是你试图解析数据类型字符串到datetime。从你的信息来看,日期时间格式是不合法的。我建议您创建另一个字符串类型的字段来存储'jeudi' 'vendredi'或'samedi'。

用于截断字符串:

        var targetString = "jeudi 12 mars 2015";
        var resultString = "";
        int index;
        foreach (var item in targetString)
        {
            if (int.TryParse(item.ToString(), out index) && !string.IsNullOrWhiteSpace(item.ToString()))
            {
                resultString = targetString.Substring(index);
            }
        }
//resultString == "12 mars 2015"

之后使用:

SqlCommand command = new SqlCommand("INSERT INTO [test] ([Datedes]) VALUES("@date")", con);
command.Parameters.AddWithValue(@date, resultString);
command.ExecuteNonQuery();

不要像你这样添加字符串,因为这是不安全的