将DateTime以毫秒插入SQL Server

时间:2015-06-29 22:28:17

标签: c# sql-server datetime npoco

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

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

当我尝试将DateTime00: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的问题!

非常感谢任何帮助。

谢谢,Stefan

2 个答案:

答案 0 :(得分: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.33ms - 所以.385将是"四舍五入"该数据类型为.387。

答案 1 :(得分:1)

我不知道所有细节,但请参阅Otiel在this page上的回答。它似乎与你所看到的相符。

Milliseconds in my DateTime changes when stored in SQL Server

  

这是由于SQL datetime类型的精确性。根据   MSDN:

Datetime values are rounded to increments of .000, .003, or .007 seconds