string.Split忽略分隔符之间的Null值

时间:2013-12-16 15:22:17

标签: c# string null split

我正在尝试使用Streamreader和Streamwriter将一些数据转换为sql语句。

我的问题是,当我分割出两个分隔符之间没有任何东西,甚至不是空格的行时,它们会被忽略,我得到一个IndexOutOfRange错误

因为我的temparray只到了temparray [3],但它应该像temparray那样[6] ..

如何拆分和使用Null值或用简单的char替换那些空值,以便在我想创建sql语句时不会出现IndexOutOfRange错误?

foreach (string a in values)
{
    int temp = 1;
    String[] temparray = a.Split(';');
    streamWriter.WriteLine("Insert into table Firma values({0},'{1}','{2}')", temp, temparray[1], temparray[4]);
    temp++;
}

5 个答案:

答案 0 :(得分:3)

首先,这是在寻找麻烦(SQL injection)。您应该至少转义从字符串中解析的值。

你似乎错了,因为String.Split正是你想要的默认"x;y;;z".Split(';')返回一个四元素数组{"x", "y", "", "z"}。您可以使用StringSplitOptions.RemoveEmptyEntries来实现所描述的行为:"x;y;;z".Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries)返回三个元素数组{"x", "y", "z"}。正如你所说,这就是你不想要的。

无论哪种方式,"Überarbeitung der SAV Seite;b.i.b.;;;;PB;".Split(';')都会为我返回一个七元素数组,因此请检查您的输入和实现......

答案 1 :(得分:0)

如果您使用的是SQL Server,则可以在查询中使用ISNULL运算符返回空字符串而不是null。

例如:

SELECT ISNULL(PR_Arbeitstitel, '') FROM Table

答案 2 :(得分:0)

为什么不迭代你的temparray来建立一串参数值。

这绝不是完美的,但应该指明你的方向

    foreach (string a in values)
    {
        int temp = 1;
        String[] temparray = a.Split(';');

        var stringBuilder = new StringBuilder();

        foreach (var s in temparray)
            stringBuilder.Append("'" + s + "',");

        var insertStatement = string.Format("Insert into table Firma values({0}, {1})", temp, stringBuilder.ToString().TrimEnd(','));

        temp++;
    }

答案 3 :(得分:0)

为什么你连续有2个分隔符,它们之间没有任何东西?你不控制输入吗?

在这种情况下,您可以通过插入所谓的sentinel值来控制它,例如“IGNOREMEPLEASE”:

String[] temparray = a.Replace(";;", ";IGNOREMEPLEASE;").Split(';');

然后你的其余代码知道IGNOREMEPLEASE表示有一个空行,应该忽略它。

话虽如此,要非常小心你发送给数据库的内容,并清理用于构建SQL语句的传入数据,以摆脱任何危险。

答案 4 :(得分:-2)

也许使用??运算符:

streamWriter.WriteLine(
    "Insert into table Firma values({0},'{1}','{2}')",
    temp,
    temparray[1] ?? 'x',
    temparray[4] ?? 'x');

但这仍然是安全的,但是,如果您确定肯定您的输入在分割后至少有5个令牌。如果你不能保证这一点,你需要把它包装成条件:

if (temparray.Length < 5)
{
    // handle invalid input
}