2

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

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

当我尝试将它保存在数据库中的DateTime值插入为. 数据库列类型是. 我试过了,结果总是一样 -> 00:03:28.38700:03:28.38500:03:28.387time(7)datetime2(7)

然后我尝试了平原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 的问题。

4

2 回答 2

3

如果您正确地为您的 指定参数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 毫秒——因此对于该数据类型,0.385 将“四舍五入”为 0.387。

于 2015-06-30T04:42:54.557 回答
1

我不知道所有细节,但请参阅此页面上 Otiel 的回答。它似乎与您所看到的相符。

存储在 SQL Server 中时,我的 DateTime 中的毫秒数会发生变化

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

Datetime values are rounded to increments of .000, .003, or .007 seconds
于 2015-06-29T22:45:34.707 回答