C# 在SQL Server中插入带毫秒的日期时间
两周前我开始了一个新的ASP.NET MVC项目。我正在使用micro-ORM NPoco,我喜欢它 在测试期间,我在将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
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();
}