Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DateTime2转换随机删除日期和时间之间的空格_C#_Sql Server_Asp.net Core_.net Core_Entity Framework Core - Fatal编程技术网

C# DateTime2转换随机删除日期和时间之间的空格

C# DateTime2转换随机删除日期和时间之间的空格,c#,sql-server,asp.net-core,.net-core,entity-framework-core,C#,Sql Server,Asp.net Core,.net Core,Entity Framework Core,我有一个小的控制台应用程序,可以将CSV文件导入数据库。它位于.NETCore3.1中。导入CSV文件时不会出现任何问题。试图将数据保存到表中时会出现问题。收到的错误是“字符串或二进制数据将被截断。语句已终止。”这是在调用context.SaveChanges()期间收到的。要准确确定错误是什么,请加载探查器以查看有问题的语句。有问题的代码与包含日期和时间的字段相关。从头开始,直到问题的解决 导入的数据位于一列中,如下所示: "20200404121655500" "2020040412175

我有一个小的控制台应用程序,可以将CSV文件导入数据库。它位于.NETCore3.1中。导入CSV文件时不会出现任何问题。试图将数据保存到表中时会出现问题。收到的错误是“字符串或二进制数据将被截断。语句已终止。”这是在调用
context.SaveChanges()
期间收到的。要准确确定错误是什么,请加载探查器以查看有问题的语句。有问题的代码与包含日期和时间的字段相关。从头开始,直到问题的解决

导入的数据位于一列中,如下所示:

"20200404121655500" 
"20200404121755500"
public string Date_And_Time { get; set; }
[Column(TypeName = "DATETIME2(7)")]
public DateTime? Date_And_Time { get; set; }
if (DateTime.TryParseExact(Date_And_Time.Trim()
.PadRight(21, '0')
.Substring(0, 21), "yyyyMMddHHmmssFFFFFFF", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime newDateTime)) 
{ model.Date_And_Time = newDateTime; }
else { model.Date_And_Time = null; }
'2020-04-0412:16:55.5000000' and '2020-04-04 12:17:55.5000000'
导入模型属性的定义如下:

"20200404121655500" 
"20200404121755500"
public string Date_And_Time { get; set; }
[Column(TypeName = "DATETIME2(7)")]
public DateTime? Date_And_Time { get; set; }
if (DateTime.TryParseExact(Date_And_Time.Trim()
.PadRight(21, '0')
.Substring(0, 21), "yyyyMMddHHmmssFFFFFFF", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime newDateTime)) 
{ model.Date_And_Time = newDateTime; }
else { model.Date_And_Time = null; }
'2020-04-0412:16:55.5000000' and '2020-04-04 12:17:55.5000000'
数据模型属性定义如下:

"20200404121655500" 
"20200404121755500"
public string Date_And_Time { get; set; }
[Column(TypeName = "DATETIME2(7)")]
public DateTime? Date_And_Time { get; set; }
if (DateTime.TryParseExact(Date_And_Time.Trim()
.PadRight(21, '0')
.Substring(0, 21), "yyyyMMddHHmmssFFFFFFF", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime newDateTime)) 
{ model.Date_And_Time = newDateTime; }
else { model.Date_And_Time = null; }
'2020-04-0412:16:55.5000000' and '2020-04-04 12:17:55.5000000'
用于将导入的字符串转换为数据模型字段的转换如下:

"20200404121655500" 
"20200404121755500"
public string Date_And_Time { get; set; }
[Column(TypeName = "DATETIME2(7)")]
public DateTime? Date_And_Time { get; set; }
if (DateTime.TryParseExact(Date_And_Time.Trim()
.PadRight(21, '0')
.Substring(0, 21), "yyyyMMddHHmmssFFFFFFF", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime newDateTime)) 
{ model.Date_And_Time = newDateTime; }
else { model.Date_And_Time = null; }
'2020-04-0412:16:55.5000000' and '2020-04-04 12:17:55.5000000'
在调试过程中,当处理两个不同的日期时,将在
模型中按预期设置日期和时间。对象展开以生成所有正确的信息(年、日、小时等)。在执行
SaveChanges
之前,检查对象显示它们都有正确的
DateTime
对象。但是,在执行该命令时会抛出上述SQL异常。检查EF创建的合并命令时,日期的格式不同。详情如下:

"20200404121655500" 
"20200404121755500"
public string Date_And_Time { get; set; }
[Column(TypeName = "DATETIME2(7)")]
public DateTime? Date_And_Time { get; set; }
if (DateTime.TryParseExact(Date_And_Time.Trim()
.PadRight(21, '0')
.Substring(0, 21), "yyyyMMddHHmmssFFFFFFF", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime newDateTime)) 
{ model.Date_And_Time = newDateTime; }
else { model.Date_And_Time = null; }
'2020-04-0412:16:55.5000000' and '2020-04-04 12:17:55.5000000'

第一个在日期和时间之间没有空格,而第二个在日期和时间之间有空格。首先是导致异常的原因。在执行
SaveChanges
时,平均有20条记录被保存,有些记录有空间,有些记录没有空间。我找不到任何模式。我尝试过使用完全相同的日期时间,其中有些有空格,有些没有空格。

经过一些尝试和错误后,我从DateTime切换到DateTimeOffset。这是在数据模型property的属性、同一属性的type属性和TryParseException上完成的。没有其他更改,它运行时没有异常。由于属性的更改导致表字段发生更改,因此需要进行另一次迁移

唯一使用的第三方软件包是导入的CSV,并且成功导入

在分析器中看到了参数化的merge语句抱歉,我没有找到更好的答案

我不知道为什么C#数据类型为DateTime的模型会生成一个字符串,尽管参数本身被指定为DateTime2,传递的值是字符串格式的


我不明白这两种数据类型之间有什么区别,以及它们是如何处理的,这会导致这个问题。我感谢您的评论和帮助

我没有发现任何问题。我只是复制粘贴了你的代码,并且毫无例外地插入了数据<代码>2020-04-04 12:17:55.5000000
-这是你第一次约会吗?首先,EF-Core不生成
MERGE
语句。其次,您还没有显示生成的SQL。我猜您有第三方库,或者正在手动构建SQL,这不是EF问题。我希望EF使用datetime2 SqlType生成正确参数化的查询,但看起来该值可能是作为字符串文本传递的。此外,我预计datetime值格式不正确会出现不同的错误(“从字符串转换日期和/或时间时转换失败”),而不是截断错误。你的问题中似乎少了一些谜题。也许从Profiler提供全文可以提供一些线索。