我正在尝试使用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++;
}
答案 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
}