2015-06-29 4 views
2

Я начал новый проект ASP.NET MVC две недели назад. Я использую микро ORM NPoco, и мне это нравится!Вставить DateTime с миллисекундами в SQL Server

Во время тестирования я столкнулся с проблемой сохранения 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!

Любая помощь была бы принята с благодарностью.

Спасибо, Стефан

+0

«@Time» в cmd.Parameters.AddWithValue начинается с капитала «T», но в вашей строке он начинается с нижнего регистра «t». может ли это быть проблемой? – Peyman

+0

Из кода и примеров видно, что вы вставляете только время, а не дату и время ... – jjczopek

+1

Вероятно, вы не должны использовать 'addwithvalue' и быть явным о параметре datatype. –

ответ

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, который соответствует типу DATETIME на SQL Server, и который имеет точность 3,33 мс - так .385 woul d «округляется» до 0,387 для этого типа данных.

+1

Спасибо @marc_s! Я просто понял, что время (SQL Server) и TimeSpan (.NET) работают идеально вместе. Благодаря! – stevo

1

Я не знаю всех деталей, но увидеть ответ Otiel на this page. Это похоже на то, что вы видите.

Milliseconds in my DateTime changes when stored in SQL Server

Это связано с точностью типа SQL даты и времени. Согласно MSDN:

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

Говорят, что они используют 'datatype' времени (7). Хотя похоже, что он преобразуется в это где-то. –

+1

Это не применяется, поскольку OP использует тип данных времени и задает точность 7 Это было бы правильно, если бы OP использовал тип данных DateTime: https://msdn.microsoft.com/en-us/library/bb677243(v=sql.120).aspx – jac

+0

Обратите внимание, что до сих пор это должно быть комментарий/голосование, чтобы закрыть как дубликат. http://meta.stackoverflow.com/questions/297804/summer-time-is-it-still-acceptable-to-close-as-duplicate –

Смежные вопросы