有些疑问与C#CultureInfo和与SQL Server的关系有关

And*_*ili 1 c# sql sql-server globalization cultureinfo

我是C#的新手,我对如何使用System.Globalization.CultureInfo类有以下疑问.

我有以下情况.

在类中,我读取了一些值(来自使用XPath的XML),其中包含一些信息作为某些数据字段.

所以我有类似的东西:

System.Globalization.CultureInfo cultureEN = new System.Globalization.CultureInfo("en-GB");

currentDeepSightVuln.LastUpdated = DateTime.Parse(n_alertdocument.SelectSingleNode("./x:LastUpdated", nsmgr).InnerText, cultureEN);
Run Code Online (Sandbox Code Playgroud)

在我的XML文件中,此字段为:

<x:LastUpdated>2014-05-21T17:00:38</x:LastUpdated>
Run Code Online (Sandbox Code Playgroud)

所以它的价值是2014-05-21T17:00:38

在执行上一个操作(初始化LastUpdate对象属性)时运行我的程序我有**LastUpdate属性值是:{21/05/2014 17:00:38}.

如您所见,它有另一种格式而不是XML字段值.我认为这很正常,因为它是基于en-GB设置进行转换的.

我的疑问是:如果那时我将我的对象保存在数据库表(Microsoft SQL Server)上,我可以遇到一些问题,还是从SQL Server中以纠正的形式重新转换?

编辑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);
Run Code Online (Sandbox Code Playgroud)

TNX

Mar*_*ell 6

这实际上不是关于文化,不是关于en-GB,而是关于SQL服务器; 更简单地说,xml定义了ISO 8601格式中指定的日期.这就结束了.

不应该使用 xml DateTime.Parse指定en-GB.那是不对的.

正确的实施将是:

DateTime when = XmlConvert.ToDateTime(...);
Run Code Online (Sandbox Code Playgroud)

或者更方便,如果使用XElement等:

DateTime when = (DateTime)el;
Run Code Online (Sandbox Code Playgroud)

如果你想在SQL服务器中讨论远离 xml的日期,那么简单地说:将它们视为datedatetime(而不是字符串) - 通过类型化列或作为类型化参数.然后,格式或区域设置永远不会混淆.


通过编辑,再次与xml无关.假设它v.Published是a DateTime,并且[PUBLISHED]是a datetime,那么它应该工作正常 - 这些值永远不是字符串.A DateTime/ datetime实际上是一个数字(在定义的时期中有一些定义的间隔).而且,由于它们永远不会是字符串,所以:文化和格式不会涉及到.