Я новичок в С#, и у меня есть следующие сомнения относительно того, как работает класс System.Globalization.CultureInfo.
У меня есть следующая ситуация.
В классе я прочитал некоторое значение (из XML с использованием XPath), которое содержит некоторую информацию как некоторое поле данных.
Поэтому у меня есть что-то вроде этого:
System.Globalization.CultureInfo cultureEN = new System.Globalization.CultureInfo("en-GB");
currentDeepSightVuln.LastUpdated = DateTime.Parse(n_alertdocument.SelectSingleNode("./x:LastUpdated", nsmgr).InnerText, cultureEN);
В моем XML файле это поле:
<x:LastUpdated>2014-05-21T17:00:38</x:LastUpdated>
Значит, это значение равно 2014-05-21T17: 00: 38
Запуск моей программы, когда выполняется предыдущая операция (инициализирующая свойство объекта LastUpdate), у меня есть значение свойства LastUpdate: {21/05/2014 17:00:38}.
Как видите, у него есть другой формат, чем значение поля XML. Я думаю, что это довольно нормально, потому что он преобразуется, основываясь на настройках en-GB.
Я сомневаюсь, что если я сохраню свой объект в таблице базы данных (Microsoft SQL Server), у меня возникнет какая-либо проблема или он будет преобразован в исправленную форму из SQL Server?
EDIT 1: Чтобы вставить мой объект в db, я использую что-то вроде этого:
public long insert (DataModel.Vulnerability.Vuln v) {
_strSQL = "";
string strSQLParametri = "";
string query = "";
long newId;
long VulnerabilityAlertDocumentPkValue;
System.Data.Common.DbCommand command;
command = _connection.CreateCommand();
try
{
_transactionBegin();
// [VulnerabilityAlertId] insertion on the DB:
if (v.VulnerabilityAlertId != null)
{
_strSQL = "INSERT INTO VulnerabilityAlertDocument ( [VulnerabilityAlertId] ";
strSQLParametri = " VALUES (@VULNERABILITYALERTID ";
_addParameter(command, "@VULNERABILITYALERTID ", newId);
}
........................................................................
........................................................................
........................................................................
_strSQL += ",[PUBLISHED] ";
strSQLParametri += ", @PUBLISHED ";
_addParameter(command, "@PUBLISHED", v.Published);
........................................................................
........................................................................
........................................................................
query = _strSQL + " ) " + strSQLParametri + " );";
command.CommandText = query;
_executeNoQuery(command);
VulnerabilityAlertDocumentPkValue = _getIdentity();
Debug.WriteLine("PK della tabella VulnerabilityAlertDocumentPkValue: " + VulnerabilityAlertDocumentPkValue);
Tnx
Речь идет не о культуре, а не о en-GB, а не о SQL-сервере; проще, xml определяет даты, указанные в ISO 8601. Это конец.
Вы не должны использовать DateTime.Parse
указав en-GB
с помощью xml. Это неверно.
Правильная реализация:
DateTime when = XmlConvert.ToDateTime(...);
Или более удобно, если вы используете XElement
т.д.
DateTime when = (DateTime)el;
Если вы хотите говорить о датах на SQL-сервере вдали от xml, просто: обрабатывайте их как date
или datetime
(а не строки) - либо с помощью типизированных столбцов, либо с помощью типизированных параметров. Тогда никогда не бывает путаницы по формату или языку.
С вашим редактированием снова это не связано с xml. Предполагая, что v.Published
является DateTime
, и [PUBLISHED]
является datetime
, то он должен работать нормально - эти ценности никогда не строки. DateTime
/datetime
- фактически число (некоторый определенный интервал в определенную эпоху). И поскольку они никогда не повторяются, снова: культура и формат не становятся вовлеченными.
возможно, вы смущены тем, как читать или записывать данные datetime из/в базу данных.
если в базе данных есть столбец datetime
create table anything
(
published datetime
)
когда вы сохраняете его в базе данных, вам нужно сохранить его как объект datetime или действительную строку datetime, потому что есть автоматическое преобразование, если вы передаете параметр как строку.
// Writes.
using (var connection = new SqlConnection("data source=.; initial catalog=master; Integrated Security=True;"))
{
connection.Open();
var command = new SqlCommand("insert into anything (published) values (@published)", connection);
command.Parameters.AddWithValue("@published", "2014-05-21T17:00:38");
// Not working as it will throw "Conversion failed when converting date and/or time from character string.".
//command.Parameters.AddWithValue("@published", "2014-12345-21T17:00:38");
command.ExecuteScalar();
}
но когда вы читаете его из базы данных, он автоматически станет объектом datetime.
// Reads.
using (var connection = new SqlConnection("data source=.; initial catalog=master; Integrated Security=True;"))
{
connection.Open();
var command = new SqlCommand("select * from anything", connection);
var reader = command.ExecuteReader();
while (reader.Read())
{
var publishedDate = (DateTime)reader["published"];
}
}