在 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 parsed
DateTimeobject as
DateTimeand then you can use
AddWithValue `喜欢:
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 格式 [关闭]