Некоторые сомнения связаны с C # CultureInfo и отношениями с SQL Server.

1

Я новичок в С#, и у меня есть следующие сомнения относительно того, как работает класс 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

  • 0
    как сохранить в базу данных из приложения (SqlCommand)? и какой тип данных для столбца базы данных (datetime, varchar)?
  • 0
    Значение datetime имеет тип int, и не имеет значения, как вы его выражаете. Таким образом, сохранение его по типу datetime не изменит значение в отношении свойств культуры. Это будет преобразовано.
Показать ещё 3 комментария
Теги:
sql-server
globalization
cultureinfo

2 ответа

6
Лучший ответ

Речь идет не о культуре, а не о 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 - фактически число (некоторый определенный интервал в определенную эпоху). И поскольку они никогда не повторяются, снова: культура и формат не становятся вовлеченными.

  • 0
    МММ, так вы говорите мне, что если я помещу дату (возьму из моего XML) в поле DateTime, а затем вставлю ее в БД, у меня не возникнет проблем?
  • 0
    хорошо ... и что это будет отображаться, если вместо правильной даты (как <x: LastUpdated> 2014-05-21T17: 00: 38 </ x: LastUpdated>) у меня будет неправильная дата как <x: LastUpdated> 2014 -20-10T17: 00: 38 </ x: Последнее обновление> ???
Показать ещё 2 комментария
2

возможно, вы смущены тем, как читать или записывать данные 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"];
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню