嘿,我的应用程序解析了几乎所有格式相同的目录中的大量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;
}
答案 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数组的文本”。