将格式为 (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
这就是我们想要的。
我在这里看到了一些不好的地方:
- Sql 服务器中的日期值(包括 DateTime、DateTime2、DateTimeOffset 等)不 使用该格式。它们以人类不可读的二进制格式存储。你只看到它们以这种格式作为调试器和查询工具提供的便利,或者当实际将日期值放入原始 SQL 时(并且参数不会创建原始 SQL,所以你很少需要这个)。
- Don't use AddWithValue()
- 您永远不需要将 DateTimeOffset 值转换为字符串。
- 从 DataRow 对象解析字段意味着您有一个查询,该查询应该在单个语句中使用 JOIN 或 INSERT + SELECT 编写。正确构建 SQL,根本不需要在 C# 级别拥有这些数据。
您可以修复点 1-3,如下所示。我们需要了解更多上下文以帮助您解决第 4 点。
InsertCommand.Parameters.Add("@TIME1", SqlDbType.DateTimeOffset).Value = DataRow[12];
我正在尝试构建参数以将日期时间插入数据库,如:
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]));
更新(解决方案): 我在测试数据库上编写了一个小程序,它只包含一个 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
这就是我们想要的。
我在这里看到了一些不好的地方:
- Sql 服务器中的日期值(包括 DateTime、DateTime2、DateTimeOffset 等)不 使用该格式。它们以人类不可读的二进制格式存储。你只看到它们以这种格式作为调试器和查询工具提供的便利,或者当实际将日期值放入原始 SQL 时(并且参数不会创建原始 SQL,所以你很少需要这个)。
- Don't use AddWithValue()
- 您永远不需要将 DateTimeOffset 值转换为字符串。
- 从 DataRow 对象解析字段意味着您有一个查询,该查询应该在单个语句中使用 JOIN 或 INSERT + SELECT 编写。正确构建 SQL,根本不需要在 C# 级别拥有这些数据。
您可以修复点 1-3,如下所示。我们需要了解更多上下文以帮助您解决第 4 点。
InsertCommand.Parameters.Add("@TIME1", SqlDbType.DateTimeOffset).Value = DataRow[12];