Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/10: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Duff072
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 11
1

Получить файл из БД MS SQL server

31.05.2015, 12:12. Просмотров 1892. Ответов 23
Метки нет (Все метки)

Здравствуйте уважаемые знатоки, прошу помощи и совета - весь интернет перерыл, не нашёл похожего решения (плохо искал?).

На работе появилась необходимость немного автоматизировать рабочий процесс:
В Excel написан макрос, который анализирует подключенные к нему таблицы с SQL, находит новые нужные записи, обрабатывает их, по внутренним отчётам (другие книги excel), добывает недостающую информацию, и шлёт Email заинтересованным лицам. Прав администратора нет, поэтому сильно ограничены в действиях.

Так столкнулся с проблемой, что часть нужной информации лежит на SQL во полях blob во внутреннем неизвестном формате, и единственным местом, где что-то хоть как-то структурировано: файлик xml, который содержит всю необходимую информацию.
Находится в таблице: EDMsgXML, в которой есть столбцы EnvelopeID, Msg, Zip.
из которых:
EnvelopeID - идентификатор (достаточно легко можно найти, и загнать в переменную)
Msg - искомый файлик XML
Zip - признак архива (в архиве файл или нет).

Собственно вопрос: возможно ли средствами VBA добыть файл с SQL, сохранить на диск и, если нужно разархивировать?
Заранее благодарю за любую помощь

Добавлено через 3 часа 12 минут
Вот, пытаюсь по инструкции: http://codevb.narod.ru/db_3.html
Файл создается, но его размер 0.
Что может быть? Делаю по примерам, пытаюсь читать мануалы, но не хватает опыта и знаний
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2015, 12:12
Ответы с готовыми решениями:

[Microsoft][ODBC SQL Server Driver][SQL Server]Login failed- User: Reason: Not defined as a valid user of a trusted SQL Server connection
Login failed- User: Reason: Not defined as a valid user of a trusted SQL Server...

Получить тип столбца из таблицы в SQL Server посредством Linq to SQL
Как получить тип столбца из таблицы в SQL Server посредством Linq to SQL или...

Получить список таблиц из БД MS SQL Server
Хочу получит список таблиц из БД но не получается. Как правильно делать ?? ...

