SQL Server ПРЕОБРАЗОВЫВАЕТ (ЧИСЛОВОЙ (18,0), '') сбои, но ПРЕОБРАЗУЙТЕ (INT, '') успешно выполняется?

Я также думал, что сериализуемый атрибут должен был быть на объекте, но если я не полный новичок (я в середине конца ночного кодирования сессии), следующие работы от SnippetCompiler:

using System;
using System.IO;
using System.Xml;
using System.Collections.Generic;
using System.Xml.Serialization;

public class Inner
{
    private string _AnotherStringProperty;
    public string AnotherStringProperty 
    { 
      get { return _AnotherStringProperty; } 
      set { _AnotherStringProperty = value; } 
    }
}

public class DataClass
{
    private string _StringProperty;
    public string StringProperty 
    { 
       get { return _StringProperty; } 
       set{ _StringProperty = value; } 
    }

    private Inner _InnerObject;
    public Inner InnerObject 
    { 
       get { return _InnerObject; } 
       set { _InnerObject = value; } 
    }
}

public class MyClass
{

    public static void Main()
    {
        try
        {
            XmlSerializer serializer = new XmlSerializer(typeof(DataClass));
            TextWriter writer = new StreamWriter(@"c:\tmp\dataClass.xml");
            DataClass clazz = new DataClass();
            Inner inner = new Inner();
            inner.AnotherStringProperty = "Foo2";
            clazz.InnerObject = inner;
            clazz.StringProperty = "foo";
            serializer.Serialize(writer, clazz);
        }
        finally
        {
            Console.Write("Press any key to continue...");
            Console.ReadKey();
        }
    }

}

я предположил бы, что XmlSerializer использует отражение по общественным собственностям.

5
задан marc_s 27 November 2009 в 21:15
поделиться

3 ответа

Используйте ISNUMERIC

declare @a varchar(20)
set @a = 'notanumber'
select case when isnumeric(@a) = 0 then 0 else convert(numeric(18,0),@a) end
8
ответ дан 13 December 2019 в 05:36
поделиться

ISNUMERIC не всегда работает так, как вы могли ожидать: в частности, он возвращает True для некоторых значений, которые впоследствии не могут быть преобразованы в числовые.

Эта статья описывает проблему и предлагает, как обойти это с помощью UDF.

2
ответ дан 13 December 2019 в 05:36
поделиться

Пустая строка преобразуется в ноль для типов float и int, но не в десятичную. (И преобразуется в 01 января 1900 для datetime = ноль). Я не знаю почему ... это просто ...

Если вам нужно десятичное число (18,0), используйте вместо него bigint. Или приведите сначала через float

ISNUMERIC примет - и . и 1.2E3 как число, но все они не могут быть преобразованы в десятичное число.

2
ответ дан 13 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: