ошибка при вставке десятичного числа C # в числовой SQL - PullRequest
1 голос
/ 09 февраля 2012

Я использую SQL Server 2008 и у меня есть таблица с числовым типом поля (7,3), в которую я хочу вставить значения с помощью веб-службы C # (я знаю, что значения не будут превышать4 цифры до запятой и 3 цифры после).поэтому моя переменная C # имеет тип десятичного (как я прочитал здесь ).в основном это выглядит так -

SqlParameter vsp = new SqlParameter("@VideoStartPoint", SqlDbType.Decimal);
                    vsp.Scale = 3;
                    vsp.Precision = 7;
                    vsp.Value = VideoStartPoint;

однако я обнаружил, что это работает только , если значение меньше 10. для любого значения от 10 и выше, я получаю ошибку -Msgstr " Ошибка преобразования типа данных числовой в числовой ".я знаю, что в моей таблице нет проблем, потому что, когда я вставляю ее, используя SQL, у меня нет проблем с> 10 значениями.

есть идеи?ура, eRez

1 Ответ

1 голос
/ 09 февраля 2012

Если VideoStartPoint является строкой и ваша локаль использует '.' вместо ',' в качестве разделителя тысяч значение '11 .1234 'будет переведено как 11123.000, так как .NET будет использовать значение локали вашего потока для преобразования строки в десятичную. Это может произойти на французском, итальянском, греческом языках, я думаю, на испанском.

Вам следует установить точку останова, чтобы проверить значение VideoStartPoint, даже если оно является десятичным. Может быть проблема на стороне клиента, которая неправильно преобразовывает числовую строку в десятичную.

EDIT: Чтобы проиллюстрировать это, следующий код анализирует одну и ту же строку «11.450» с двумя разными языками, греческим и американским, в результате чего получаются два разных числа, 11450 и 11.450

.
        var grNumber = decimal.Parse("123.450", CultureInfo.GetCultureInfo("el-GR"));
        var usNumber = decimal.Parse("123.450", CultureInfo.GetCultureInfo("en-US"));
        Debug.Assert(grNumber == 123450);
        Debug.Assert(usNumber == (decimal) 123.45);

Следующий оператор LINQ возвращает все культуры, использующие '.' как их разделитель тысяч:

        var cultures = (from culture in CultureInfo.GetCultures(CultureTypes.AllCultures)
                       where culture.NumberFormat.NumberGroupSeparator == "."
                       select culture.Name);

Существует 92 различных культуры, соответствующих 33 языкам ISO (CultureInfo.TwoLetterISOLanguageName), включая Испанию, Нидерланды, Бельгию, Германию и т. Д.

...