将格式为 (yyyy-mm-dd HH:mm:ss +TT:TT) 的日期时间插入 SQL 服务器

Insert DateTimes of format (yyyy-mm-dd HH:mm:ss +TT:TT) into SQL Server

我正在尝试构建参数以将日期时间插入数据库,如:

InsertCommand.Parameters.AddWithValue("@TIME1", DateTime.Parse(fubardata[12]));

其中 fubardata[12] 包含 "2015-07-22 13:41:53 +00:00" 并且是一个字符串列表

我在执行查询时得到:

从字符串转换日期 and/or 时间时转换失败。 目标列的类型为 Datetimeoffset(7)

注意:以下内容不适用 数据库没有进行格式化,.net 是我的例子。 [在 https://msdn.microsoft.com/en-us/library/ms187819.aspx 这种字符串格式似乎不是受支持的类型,它还提到它不受堆栈溢出的各种帖子的支持。]

我很难找到合适的转换,或者如何需要呈现日期时间 class 以便 SQL 参数接受它。我曾多次看到以这种格式呈现给我的日期时间数据库数据。我相信有办法。

更新:在参数集语法 InsertCommand.Parameters.AddWithValue("@TIME1", DateTimeOffset.Parse(fubardata[12]));

中使用时,转换为 DateTimeOffset.Parse(fubardata[12]) 仍然抛出相同的异常

更新(解决方案): 我在测试数据库上编写了一个小程序,它只包含一个 ID 列和列 theTime DateTimeOffset(7) 来测试将这些值写入数据库。 一般来说,如果时间以非标准字符串格式出现,我发现将时间写入数据库的最佳方法是:

InsertCommand.Parameters.Add("@[your param]",SqlDbType.DateTimeOffset).Value = "[date as a string]";

FOLLOWS 是我用来测试它的代码。我了解到 SQL 无法处理使用 addwithvalue 时从格式 "yyyy-mm-dd HH:mm:ss +-TT:TT" 的字符串创建的 daytimeoffset / datetime。一个重要的注意事项是,如果您 table 使用 DateTimeOffsets,您应该在插入之前将日期时间转换为该 DateTimeOffset 类型。作为旁注,我觉得

很尴尬
InsertCommand.Parameters.AddWithValue("@[your param]", DateTime.Now)

-不会造成人们一直使用的问题。

    private static void Main()
    {

        SqlConnection DataBaseWriterConnection;
        SqlCommand DataBaseWriterCommand;
        string SqlQueryString;
        List<List<string>> theData = new List<List<string>>();
        List<string> theDataRow1 = new List<string>();
        theDataRow1.Add("2015-07-22 13:41:00 +00:00");
        List<string> theDataRow2 = new List<string>();
        theDataRow2.Add("2015-07-22 13:42:00 +00:00");
        List<string> theDataRow3 = new List<string>();
        theDataRow3.Add("2015-07-22 13:43:00 +00:00");
        theData.Add(theDataRow1);
        theData.Add(theDataRow2);
        theData.Add(theDataRow3);

        DataBaseWriterConnection = new SqlConnection("Server = localhost; database = CA_TakacsTesting; connection timeout=30; Trusted_Connection = Yes");
        try
        {
            DataBaseWriterConnection.Open();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error connecting. Reason:\n" + ex.Message );
        }
        foreach (List<string> aDataRow in theData)
        {
            try
            {
                SqlQueryString = "INSERT INTO DateTimeTesting (theTime) VALUES(@theDateTimeOffset)";


                SqlCommand InsertCommand = new SqlCommand(SqlQueryString, DataBaseWriterConnection);

                InsertCommand.Parameters.Add("@theDateTimeOffset", SqlDbType.DateTimeOffset).Value = aDataRow[0];
                InsertCommand.ExecuteNonQuery();
                Console.WriteLine("No Problems Caused");
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Cannot Write for reason:\n" + ex.Message);
                Console.ReadLine();
            }

        }
        DataBaseWriterConnection.Close();
    }
}

结果数据库输出为:

ID  theTime
1   2015-07-22 13:41:00.0000000 +00:00
2   2015-07-22 13:41:00.0000000 +00:00
3   2015-07-22 13:42:00.0000000 +00:00

这就是我们想要的。

我在这里看到了一些不好的地方:

  1. Sql 服务器中的日期值(包括 DateTime、DateTime2、DateTimeOffset 等) 使用该格式。它们以人类不可读的二进制格式存储。你只看到它们以这种格式作为调试器和查询工具提供的便利,或者当实际将日期值放入原始 SQL 时(并且参数不会创建原始 SQL,所以你很少需要这个)。
  2. Don't use AddWithValue()
  3. 您永远不需要将 DateTimeOffset 值转换为字符串。
  4. 从 DataRow 对象解析字段意味着您有一个查询,该查询应该在单个语句中使用 JOIN 或 INSERT + SELECT 编写。正确构建 SQL,根本不需要在 C# 级别拥有这些数据。

您可以修复点 1-3,如下所示。我们需要了解更多上下文以帮助您解决第 4 点。

InsertCommand.Parameters.Add("@TIME1", SqlDbType.DateTimeOffset).Value = DataRow[12];