Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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# 在SQL Server中插入带毫秒的日期时间_C#_Sql Server_Datetime_Npoco - Fatal编程技术网

C# 在SQL Server中插入带毫秒的日期时间

C# 在SQL Server中插入带毫秒的日期时间,c#,sql-server,datetime,npoco,C#,Sql Server,Datetime,Npoco,两周前我开始了一个新的ASP.NET MVC项目。我正在使用micro-ORM NPoco,我喜欢它 在测试期间,我在将DateTime属性保存到SQL Server 2014 Express中时遇到问题 当我尝试插入DateTime值00:03:28.385时,它以00:03:28.387的形式保存在数据库中。数据库列类型为time(7)。我尝试了datetime2(7),结果总是一样的->00:03:28.387 然后我尝试了普通的System.Data.SqlClient: var ins

两周前我开始了一个新的ASP.NET MVC项目。我正在使用micro-ORM NPoco,我喜欢它

在测试期间,我在将
DateTime
属性保存到SQL Server 2014 Express中时遇到问题

当我尝试插入
DateTime
00:03:28.385
时,它以
00:03:28.387
的形式保存在数据库中。数据库列类型为
time(7)
。我尝试了
datetime2(7)
,结果总是一样的->00:03:28.387

然后我尝试了普通的
System.Data.SqlClient

var insert = "insert into Foo(time) values (@time)";
var conn = new SqlConnection(@"conntionString");
conn.Open();
var cmd = new SqlCommand(insertString.ToString(), _conn);
cmd.Parameters.AddWithValue("@Time",  DateTime.ParseExact("00:03:28.385", "HH:mm:ss.fff", CultureInfo.InvariantCulture));
cmd.ExecuteNonQuery();
结果是一样的:
00:03:28.387

当将时间作为字符串插入时,它将起作用

insert into Foo(time) values ('00:03:28.385')

因此,这不是NPoco的问题。

我不知道所有细节,但请参阅上奥蒂尔的答案。它似乎与你所看到的相符

这是由于SQL日期时间类型的精度造成的。根据 msdn:


如果正确地指定了
SqlCommand
的参数,它就可以正常工作:

string connStr = "server=.;database=Test;Integrated security=SSPI;";
string insertQry = "INSERT INTO dbo.Foo(time) VALUES(@Time);";

using (SqlConnection conn = new SqlConnection(connStr))
using (SqlCommand insertCmd = new SqlCommand(insertQry, conn))
{
    // use proper Parameters syntax - specify SqlDbType!
    insertCmd.Parameters.Add("@time", SqlDbType.Time).Value = TimeSpan.Parse("00:03:28.385");

    conn.Open();
    insertCmd.ExecuteNonQuery();
    conn.Close();
}

我认为
.AddParameterWithValue
可能只是猜错了数据类型,并使用了
SqlDbType.DateTime
,它对应于SQL Server中的
DateTime
类型,精度为3.33毫秒,因此该数据类型的.385将“四舍五入”为.387。

“@Time”在cmd.Parameters.AddWithValue中,它以大写字母“T”开头,但在字符串中,它以小写字母“T”开头。这可能是问题所在吗?从代码和示例来看,您似乎只插入了时间,而不是日期和时间……可能您不应该使用
addwithvalue
,并且明确说明参数数据类型。我怀疑这是因为,
cmd.Parameters.addwithvalue(@time)行,
…将日期时间传递给参数。您应该签出并停止使用
.AddWithValue()
-这可能会导致意外的结果…他们说他们正在使用
时间(7)
datatype。虽然看起来它确实在某个地方被转换为该类型。这不适用,因为OP使用的是时间数据类型,并且指定的精度为7。如果OP使用的是DateTime数据类型,这将是正确的:请注意,到目前为止,这应该是注释/投票,以重复形式结束。jac:我认为它会影响时间、日期、日期ime2和SQL Server中的datetimeoffset:谢谢你的回答!t谢谢@marc_!我刚刚发现时间(SQL Server)和时间跨度(.NET)完美地结合在一起。谢谢!
string connStr = "server=.;database=Test;Integrated security=SSPI;";
string insertQry = "INSERT INTO dbo.Foo(time) VALUES(@Time);";

using (SqlConnection conn = new SqlConnection(connStr))
using (SqlCommand insertCmd = new SqlCommand(insertQry, conn))
{
    // use proper Parameters syntax - specify SqlDbType!
    insertCmd.Parameters.Add("@time", SqlDbType.Time).Value = TimeSpan.Parse("00:03:28.385");

    conn.Open();
    insertCmd.ExecuteNonQuery();
    conn.Close();
}