可以处理截断行的C#CSV阅读器?

时间:2014-06-25 15:17:57

标签: c# sql arrays csv sqlcommand

最佳实践问题:

我有一个如下所示的CSV文件:

1,2,3

1,,3

,2,3

,,3

1

1

1

我希望它进入SQL:

1,2,3

1,null,3

null,2,3

null,null,3

1,null,null

1,null,null

1,null,null

最后三行给我带来了麻烦。如果没有正确数量的逗号,我的“cmd.Parameters.Add”会抛出异常:当没有为数组中的该位置分配值时,IndexOutOfRangeException。我希望它只传递null值,就像它已经用逗号分隔空格的实例一样。

while
{
string parts = new string[10];
parts = parser.ReadFields();
if (parts==null)
{break};

SqlCommand cmd = new SqlCommand("sp", conn);
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("@one",SqlDbType.Int).Value = parts[0];
cmd.Parameters.Add("@two",SqlDbType.NVarChar).Value = parts[1];
cmd.Parameters.Add("@three",SqlDbType.Float).Value = parts[2];

[run cmd]

我该怎么做?我有几百个参数,所以避免一个解决方案,我测试每个值为null,然后应用DBNull.Value将是最好的,如果可能的话。这是[string parts = new string [10];]我的问题?有没有更好的方法来声明这个数组,以避免这些异常?

2 个答案:

答案 0 :(得分:0)

string parts = new string[10]; 错误(它应该只是string[] parts;)。我很惊讶编译,声明和分配类型之间的不匹配。

但这不是问题所在。

尝试更改此行:

if (parts==null)

到此:

if (parts==null || parts.Length < 3)

或者,如果您需要这些行:

cmd.Parameters.Add("@one",SqlDbType.Int).Value = parts[0];
cmd.Parameters.Add("@two",SqlDbType.NVarChar).Value = parts[1] ?? DBNull.Value;
cmd.Parameters.Add("@three",SqlDbType.Float).Value = parts[2] ?? DBNull.Value;

答案 1 :(得分:0)

你不能简单地使用ElementAtOrDefault或查看Length的{​​{1}}吗?

string[]