Vb.net 输入字符串有时格式不正确

Vb.net 输入字符串有时格式不正确,vb.net,csv,Vb.net,Csv,我在互联网上找到了一段代码,这段代码是为了满足将datareader连接到.csv文件的需要而采用的。我正在提取的数据库文件的范围从10列到200列。在一些查询中,我发现输入字符串的格式不正确;我相信这发生在我代码的转换部分,它将读取器值更改为字符串。附件是代码 Dim sw As New StreamWriter(filename) Try Using Conn As New Odbc.OdbcConnection(ConnStr) Using Cmd As New O

我在互联网上找到了一段代码,这段代码是为了满足将datareader连接到.csv文件的需要而采用的。我正在提取的数据库文件的范围从10列到200列。在一些查询中,我发现输入字符串的格式不正确;我相信这发生在我代码的转换部分,它将读取器值更改为字符串。附件是代码

Dim sw As New StreamWriter(filename)
Try
    Using Conn As New Odbc.OdbcConnection(ConnStr)
        Using Cmd As New Odbc.OdbcCommand(query, Conn)
            Conn.Open()
            Using dr As Odbc.OdbcDataReader = Cmd.ExecuteReader()
                Dim fields As Integer = dr.FieldCount - 1
                While dr.Read()
                    Dim sb As New StringBuilder()
                    Dim i As Integer = 0
                    While i <= fields
                        If i <> fields Then
                            sep = ","
                        Else
                            sep = ""
                        End If
                            sb.Append(dr(i) + sep)
                            i += 1
                    End While
                    sw.WriteLine(sb.ToString())
                End While
            End Using
        End Using
        sw.Close()
        sw.Dispose()
        Conn.Close()
        Conn.Dispose()
    End Using
Dim sw作为新StreamWriter(文件名)
尝试
将Conn用作新的Odbc.OdbcConnection(ConnStr)
使用Cmd作为新的Odbc.Odbc命令(query,Conn)
康涅狄格州公开赛
使用dr作为Odbc.OdbcDataReader=Cmd.ExecuteReader()
将字段设置为整数=dr.FieldCount-1
而里德博士
使某人成为新的架线工
尺寸i为整数=0

而我最有可能的罪魁祸首是线路

sb.Append(dr(i) + sep)
VB使用
&
运算符连接字符串,尝试将其替换为

sb.Append(dr(i) & sep)
或者更好地使用不同的逻辑,而不是

If i <> fields Then
  sep = ","
Else
  sep = ""
End If
sb.Append(dr(i) + sep)

您是否有关于抛出错误的位置的更多信息—堆栈跟踪等。我看不到您的代码中有任何明显的抛出该错误的信息。请指定抛出异常的行。我不确定代码是否会导致该错误。这个错误通常是由于试图将某些内容从字符串解析为另一种类型而导致的——您的做法正好相反。最接近的是
dr(i)
,DataReader项是
Object
,隐含的ToString应该可以正常工作。一定要确保选项严格,我没有编辑你的标题。请参见“”,其中一致意见是“不,他们不应该”。您不需要
Conn.Close()
Conn.Dispose()
,因为您在
块中有
Conn
。您也应该在
使用
块的
中使用
sw
,在这种情况下,您不需要
sw.Close()
sw.Dispose()
。我进行了这些调整,但仍然得到相同的错误。我已经在上面发布了调试带来的好处up@JefforyDampier错误发生在第sb行。Append(dr(i))-验证发生错误时
dr(i)
的值是多少。您可能需要添加一些验证来说明空值。该值当时看起来是双精度的。您对验证空值有什么建议吗?@JefforyDampier在我的答案中添加了基本检查,请参见编辑。添加此验证后,现在出现错误:If dr(I)为DBNull.value或lse dr(I)那么,当查看错误消息时,它似乎正在尝试将字符串转换为数字吗?
sb.Append(dr(i))
If i <> fields Then sb.Append(",")
If dr(i) Is DbNull.Value OrElse dr(i) Is Nothing Then
    sb.Append("[No Data]")
Else
    sb.Append(dr(i))
End If