Получить список пользователей(MS SQL Server, пишу на C#)
Здравствуйте! Интерисует такой вопрос, как мне получить список всех...

получить данные из БД SQL server по значению textbox
Добрый день. Сделал програмулину которая записывает инфу с текстбоксов в бд,...

23
Duff072
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 11
31.05.2015, 14:16  [ТС] 2
Определенный бред удалось получить:
Файлики создает (во вложении пример), разного размера для разных записей (как и должно быть), но, странные какие-то. (может проблема в кодировке?). А может на SQL не в бинарном виде хранится? Как проверить?

Есть мысли у кого-нибудь?

Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Public Function LoadFileFromDB(FileName As String, _
    RS As Object, FieldName As String) As Boolean
    Dim iFileNum As Integer
    Dim lFileLength As Long
    Dim abBytes() As Byte
    Dim iCtr As Integer
    
    'On Error GoTo ErrorHandler
    If Not TypeOf RS Is ADODB.Recordset Then Exit Function
   iFileNum = FreeFile
    Open FileName For Binary As #iFileNum
        lFileLength = LenB(RS(FieldName))
        abBytes = RS(FieldName).GetChunk(lFileLength)
        Put #iFileNum, , abBytes()
    Close #iFileNum
    LoadFileFromDB = True
ErrorHandler:
End Function
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub sql()
Dim sConn As String
Dim oConn As New ADODB.Connection
Dim Ors As New ADODB.Recordset
uid = "'37588AA9-3998-4023-99FC-87746CC16E69'"
sConn = ("DRIVER=......")
oConn.Open sConn
Ors.Open ("SELECT Msg FROM GTD.dbo.EDMsgsXML EDMsgsXML WHERE (EnvelopeID=" & uid & ")"), oConn, adOpenKeyset, adLockOptimistic
LoadFileFromDB "C:\....zip", Ors, "Msg"
Ors.Close
End Sub
0
Вложения
Тип файла: zip 02.zip (13.1 Кб, 6 просмотров)
UBUNTU
209 / 134 / 29
Регистрация: 04.02.2015
Сообщений: 727
31.05.2015, 16:28 3
В чем проблема сейчас?

Добавлено через 4 минуты
И вопрос, а есть ли у Вас разрешение на работу с данной таблицей это главный момент всей вашей затеи...
1
Duff072
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 11
31.05.2015, 16:28  [ТС] 4
не могу понять, в каком виде хранятся данные. Соответственно как их сохранять?
А как проверить - незнаю. В прошлом сообщении вложил результат выгрузки как бинарные данные.
А может они в 16-м виде?
0
UBUNTU
209 / 134 / 29
Регистрация: 04.02.2015
Сообщений: 727
31.05.2015, 16:31 5
Проверьте сколько записей в наборе после выполнения Ors.Open ("SELECT Msg FROM GTD.dbo.EDMsgsXML EDMsgsXML WHERE (EnvelopeID=" & uid & ")"), oConn, adOpenKeyset, adLockOptimistic

Добавлено через 17 секунд
И вопрос, а есть ли у Вас разрешение на работу с данной таблицей это главный момент всей вашей затеи...
0
Duff072
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 11
31.05.2015, 16:45  [ТС] 6
Разрешение есть: если в Excel мастером добавить данные - добавляется, за исключением поля Msg. Так-же с этой таблицей работает программа, запущенная от моего имени.

А как проверить сколько записей? (полез курить учебники)

Что интересно, если выгрузить как строчки:
Кликните здесь для просмотра всего текста
Вместо
Visual Basic
1
2
3
4
5
    Open FileName For Binary As #iFileNum
        lFileLength = LenB(RS(FieldName))
        abBytes = RS(FieldName).GetChunk(lFileLength)
        Put #iFileNum, , abBytes()
    Close #iFileNum
написать
Visual Basic
1
2
3
4
5
6
    Open FileName For Output As #iFileNum
    lFileLength = LenB(RS(FieldName))
    
    abBytes = RS(FieldName).GetChunk(lFileLength)
    Print #iFileNum, abBytes()
    Close #iFileNum

ТО выгружает 7 Кб, вместо 14. - что это даёт не знаю.

P.S. В VBA можно сказать не силен. Делаю в основном по примерам, пытаюсь разобраться, методом проб и ошибок.
Голова пухнет уже .
0
UBUNTU
209 / 134 / 29
Регистрация: 04.02.2015
Сообщений: 727
31.05.2015, 17:09 7
Visual Basic
1
MsgBox Ors.RecordCount
Добавлено через 57 секунд
Архив поврежденный.
0
Duff072
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 11
31.05.2015, 17:26  [ТС] 8
Запись одна
(работает так: MsgBox Ors.RecordCount, по Вашему - ругается)

То что архив поврежден, я понял, а что с этим делать - х.з.

Вывожу как бинарные данные, (тогда там должен быть набор "0" и "1")?
А могут они там храниться в 16ричном виде? как их тогда вывести? (или бред несу?)
0
UBUNTU
209 / 134 / 29
Регистрация: 04.02.2015
Сообщений: 727
31.05.2015, 17:40 9
А можно через удаленку тимвивер увидеть? Мне базу делать лень
0
Duff072
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 11
31.05.2015, 17:48  [ТС] 10
К сожалению на работе всё порезано извне.
Шансов никаких - пробовали

В Microsoft Query эта таблица выглядит так: (вложение)
0
Миниатюры
Получить файл из БД MS SQL server  
UBUNTU
209 / 134 / 29
Регистрация: 04.02.2015
Сообщений: 727
31.05.2015, 18:32 11
Duff072, А возможно ли, что файл шифруется? Это похоже на считай в БД файл и зашифрованный.
0
Duff072
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 11
31.05.2015, 18:51  [ТС] 12
UBUNTU, спасибо за помощь.
На сколько есть информации на форуме разработчика - нет не шифрованный.
Задал им вопрос по поводу как от там хранится, и как его оттуда добыть - пока нет ответа.

Нашёл ещё по теме сохранения и записи:
https://support.microsoft.com/ru-ru/kb/194975
0
Duff072
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 11
01.06.2015, 17:05  [ТС] 13
Всё-таки прошу помощи:
Со слов разработчика, там всё лежит в явном виде, и ничто не должно мешать его получить, правда и подсказать, как сделать на VBA не могут.

Во вложении 2 примера (один файл выгружен VBA, второй программой).

Есть мысли у кого-нибудь?
0
Вложения
Тип файла: zip Новая папка.zip (14.8 Кб, 8 просмотров)
UBUNTU
209 / 134 / 29
Регистрация: 04.02.2015
Сообщений: 727
02.06.2015, 05:51 14
Чтобы вам помочь дайте мне скрипт sql этой таблицы
0
Kubuntovod
933 / 111 / 24
Регистрация: 14.01.2013
Сообщений: 526
02.06.2015, 07:52 15
Цитата Сообщение от Duff072 Посмотреть сообщение
Со слов разработчика, там всё лежит в явном виде, и ничто не должно мешать его получить, правда и подсказать, как сделать на VBA не могут.
Пусть покажут, как сделать на любом языке. Ибо, по сути, разница только в синтаксисе.
0
UBUNTU
209 / 134 / 29
Регистрация: 04.02.2015
Сообщений: 727
02.06.2015, 08:04 16
Разрабы наврядли покажут
0
Kubuntovod
933 / 111 / 24
Регистрация: 14.01.2013
Сообщений: 526
02.06.2015, 08:07 17
Так если уж там всё в отрытом виде и никаких секретов нет, то могли бы и показать, как они эту пургу в человеческий вид приводят. И сам запрос хотелось бы увидеть. Может оно прям в запросе корявится и так задумано
0
snipe
2892 / 996 / 231
Регистрация: 07.08.2013
Сообщений: 2,503
02.06.2015, 10:43 18
запустил в Excel вот такой макрос - инфа вытащилась на счет раз
логин-пароль заменил словами логин и пароль
Visual Basic
1
2
3
4
5
6
7
8
Sub macro120()
Set objConnection = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
objConnection.Open "Provider=SQLOLEDB;DRIVER=SQL Server;SERVER=GOSKONTROL\IAS_RPN;UID=логин;PWD=пароль;DATABASE=RPN"
sqlStr1 = "SELECT sg.* from IAS_RPN.R_OKVED sg"
rs.Open sqlStr1, objConnection, 3, 3
Cells(1, 1).CopyFromRecordset rs
End Sub
Добавлено через 8 минут
А вы уверены что msg это именно файл xml - а не имя файла
0
UBUNTU
02.06.2015, 11:31
  #19

Не по теме:

snipe, GOSKONTRO чего именно? Базку дадите почитать? :)

0
snipe
02.06.2015, 11:33     Получить файл из БД MS SQL server
  #20

Не по теме:

боюсь что базка сюда не влезет
а GOSKONTROL - это имя сервера

0
02.06.2015, 11:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2015, 11:33
Привет! Вот еще темы с ответами:

Как настроить MS SQL Server, чтобы через Access, можно было редактировать таблицы MS SQL Server?
ВОПРОС: Как настроить MS SQL Server, чтобы через Access, можно было...

Как средствами джавы реализовать просмотр базы данных Access, SQL Server, SQL Server Compact и запись в нее?
---

Подключиться к SQL 2000. BASE_STRING = 'Driver={SQL Server};Server=(local);Database=mybase;
Пишу поключение BASE_STRING = 'Driver={SQL...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru