Ошибка преобразования десятичного числа в SQL - PullRequest
0 голосов
/ 01 июня 2010

Эй, мое приложение анализирует многочисленные txt-файлы в каталоге, которые почти все отформатированы одинаково, а затем вставляет значения в столбцы моего sql db. Тем не менее, есть несколько файлов, с которыми приложение столкнулось, где значение «пусто» вместо «0.0», поэтому приложение не может указать, что оно не может преобразовать это значение в числовое.

Есть ли способ, которым я мог бы изменить следующий код, чтобы сказать, что говорит И также добавить 'ЕСЛИ значение пустое, а затем импортировать 0.0 вместо?

РЕДАКТИРОВАТЬ: следующий код, кажется, получить мой пароль мой ошибка, однако теперь у меня все столбцы отображаются в виде чисел. если это текст, вместо него вводится «0» ...

string[] values = line.Split(new[] { ',' });

                                for (int i = 0; i < values.Length - 1; i++)
                                {

                                    SqlParameter param = insertCommand.Parameters[i];

                                    decimal value;
                                    if (values[i] == null || values[i] == "")
                                    {
                                        value = 0.000m;
                                    }
                                    else
                                    {
                                        if (!decimal.TryParse(values[i], out value))
                                        {

                                           // param.Value = decimal.TryParse(values[i], out value) ? value : 0;
                                            param.Value = values[i];
                                        }

                                    }
                                    param.Value = value;
                                } 

Ответы [ 6 ]

1 голос
/ 03 июня 2010

Ваша проблема в том, что десятичное значение по умолчанию составляет 0 м.

Итак:

decimal value;
if (values[i] == null || values[i] == "")
{
    value = 0.000m;
}
else
{
    if (!decimal.TryParse(values[i], out value))
    {
       // param.Value = decimal.TryParse(values[i], out value) ? value : 0;
       param.Value = values[i];
    }

    // value == 0m still!!! 
    // put debugger on this line and you can verify this:
    var testDecimalValue = value;
}

param.Value = value;

В значительной степени гарантирует, что для свойства param.Value будут заданы только числовые значения или 0 (если значение не числовое).

Попробуйте изменить код на:

if (values[i] == null || values[i] == "")
{
    param.Value = 0.000m;
}
else
{
    decimal value;
    if (!decimal.TryParse(values[i], out value))
    {
       // param.Value = decimal.TryParse(values[i], out value) ? value : 0;
       param.Value = values[i];
    }
    else
    {
       param.Value = value;
    }
}
0 голосов
/ 03 июня 2010

Это выглядит как то, что вы ищете:

foreach (int i = 0; i < values.Length; i++)
{
    SqlParameter param = insertCmd.Parameters[i];
    if (string.IsNullOrEmpty(values[i]))
    {
        param.Value = new Decimal(0m);
    }
    else
    {
        decimal d = new Decimal(0m);
        if (decimal.TryParse(values[i], out d))
            param.Value = d;
        else
            param.Value = new Decimal(0m);
    }   
}

обратите внимание, что проблема с вашей выглядит здесь:

if (!decimal.TryParse(values[i], out value))          
{            
    param.Value = values[i];          
}   

По сути, вы говорите: «Если анализ не удался, используйте текстовый массив значений в i».

0 голосов
/ 01 июня 2010

Я не программист на C #, но я бы проверял values, когда вы нажимаете одну из пробелов в отладчике, смотрите, какой тип пробела, и проверяете это условие явно по мере прохождения for петля. Например, если это null, просто установите это значение равным 0.0 в вашем цикле.

0 голосов
/ 01 июня 2010

Если бы вы были в SQL, это был бы IsNull () или Coalesce (), но в C # вам просто нужно бросить троичный оператор на место "?:", Поскольку decimal.TryParse должен возвращать false, если он не может разобрать ваше второе значение будет 0,0

http://msdn.microsoft.com/en-us/library/ty67wk28(VS.80).aspx

0 голосов
/ 01 июня 2010

Попробуйте это:

decimal value;
if (values[i] == string.Empty || values[i] == "blank")
{
    value = 0.0m;
}
else
{
    if (!decimal.TryParse(values[i], out value))
    {
        // Error handling
    }
}

param.Value = value;
0 голосов
/ 01 июня 2010

Разве decimal.TryParse не возвращает ложь при выполнении с пустой строкой?

edit

Вот неправильная строка:

param.Value = values[i];

Правая часть должна быть value, а не values[i].

edit

Проблема состоит в том, что он выполняет param.Value = value; независимо .Другими словами, когда это не число, вы правильно присваиваете values[i] для parm.Value, а затем некорректно перезаписываете его с value, который всегда равен 0 в этой точке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...