Похоже, что вы хотите выбрать 4 столбца из базы данных, поэтому для ответа на вопрос я создал таблицу с именем "Huber" с этими данными:
No_ formatcount formatname printername Beschreibung
10007 1 Hello World Starting "entry".
100071 2 Yellow Flower NULL
100072 3 Grey Rock Let's have a ; here.
Возможно, вам потребуется некоторая гибкость в каких столбцах выбрать, поэтому я сделал имена столбцов массивом.
Существует стандарт для файлов CSV: RF C 4180 , поэтому мы могли бы также попытаться следовать этому .
Мне кажется, что в этом случае было бы проще извлечь данные в DataTable. Поскольку каждый элемент данных будет преобразован в строку для записи в файл CSV, при этом не будет проблем с данными NULL из базы данных.
При использовании базы данных лучше всего открыть соединение, выполните операция, избавьтесь от соединения. Оператор VB. NET Using
позаботится об утилизации автоматически, даже если что-то пойдет не так. Метод DataAdapter.Fill выполняет открытие и закрытие для вас (фактически он оставляет соединение в том же состоянии, что и до его вызова). Не используйте ничего похожего на «Function Connect ()» в вопросе: это приведет к проблемам.
Учитывая все это, я использовал этот код:
Option Infer On
Option Strict On
Imports System.Data.SqlClient
Imports System.IO
Public Class Form1
Function GetData(databaseColumnNames As String()) As DataTable
Dim dt As New DataTable()
Dim csb As New SqlConnectionStringBuilder With {.DataSource = "Server01",
.InitialCatalog = "PROD",
.UserID = "user",
.Password = "123"}
' Put the column names in square brackets in case a reserved word is used as a column name.
' Does not take into account using square brackets in a column name (don't do that).
Dim columnNames = " " & String.Join(", ", databaseColumnNames.Select(Function(c) "[" & c & "]")) & " "
Dim sql = "SELECT " & columnNames & " FROM dbo.[Huber] WHERE [No_] LIKE '10007%'"
Using conn = New SqlConnection(csb.ConnectionString),
cmd = New SqlCommand(sql, conn)
Dim da As New SqlDataAdapter(cmd)
da.Fill(dt)
End Using
Return dt
End Function
Function CsvLine(a As Object(), separator As Char) As String
' Ref: RFC 4180 "Common Format and MIME Type for Comma-Separated Values (CSV) Files"
' https://tools.ietf.org/html/rfc4180
Dim b = a.Select(Function(x) x.ToString()).ToArray()
For i = 0 To b.Count - 1
' If the field contains the separator, a double-quote, LF, or CR, then make adjustments:
If b(i).IndexOfAny({separator, Chr(42), Chr(10), Chr(13)}) >= 0 Then
b(i) = b(i).Replace("""", """""")
b(i) = """" & b(i) & """"
End If
Next
Return String.Join(separator, b)
End Function
Sub WriteCsvFiles(destPath As String, headings As String(), dt As DataTable)
Dim separator As Char = ";"c
Dim header = String.Join(separator, headings)
For Each r As DataRow In dt.Rows
' Use the first column for the filename:
Dim destFile = Path.Combine(destPath, r(0).ToString().Trim() & ".csv")
Using sw As New StreamWriter(destFile)
sw.WriteLine(header)
sw.WriteLine(CsvLine(r.ItemArray, separator))
End Using
Next
End Sub
Private Sub bnDatenVerarbeiten_Click(sender As Object, e As EventArgs) Handles bnDatenVerarbeiten.Click
Dim destinationFolder = "C:\Temp\Huber"
Directory.CreateDirectory(destinationFolder)
' The names of the columns in the database...
Dim columnsToUse = {"formatcount", "formatname", "printername", "Beschreibung"}
Dim daten = GetData(columnsToUse)
' You could use different text for the headers if required.
WriteCsvFiles(destinationFolder, columnsToUse, daten)
End Sub
End Class
Чтобы получить 3 файла :
1.csv
formatcount;formatname;printername;Beschreibung
1 ;Hello;World;"Starting ""entry""."
2.csv
formatcount;formatname;printername;Beschreibung
2 ;Yellow;Flower;
3.csv
formatcount;formatname;printername;Beschreibung
3 ;Grey;Rock;"Let's have a ; here."
Надеюсь, я оставил достаточно настраиваемых частей, чтобы вы могли изменить его при необходимости.
NB Если запрос изменен для использования параметров, например, вы Возможно, вы захотите превратить 10007%
в переменную, тогда вы должны будете использовать параметры SQL, чтобы защитить ее от SQL инъекции.
Относительно добавления столбцов в таблицу данных.
Добавление столбцов - хорошая идея, но вместо добавления строки с дополнительными данными, подобными этой:
daten.Rows.Add(daten.Rows(0).Item("Description"), daten.Rows(0).Item("Description 2"), Anzahl, Format, Drucker)
Вам необходимо добавьте дополнительные данные в каждую строку, например:
For i = 0 To daten.Rows.Count - 1
daten.Rows(i)("formatcount") = Anzahl
daten.Rows(i)("formatname") = Format
daten.Rows(i)("printername") = Drucker
Next