在 C# 中将字符串转换为 DateTime 并写入 SQL

Posted

技术标签:

【中文标题】在 C# 中将字符串转换为 DateTime 并写入 SQL【英文标题】:Convert string to DateTime in C# and write to SQL 【发布时间】:2016-04-07 13:25:34 【问题描述】:

我正在尝试将我的字符串转换为 DateTime 并将其写入 SQL 表中的 datetime 字段。

string dateTimeString = line.Substring(5, 14);
var date = DateTime.ParseExact(dateTimeString, "dd/MM/yyyy", null).ToString("MM/dd/yyyy");

SqlCommand command = new SqlCommand("INSERT INTO dbo.ODCZYTY (numer_karty,data, rodzaj,obszar,kierunek) VALUES(@numer_karty,@data, @rodzaj, @obszar, @kierunek)", conn);

command.Parameters.AddWithValue("@numer_karty", line.Substring(0, 5));
command.Parameters.AddWithValue("@data", date);
command.Parameters.AddWithValue("@rodzaj", line.Substring(19, 2));
command.Parameters.AddWithValue("@obszar", line[line.Length - 2]);
command.Parameters.AddWithValue("@kierunek", line[line.Length - 1]);

line.Substring(5, 14) = 20160127122843 但我明白了:

从字符串转换日期和/或时间时转换失败

我做错了什么?

【问题讨论】:

你的字段“data”的数据类型是什么? dateTimeString 的值是多少? 哪个 RDBMS(产品和版本)?您应该从不依赖文化特定的日期文字...使用 ISO 8601、ODBC 或通用格式 Read this for examples line.Substring(5, 14) = 20160127122843 如果你对时间不感兴趣,何不把(5,14)改成(5,8)呢? SQL Server 至少会隐式地强制转换... 【参考方案1】:

不要将您的字符串转换为DateTime,然后再转换回字符串,只是为了通过 SQL 参数传递它。您在表中的列可能需要一个 DateTime 值,并且由于您使用 AddWithValue 添加它,它会认为该值是字符串而不是 DateTime. Simple leave the parsedDateTimeobject asDateTimeand then you can useAddWithValue `喜欢:

var date = DateTime.ParseExact(dateTimeString, "dd/MM/yyyy", CultureInfo.InvariantCulture);
//and while adding paramter
command.Parameters.AddWithValue("@data", date);

(也使用CultureInfo.InvariantCulture 而不是null 来解析DateTime,您可能会遇到DateTime 中的默认分隔符与/ 不同的文化问题)

另一种选择是使用Add 明确指定数据库类型,例如:

command.Parameters.Add(new SqlParameter("@data", SqlDbType.DateTime) Value = date);

【讨论】:

我用它:command.Parameters.Add(new SqlParameter("@data", SqlDbType.DateTime) Value = date);我明白了:您不能将字符串转换为 DATATIME @CodeObiect 你带走了最后的ToString()吗?如果您将日期作为键入的日期传递,则无需转换... line.Substring(5, 14) = 20160127122843 我必须写入 SQL。 @CodeObiect,不要将日期转换为字符串。请注意答案中的第一行代码,它正在创建一个 DateTime 对象,而不是字符串。使用它。 但我想将字符串转换为日期。【参考方案2】:

你尝试解析这样的字符串

line.Substring(5, 14) = "20160127122843"

DateTime.ParseExact(dateTimeString, "dd/MM/yyyy", null)

这应该如何工作?试试这个

string dateTimeString = line.Substring(5, 8); //just 8 to get the date only
var d = DateTime.ParseExact(dateTimeString , "yyyyMMdd", CultureInfo.InvariantCulture);

在此之后不要使用ToString() 重新转换日期。只需将其作为键入的日期传递给参数即可。

更新

如果您需要时间,请保留(5,14) 并试试这个

var d = DateTime.ParseExact(dateTimeString , "yyyyMMddHHmmss", CultureInfo.InvariantCulture);

【讨论】:

是的,我这样做!谢谢!你让我开心:)【参考方案3】:

将其转换为 ISO-8601 格式(yyyy-mm-dd 等)以获得完整的清晰度

“MM/dd/yyyy”仅适用于具有 us-english 设置的 SQL Server 安装。

【讨论】:

以上是关于在 C# 中将字符串转换为 DateTime 并写入 SQL的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中将日期字符串转换为 DateTime 对象? [复制]

在 C# 中将 APRIL,03/2013 字符串转换为 DateTime [重复]

在 c# 中将时间字符串转换为不同的 DateTime 格式 [关闭]

在 C# 中将 dateTime 转换为 ISO 格式 yyyy-mm-dd hh:mm:ss [重复]

如何在c#中将字符串转换为日期[重复]

在 C# ASP.net 中将文本框内容转换为 DateTime 格式时出错