【问题标题】:C# CSV reader that can handle truncated rows?可以处理截断行的 C# CSV 阅读器?
【发布时间】:2014-06-25 15:17:57
【问题描述】:

最佳实践问题:

我有一个如下所示的 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。我希望它只传递空值,就像它已经为逗号分隔空格的实例所做的那样。

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];] 我的问题吗?有没有更好的方法来声明这个数组来避免这些异常?

【问题讨论】:

  • 当您的 ReadFields 方法没有返回包含 10 个部分的数组时,您的问题是访问 parts[0..n]... 您能显示该函数的代码吗?
  • 你可以使用parts.ElementAtOrDefault(1)
  • @Bun:我会把它加进去,但它使用的是内置的 VS TextFieldParser。
  • @Tim:好像不允许我将默认值设置为null?
  • 你把我弄丢了,string的默认值为null。

标签: c# sql arrays csv sqlcommand


【解决方案1】:

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;

【讨论】:

  • 我无法获得 ??功能在我的情况下工作,但 OR 成功了。谢谢!
【解决方案2】:

您不能简单地使用ElementAtOrDefault 或查看string[]Length 吗?

string value = parts.ElementAtOrDefault(1);
if(value == null)
    cmd.Parameters.Add("@two",SqlDbType.NVarChar).Value = DBNull.Value;
else
    cmd.Parameters.Add("@two",SqlDbType.NVarChar).Value = value;

【讨论】:

  • 您可以使用空合并运算符将DBNull 中的null 替换为null
  • @Servy:我不确定是否可以编译。 编辑它没有:cmd.Parameters.Add("@two", SqlDbType.NVarChar).Value = value ?? DBNull.Value;
  • 是的,您可能需要在其中对object 进行演员表。当然,您也可以创建一个新的扩展方法来支持它,这可能是值得的。
  • @Servy & Tim:我尝试了与 Tim 写的相同的命令,但它无法编译。恐怕我不确定合并操作员在做什么。我会研究一下。
猜你喜欢
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 2014-05-03
  • 2017-02-21
  • 1970-01-01
相关资源
最近更新 更多