Member 13711215 Ответов: 2

Получить заголовок из SQL запроса VB.NET


Привет, я пытаюсь получить данные из sql server и экспортировать их в csv-файл. Но CSV-файл не нравится так, как должен. И отсутствующие заголовки. Можете ли вы помочь мне, пожалуйста?

Что я уже пробовал:

Private Sub DBExecuteQueryWriteToFile(ByVal sender As System.Object, ByVal e As System.EventArgs, Optional ByVal Delimiter As String = ",") Handles ziskat_btn.Click

       Dim SqlCommand As String
       Dim filePath As String = "C:\Users\cahafi\Desktop\vbexcel.csv"
       'Dim csvFileWriter = New StreamWriter(filePath, False, Encoding.GetEncoding("Windows-1250"))
       SqlCommand = ("SELECT TabPrikazMzdyAZmetky.IDPracoviste=VPrikazMzdyAZmetkyPracoviste.ID   LEFT OUTER JOIN TabKmenZbozi VPrikazMzdyAZmetkyKmenZbozi WITH(NOLOCK) ON TabPrikazMzdyAZmetky.IDTabKmen=VPrikazMzdyAZmetkyKmenZbozi.ID   LEFT OUTER JOIN TabPrikaz VPrikazMzdyAZmetkyPrikaz WITH(NOLOCK) ON VPrikazMzdyAZmetkyPrikaz.ID=TabPrikazMzdyAZmetky.IDPrikaz   LEFT OUTER JOIN TabCisZam VPrikazMzdyAZmetkyZamestnanec WITH(NOLOCK) ON TabPrikazMzdyAZmetky.Zamestnanec=VPrikazMzdyAZmetkyZamestnanec.ID   LEFT OUTER JOIN TabCSmeny VPrikazMzdyAZmetkySmena WITH(NOLOCK) ON VPrikazMzdyAZmetkySmena.ID=TabPrikazMzdyAZmetky.IDSmeny   LEFT OUTER JOIN TabCZavad VMzdyAZmetkyCZavad WITH(NOLOCK) ON VMzdyAZmetkyCZavad.ID=TabPrikazMzdyAZmetky.IDZavady   LEFT OUTER JOIN  TabPrikazMzdyAZmetky_EXT WITH(NOLOCK) ON TabPrikazMzdyAZmetky_EXT.ID=TabPrikazMzdyAZmetky.ID WHERE ((TabPrikazMzdyAZmetky.TypMzdy<>2)AND(TabPrikazMzdyAZmetky.DatPorizeni>'1.1.2019')AND(TabPrikazMzdyAZmetky.DatPorizeni<'" + Label1.Text + "') AND(VPrikazMzdyAZmetkyKmenZbozi.SkupZbo<>N'VYL'))AND(VPrikazMzdyAZmetkyKmenZbozi.SKP NOT LIKE N'%mohelnice%')AND(VPrikazMzdyAZmetkyKmenZbozi.SKP NOT LIKE N'%Mohelnice%')AND(VPrikazMzdyAZmetkyKmenZbozi.SkupZbo NOT LIKE N'%PMN%')ORDER BY TabPrikazMzdyAZmetky.DatPorizeni DESC")
       Dim bufferSize = 1024
       Dim cmd = New SqlCommand(SqlCommand, conn)

       conn.Open()

       Using FileObject As New FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None, bufferSize)
           Using StreamWriterObj As New StreamWriter(FileObject, Encoding.GetEncoding("Windows-1250"))
               Using Reader As SqlDataReader = cmd.ExecuteReader()
                   Dim FieldCount As Integer = Reader.FieldCount
                   Do While Reader.Read()
                       StreamWriterObj.Write(Reader.Item(0))
                       For i As Integer = 0 To FieldCount - 1
                           StreamWriterObj.Write(Delimiter)
                           StreamWriterObj.Write(Reader.Item(i))
                       Next
                       StreamWriterObj.WriteLine()
                   Loop

               End Using
           End Using
       End Using
   End Sub

