【问题标题】:Export to csv in debug mode success but in run-time mode it fails在调试模式下成功导出到 csv,但在运行时模式下失败
【发布时间】:2019-07-09 23:17:40
【问题描述】:

我正在将 SQL Server 表中的记录读入数据集,然后将其导出到 CSV 文件。当我在调试模式下单步执行时,一切正常。当我运行它时,它只导出一个带有垃圾数据的单元格。因为它是一个 ASP.NET 应用程序,所以我不确定我是否在回发方面做错了什么。似乎在运行时,它不会等待写入 CSV 文件。

Dim sbldRecordCSV As New StringBuilder

Dim dtHCMTable As DataTable = mdsHCMTable.Tables(0)
Dim intIndex As Integer = 0

'Read the connection-string from web.config
Dim connHCM As New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("connHCM").ConnectionString)

'Read the exported CSV file path from web.config
Dim strCSVpath As String = System.Configuration.ConfigurationManager.AppSettings("CSVpath").ToString

Try
    For intIndex = 0 To mdsHCMTable.Tables(0).Rows.Count - 1
        Dim drHCMTable As DataRow = dtHCMTable.Rows(intIndex)
        For Each field As Object In drHCMTable.ItemArray
            sbldRecordCSV.Append(field.ToString & "|")
        Next
        sbldRecordCSV.Replace("|", vbNewLine, sbldRecordCSV.Length - 1, 1)
    Next

    My.Computer.FileSystem.WriteAllText(strCSVpath.ToString & lstDataTables.SelectedValue.ToString & ".csv", sbldRecordCSV.ToString, False)

【问题讨论】:

  • 您实际上在该代码的哪个位置从数据库中检索任何数据?您创建了一个SqlConnection 但从不使用它,因此DataTable 中的任何数据必须早先已经存在。您可能已经在调试器中运行了该代码,但显然您从未调试过它。
  • 您好 jmcihinney,过程标题是 Protected Sub ExportRecordsToCSV(mdsHCMTable As DataSet)。我检索数据集作为参数。请不要对我的调试能力发表任何评论。我是 asp.net 的新手,但对编程并不陌生。感谢您提前提供任何帮助。
  • 我只能凭我所见。你已经用 SQL 和 SQL Server 标记了这个问题,但是有问题的方法接收并已经填充了DataSet,所以这个问题与 SQL 或 SQL Server 没有任何关系。您创建了一个从未使用过的 SqlConnection 对象,但您从未在调试中使用它。根据您向我们展示的内容,我只能得出结论,您的 DataSet 不包含您认为的内容。如果是我,我会添加一些跟踪代码以查看在执行 Release 构建时实际发生了什么。

标签: sql sql-server vb.net csv


【解决方案1】:

经过一番搜索,我意识到我需要修改 ExportCSV 代码。修改后的套路如下:

受保护的 Sub ExportToCSV(mdsHCMTable 作为数据集) Dim dt As DataTable = mdsHCMTable.Tables(0)

    'Read the exported CSV file path from web.config
    Dim strCSVpath As String = System.Configuration.ConfigurationManager.AppSettings("CSVpath").ToString

    Response.Clear()
    Response.Buffer = True
    Response.AddHeader("content-disposition", "attachment;filename=" & lstDataTables.SelectedValue.ToString & ".csv")
    Response.Charset = ""
    Response.ContentType = "application/text"

    Dim sb As New StringBuilder()
    For k As Integer = 0 To dt.Columns.Count - 1
        'add separator
        sb.Append(dt.Columns(k).ColumnName + "|"c)
    Next
    'append new line
    sb.Append(vbCr & vbLf)
    For i As Integer = 0 To dt.Rows.Count - 1
        For k As Integer = 0 To dt.Columns.Count - 1
            'add separator
            sb.Append(dt.Rows(i)(k).ToString().Replace(",", "|") + "|"c)
        Next
        'append new line
        sb.Append(vbCr & vbLf)
    Next

    Response.Clear()
    Response.BufferOutput = False
    Response.Output.Write(sb.ToString())
    Response.Flush()
End Sub

这个解决方案对我有用。我希望它可以对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 2013-02-16
    • 2017-07-10
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多