Экспорт данных в CSV файл из Microsoft SQL Server, используя Access 2003

Если у Вас возникла необходимость выгружать данные из базы MS SQL Server в текстовый формат CSV, то из данного материала Вы узнаете, как это можно сделать средствами Access 2003.

Итак, если у Вас встала задача выгрузить данные с SQL сервера в CSV файл, то ее можно решить несколькими способами, например:

  • С помощью встроенной консольной утилиты BCP;
  • Используя SSIS — SQL Server Integration Services;
  • Или как вариант можно с помощью конструкции INSERT INTO OPENROWSET;
  • Другие варианты, например с использованием сторонних приложений.

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

Программа BCP тоже не подходит, даже если вызывать ее средствами T-SQL, используя хранимую процедуру, так как для этого потребуется включить возможность выполнения xp_cmdshell, а это не безопасно.

Конструкция INSERT INTO OPENROWSET подразумевает наличие уже созданного CSV файла с нужными заголовками полей, тоже не подходит, так как это неудобно.

Остается только использовать что-то другое, например, Access, и для меня это оказалось лучшим вариантом, так как приложение, в которое мне необходимо было интегрировать возможность экспорта в CSV, как раз реализовано в виде ADP проекта Access 2003.

Сейчас в тестовом варианте я покажу Вам, как можно в ADP проекте Access 2003 реализовать возможность выгрузки результатов запросов в CSV файл.

Исходные данные

В качестве примера я буду использовать СУБД Microsoft SQL Server 2012 Express.

Допустим, у нас будет база данных Test, а в ней следующая таблица

       CREATE TABLE dbo.TestTable(
                Id int IDENTITY(1,1) NOT NULL,
                ProductName VARCHAR(50) NOT NULL,
                Price MONEY NULL,
                CONSTRAINT PK_TestTable PRIMARY KEY CLUSTERED (Id ASC))
        GO

Скриншот 1

Заполним таблицу тестовыми данными

   INSERT INTO dbo.TestTable
                           (ProductName, Price)
                 VALUES('Принтер',100)
        GO
        INSERT INTO dbo.TestTable
                           (ProductName, Price)
                 VALUES('Сканер',150)
        GO
        INSERT INTO dbo.TestTable
                           (ProductName, Price)
                 VALUES('Монитор',200)
        GO
        INSERT INTO dbo.TestTable
                           (ProductName, Price)
                 VALUES('Системный блок',300)
        GO
        INSERT INTO dbo.TestTable
                           (ProductName, Price)
                 VALUES('Ноутбук',400)
        GO

Скриншот 2

Посмотрим, что у нас получилось

      SELECT * FROM dbo.TestTable

Скриншот 3

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

Реализация экспорта данных с SQL сервера в формат CSV в Access 2003

Так как CSV это обычный текстовый формат данных, где значения разделяются запятой или другим символом нам достаточно написать код VBA, который позволял бы сохранять текстовый файл с расширением CSV.

Для этого открываем свой ADP проект, он соответственно должен быть подключен к тестовой базе Test (или к той, которая нужна Вам).

Создаем форму или открываем на редактирование существующую форму и добавляем на ней одну кнопку, например, я ее назвал ExportInCSV.

Примечание! Сразу скажу, что в примере ниже я показываю сам принцип выгрузки, но данную возможность можно сделать более универсальной, например, на форму добавить текстовое поле и в него писать SQL запрос, для того чтобы передавать в процедуру или сделать возможность самостоятельно указывать любой разделитель, в примере ниже он прописан вручную в коде или, например, Вам нужно динамически формировать название экспортируемого файла все это под свои нужды Вы легко можете доработать самостоятельно.

В «Обработку события» нашей кнопки вставляем следующий код VBA (я его подробно прокомментировал):

 Private Sub ExportInCSV_Click()
 On Error GoTo Err 'Обработка ошибок
    'Переменные
    Dim Path As String, NameFile As String, PathNameFile As String
    Dim PathSave As FileDialog, CountColumn As Integer, StrSql As String
    Dim Response As Variant, rs As ADODB.Recordset
    Dim StrLineInFile As String, Delim As String
    Delim = ";" 'Разделитель
    StrSql = "SELECT * FROM dbo.TestTable" 'Запрос к базе данных
    'Получаем данные
    Set rs = New ADODB.Recordset
    rs.open StrSql, CurrentProject.Connection, adOpenDynamic, adLockOptimistic
    'Узнаем количество полей
    CountColumn = rs.Fields.count
    'Выбор каталога для выгрузки
    Set PathSave = Application.FileDialog(msoFileDialogFolderPicker)
    With PathSave
            .ButtonName = "Сохранить"
            .title = "Выбор папки для выгрузки"
            .InitialFileName = "c:\"
            .AllowMultiSelect = False
    End With
    'Если выбрали каталог, то начинаем выгружать
    If PathSave.Show = -1 Then
        NameFile = "TestFile.csv" 'Имя файла
        Path = PathSave.SelectedItems(1) 'Путь
        'Проверка на последний обратный слеш
        If InStrRev(Path, "\") <> Len(Path) Then
            Path = Path & "\"
        End If
        'Итоговый файл
        PathNameFile = Path & NameFile
        Response = MsgBox("Данные будут сохранены в " & PathNameFile & vbNewLine & _
        "Для подтверждения нажмите [Да]", vbYesNo, "Подтверждение")
        If Response = vbYes Then
            Open PathNameFile For Output As #1
            'Записываем название полей
            For i = 0 To CountColumn - 1
                If StrLineInFile <> "" Then
                    StrLineInFile = StrLineInFile & Delim & rs.Fields(i).NAME
                Else
                    StrLineInFile = rs.Fields(i).NAME
                End If
            Next
            Print #1, StrLineInFile
            'Объединяем все поля и записываем в файл, каждую строку отдельно
            While Not (rs.EOF)
                StrLineInFile = ""
                    For i = 0 To CountColumn - 1
                        If StrLineInFile <> "" Then
                            StrLineInFile = StrLineInFile & Delim & rs.Fields(i).value
                        Else
                            StrLineInFile = rs.Fields(i).value
                        End If
                    Next
                Print #1, StrLineInFile
                rs.MoveNext
            Wend
            Set rs = Nothing
            Close #1
            MsgBox "Данные выгружены", vbDefaultButton1, "Результат"
        End If
    End If
 ex:
    Exit Sub
 Err:
    MsgBox Err.Description
    Resume ex
 End Sub

Примечание! Для работы FileDialog требуется подключить библиотеку Microsoft Office 11.0 Object Library. Это делается следующим образом: в редакторе Microsoft Visual Basic (где вы вставляете код VBA) откройте меню Tools->References, найдите нужную библиотеку, поставьте галочку и нажмите «ОК».

Сохраняем и запускаем нашу форму, щелкаем по кнопке (в моем случае ExportInCSV), в итоге у нас откроется диалоговое окно выбора пути сохранения файла, мы выбираем каталог для экспорта и жмем «Сохранить». Затем подтверждаем свое действие и жмем «ОК».

После того как выгрузка будет завершена, появится соответствующее сообщение. Для проверки открываем каталог, в который выгрузился файл, находим файл TestFile.csv и открываем его любым блокнотом, например, мне нравится Notepad++.

Скриншот 4

Видим, что нужные данные у нас выгрузились и разделитель точка с запятой, все как мы и хотели.

На этом все, удачи!

Понравилась статья? Поделиться с друзьями:
Заметки IT специалиста
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:
Нажимая на кнопку «Отправить комментарий», я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.