Richard Deeming

И в вашем файле отсутствуют заголовки, потому что вы никогда не пишете никаких заголовков в файл.

Member 13711215

И как я могу писать заголовки?

2 Ответов

Рейтинг:
8

MadMyche

Избегайте SQL-инъекций. Этому нет оправдания, так как это было обнаружено более 20 лет назад. В основном вам нужно поместить заполнитель в исходный запрос и добавить параметр для этого заполнителя в объект команды

-- AND (TabPrikazMzdyAZmetky.DatPorizeni<'" + Label1.Text + "')
-- replace with 
   AND (TabPrikazMzdyAZmetky.DatPorizeni<@Label1)
и
Dim cmd = New SqlCommand(SqlCommand, conn)
' add new line
cmd.Parameters.AddWithValue("@Label1", Label1.Text)
файл не нравится так, как надо.
Похоже, что ваша первая колонка может быть написана дважды
StreamWriterObj.Write(Reader.Item(0))		' column 0
For i As Integer = 0 To FieldCount - 1
	StreamWriterObj.Write(Delimiter)	' column 0 again when i = 0
	StreamWriterObj.Write(Reader.Item(i))
... и отсутствующие заголовки
Только 2 проблемы с этим; CSV - файлы на самом деле не имеют заголовков, но обычно являются только первой строкой, записанной в текстовый файл-проблема в том, что вы никогда не записываете эту строку в файл. Простое исправление; прежде чем вы пройдете через цикл всех значений, Запустите свой For i сделайте петлю поперек считывателя и используйте GetName(i) свойство для каждого столбца


Member 13711215

Спасибо, мой код:

Попробуй
Используя потомок fileobject как новый файловый поток(путь к файлу, содержит filemode.OpenOrCreate, FileAccess.Пиши, Файлообменник.Нет, размер буфера)
Используя StreamWriterObj Как Новые Модулю Записи StreamWriter(Потомок Fileobject, Кодирование.GetEncoding("Windows-1250"))
Использование Reader в качестве SqlDataReader = cmd.Метода executereader()
Dim FieldCount As Integer = Reader.FieldCount - 1
StreamWriterObj.WriteLine(Reader.GetName(0) + ";" + Reader.GetName(1) + ";" + Reader.GetName(2) + ";" + Reader.GetName(3) + ";" + Reader.GetName(4) + ";" + Reader.GetName(5) + ";" + Reader.GetName(6) + ";" + Reader.GetName(7) + ";" + Reader.GetName(8) + ";" + Reader.GetName(9) + ";" + Reader.GetName(10) + ";" + Reader.GetName(11) + ";" + Reader.GetName(12) + ";" + Reader.GetName(13) + ";" + Reader.GetName(14) + ";" + Reader.GetName(15) + ";" + Reader.GetName(16) + ";" + Reader.GetName(17) + ";" + Reader.GetName(18) + ";" + Reader.GetName(19) + ";" + Reader.GetName(20) + ";" + Reader.GetName(21) + ";" + Reader.GetName(22) + ";" + Reader.GetName(23) + ";" + Reader.GetName(24) + ";" + Reader.GetName(25) + ";" + Reader.GetName(26) + ";" + Reader.GetName(27) + ";" + Reader.GetName(28) + ";")
Делай, Пока Читатель.()
StreamWriterObj.Пиши(Читатель.Пункт(0))

Для i как целого числа = 0 до FieldCount - 1
StreamWriterObj.Запись(Разделитель)
StreamWriterObj.Пиши(Читатель.Пункт(i))
Следующий
StreamWriterObj.метод WriteLine()
Петля

Конец Использования
Конец Использования
Конец Использования
-Ящик для сообщений.Показать("экспорт выполнен успешно!")
Поймать ex как исключение
почте(отправителя, е)
Ящик для сообщений.Show(ex.Message, "Warning", MessageBoxButtons.ОК)
Конец Попытки

MadMyche

а что изменилось-в вашем коде и в результатах?

Рейтинг:
0