SQL十进制转换错误

时间:2010-06-01 18:55:16

标签: c# sql parsing

嘿,我的应用程序解析了几乎所有格式相同的目录中的大量txt文件,然后将值插入到我的sql db的列中。但是,有一些文件,应用程序遇到的值是“空白”而不是“0.0”,因此应用程序失败,说明它无法将该值转换为数字。

有没有办法我可以更改下面的代码来说出什么,并且还添加'IF值为空,然后导入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 个答案:

答案 0 :(得分:1)

您的问题是十进制的默认值是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;

几乎可以保证只有数值或0(如果值不是数值)将被设置为param.Value属性。

尝试将代码更改为:

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;
    }
}

答案 1 :(得分:0)

在空字符串上执行时decimal.TryParse不返回false吗?

修改

这是违规行:

param.Value = values[i];

右侧应为value,而不是values[i]

修改

问题是,无论,它都会执行param.Value = value; 。换句话说,当它不是数字时,您正确地将values[i]分配给parm.Value,然后使用value进行错误覆盖,{{1}}此时始终为0。

答案 2 :(得分:0)

试试这个:

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;

答案 3 :(得分:0)

如果您使用的是SQL,那么它将是IsNull()或Coalesce(),但在C#中,您只想将三元运算符投入“?:”,因为如果无法解析则decimal.TryParse应返回false,你的第二个值是0.0

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

答案 4 :(得分:0)

我不是C#程序员,但是当你点击调试器中的一个空白时,我会检查values,看看空白的类型是什么,并在你去的时候明确地测试那个条件通过for循环。例如,如果它是null,那么只需在循环中将该值设置为0.0。

答案 5 :(得分:0)

这看起来像你在寻找:

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处​​使用values数组的文本”。