2015-06-05 2 views
0

У меня есть DataTable, который построен так:Добавить столбец в DataTable перед экспортом в Excel файл

Dim dt As New DataTable() 
dt = SqlHelper.ExecuteDataset(connString, "storedProcedure", Session("Member"), DBNull.Value, DBNull.Value).Tables(0) 

Затем он преобразуется в DataView и экспортируются в Excel, как это:

Dim dv As New DataView() 
dv = dt.DefaultView 
Export.CreateExcelFile(dv, strFileName) 

Я хочу добавить еще один столбец и заполнить его данными до экспорта в Excel. Вот что я делаю сейчас, чтобы добавить столбец:

Dim dc As New DataColumn("New Column", Type.GetType("System.String")) 
dc.DefaultValue = "N" 
dt.Columns.Add(dc) 

Затем заселить его:

For Each row As DataRow In dt.Rows 
    Dim uID As Integer = Convert.ToInt32(dt.Columns(0).ColumnName) 
    Dim pID As String = dt.Columns(0).ColumnName 
    Dim qry As String = "SELECT * FROM [MyTable] WHERE [UserID] = " & uID & " AND [PassID] = '" & pID & "'" 
    Dim myCommand As SqlCommand 
    Dim myConn As SqlConnection = New SqlConnection(ConfigurationSettings.AppSettings("connString")) 

    myConn.Open() 
    myCommand = New SqlCommand(qry, myConn) 
    Dim reader As SqlDataReader = myCommand.ExecuteReader() 

    If reader.Read() Then 
     row.Item("New Column") = "Y" 
    Else 
     row.Item("New Column") = "N" 
    End If 
Next row 

Но я получаю «System.FormatException: Входная строка была не в правильном формате.» при запуске приложения. Это не похоже, как эти строки:

Dim uID As Integer = Convert.ToInt32(dt.Columns(0).ColumnName) 
Dim pID As String = dt.Columns(0).ColumnName 

Я думаю, у меня есть более чем один вопрос здесь, потому что даже если я закомментируйте цикл, который заполняет данные в столбце я создал не появляется в файл Excel. Любая помощь приветствуется. Благодаря!


EDIT:

Хорошо, я хватал имя столбца вместо фактических данных в столбце ... потому что я идиот. Новый столбец по-прежнему не отображается в экспортированном файле Excel. Вот обновленный код:

Dim dt As New DataTable() 
    dt = SqlHelper.ExecuteDataset(connString, "storedProcedure", Session("Member"), DBNull.Value, DBNull.Value).Tables(0) 

    Dim dc As New DataColumn("New Column", Type.GetType("System.String")) 
    dc.DefaultValue = "N" 
    dt.Columns.Add(dc) 

    'set the values of the new column based on info pulled from db 
    Dim myCommand As SqlCommand 
    Dim myConn As SqlConnection = New SqlConnection(ConfigurationSettings.AppSettings("connString")) 
    Dim reader As SqlDataReader 

    For Each row As DataRow In dt.Rows 
     Dim uID As Integer = Convert.ToInt32(row.Item(0)) 
     Dim pID As String = row.Item(2).ToString 
     Dim qry As String = "SELECT * FROM [MyTable] WHERE [UserID] = " & uID & " AND [PassID] = '" & pID & "'" 

     myConn.Open() 
     myCommand = New SqlCommand(qry, myConn) 
     reader = myCommand.ExecuteReader() 

     If reader.Read() Then 
      row.Item("New Column") = "Y" 
     Else 
      row.Item("New Column") = "N" 
     End If 

     myConn.Close() 
    Next row 

    dt.AcceptChanges() 

    Dim dv As New DataView() 
    dv = dt.DefaultView 
    Export.CreateExcelFile(dv, strFileName) 
+2

Is ColumnName a int? Вы пытаетесь преобразовать его в один ... – Jeremy

+0

, если 'dt.Columns (0) .ColumnName' - это все цифры (например,' '12" '),' Convert.ToInt32' потерпит неудачу – Plutonix

+0

Ну, я допинг ... Мне нужно было захватить значение из этого столбца, а не имя столбца. Я обновил свой оригинальный пост. – TheIronCheek

ответ

0

Вопрос был в моем методе CreateExcelFile(). Я унаследовал приложение, которое я изменяю, и предположил, что метод динамически считывает данные в DataTable и создает электронную таблицу. В действительности он искал DataTable для конкретных значений и игнорировал все остальное.

2 строки кода позже, все готово.

0

Я предполагаю, что вы хотите найти свой MyTable, если он содержит запись с UID и PID для каждой строки присутствует в вашей DT таблице.

Если это ваше намерение, то ваше могли бы написать что-то вроде этого

Dim qry As String = "SELECT UserID FROM [MyTable] WHERE [UserID] = @uid AND [PassID] = @pid" 
Using myConn = New SqlConnection(ConfigurationSettings.AppSettings("connString")) 
Using myCommand = new SqlCommand(qry, myConn) 
    myConn.Open() 
    myCommand.Parameters.Add("@uid", OleDbType.Integer) 
    myCommand.Parameters.Add("@pid", OleDbType.VarWChar) 
    For Each row As DataRow In dt.Rows 
     Dim uID As Integer = Convert.ToInt32(row(0)) 
     Dim pID As String = row(1).ToString() 
     cmd.Parameters("@uid").Value = uID 
     cmd.Parameters("@pid").Value = pID 
     Dim result = myCommand.ExecuteScalar() 
     If result IsNot Nothing Then 
      row.Item("New Column") = "Y" 
     Else 
      row.Item("New Column") = "N" 
     End If 
    Next 
End Using 
End Using 

Конечно, экспорта в Excel из DataTable изменился с новой колонка должна быть сделана после оных колонны и этого кода, обновляет его

В этом коде открытие соединения и создание команды выполняется до ввода цикла по вашим строкам. Параметрированный запрос содержит новые значения, извлеченные из вашего ROWS не из ваших имен столбцов, а вместо более дорогого ExecuteReader, просто используйте ExecuteScalar. Если запись найдена, ExecuteScalar просто возвращает UserID вместо полного считывателя.

+0

Мое первоначальное сообщение, вероятно, явно не указано, но я делаю экспорт в Excel ПОСЛЕ добавления строк. См. Мое обновленное сообщение. :) – TheIronCheek

+1

Ну, это действительно странно, потому что ваш datatable (и ваш DataView) должен иметь новый столбец. Вы можете попытаться использовать отладчик, остановиться в строке после AcceptChanges и попытаться визуализировать DataTable и его содержимое с помощью визуализатора DataTable, который появляется на всплывающей подсказке отладки. Он столбец присутствует, тогда проблема, вероятно, внутри CreateExcelFile, но у нас нет кода этого метода. – Steve

+0

Хорошее горе. Хорошо, Стив, проблема была в CreateExcelFile(). Я все еще довольно новичок в разработке .NET, и поскольку метод был включен во включенный класс Export, я предположил, что это был встроенный класс, который динамически захватывал все метки и значения и выплевывал их в файле Excel. По-видимому, он захватывает и отображает значения, характерные для этого проекта. 2 строки кода позже, проблема решена. – TheIronCheek