Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/16: Рейтинг темы: голосов - 16, средняя оценка - 4.63
31 / 31 / 3
Регистрация: 08.08.2011
Сообщений: 195
1

Чтение полей Memo (blob) из Paradox

23.05.2014, 08:54. Показов 3358. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот как-то не ладится у меня работа с чтением этих полей.
Суть в том, что некое приложение ежедневно выкидывает данные в виде табличек на сетевой ресурс. Эти данные мне необходимо качнуть в MS SQL. То есть предложение с конвертацией никак не подходит. Необходима программная обработка. Все данные обработать получается без проблем. Однако вот с BLOB прямо беда какая-то. Мне бы хотя бы понять - как подступиться то из VB.NET (ну или C#). Есть множество примеров из Delphi, но все как-то построены на своеобразных компонентах и я в принципе не понимаю как притянуть это в код NET.
Во вложении две таблички: opert.db; opert.mb
Прошу пнуть в нужном направлении!
Вложения
Тип файла: zip opert.zip (4.7 Кб, 3 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.05.2014, 08:54
Ответы с готовыми решениями:

Filter в MEMO-поле Paradox-таблицы(BDE)?
Всем привет! Значит есть попытка реализовать загон многострочной информации в мемо-поле с помощью...

Редактирование полей таблицы Paradox
Имеется StringGrid со столбцами Имя, Тип, Размер поля. и есть Paradox таблица с каким-то набором...

Изменение наименования полей у БД Paradox.
Уважаемые форумчане, есть у меня небольшой просьба. Не подскажите ли Вы как можно программно...

что такое Blob memo? и как с ним работать?
Здравствуйте! подскажите пожалуйста что такое Blob memo? в delphi вводим в memo текст, а в бд...

14
31 / 31 / 3
Регистрация: 08.08.2011
Сообщений: 195
23.05.2014, 10:20  [ТС] 2
Понимаю, что без исходников ответа можно ждать сто лет. Поэтому на скорую руку собрал проект (VS2013) в котором наспех нарисовал суть проблемы. А она такова - поле MEMO в таблице OPERT существует, однако при чтении в Table абсолютно отсутствует. Очевидно - требуется некий иной подход. Но вот какой?
Для тестирования естественно потребуется установленный BDE.
Вложения
Тип файла: zip ParadoxRev.zip (83.4 Кб, 13 просмотров)
Тип файла: zip BDE.x64.zip (4.69 Мб, 11 просмотров)
Тип файла: zip BDE5x32.zip (4.10 Мб, 11 просмотров)
0
31 / 31 / 3
Регистрация: 08.08.2011
Сообщений: 195
23.05.2014, 10:41  [ТС] 3
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Imports System.Data.OleDb
Public Class Form1
 
    Dim conn As New OleDbConnection
    Dim command As New OleDbCommand
    Dim ConnectionString As String = ""
    Dim DbPath As String = Application.StartupPath & "\DataBase"
    Dim DbPWD As String = "jIGGAe"
    Dim Str As String = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Jet OLEDB:Database Password={1}; " & _
                                      "Extended Properties=Paradox 5.x; Data Source={0}; Mode=ReadWrite|Share Deny None;", _
                                            DbPath, DbPWD)
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        Try
            conn.ConnectionString = Str
            conn.Open()
            Dim Table As New DataTable
            command.CommandType = CommandType.Text
            command.CommandText = "SELECT * FROM [OPERT]"
            command.Connection = conn
            command.ExecuteNonQuery()
            Dim da = New OleDbDataAdapter(command)
            da.Fill(Table)
            Me.DataGridView1.DataSource = Table
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
 
End Class
1
31 / 31 / 3
Регистрация: 08.08.2011
Сообщений: 195
28.05.2014, 19:36  [ТС] 4
Предлагаю заглянуть на https://www.cyberforum.ru/orde... 91216.html
0
Почетный модератор
21413 / 9147 / 1083
Регистрация: 11.04.2010
Сообщений: 11,014
28.05.2014, 19:48 5
Та тема о том же, что и эта?
0
31 / 31 / 3
Регистрация: 08.08.2011
Сообщений: 195
29.05.2014, 06:21  [ТС] 6
По сути, Памирыч, там предлагается написать за деньги и на Дельфях, некую DLL позволяющую иметь нормальный, стандартизованный интерфейс доступа табличкам Paradox.
Кстати, я там за ночь накидал общую картину того, как я это вижу...
0
39 / 40 / 20
Регистрация: 30.09.2013
Сообщений: 141
02.06.2014, 17:06 7
RafStudio, долго искал способ нормально читать из Paradox. Попробовал использовать кусок кода, который ты выше выложил, для своих нужд. Возник вопрос - а есть способ преобразовать кодировку текста при чтении? А то всё, что по-русски в БД записано, отображается кракозябрами.
Спасибо.
0
Заблокирован
02.06.2014, 20:49 8
Paradox? На дворе 2014 год! Windows Azure, SQL Server 2014, MySQL 5.6 куда вы!
0
39 / 40 / 20
Регистрация: 30.09.2013
Сообщений: 141
02.06.2014, 22:01 9
Цитата Сообщение от inv.DS Посмотреть сообщение
Paradox? На дворе 2014 год! Windows Azure, SQL Server 2014, MySQL 5.6 куда вы!
Увы, до сих пор большое количество софта использует этот устаревший формат =(((( Например, система ресторанного учета R-Keeper, на которой работает большинство ресторанов в нашей стране....
0
31 / 31 / 3
Регистрация: 08.08.2011
Сообщений: 195
25.02.2015, 17:06  [ТС] 10
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от FlegmaSpirit Посмотреть сообщение
а есть способ преобразовать кодировку текста при чтении?
Ох, извини, что так поздно откликнулся. Уж наверняка ты и сам за это время нашел ответ. А их тут на самом деле несколько. Во первых стоит произвести настройки драйвера BDE через стандартную утилиту Borland. Во вторых (и часто) помогает исправление типа того, что во вложении. В кратце - там файл реестра с некоторыми подменами. После применения - обязательна перезагрузка. Рекомендую перед применением, выгрузить соответствующие изменяемые ветки реестра. Ну или вообще реестр забекапить соответствующей утилитой, чтобы ежели чего - откатиться!
Вложения
Тип файла: zip font.zip (658 байт, 8 просмотров)
1
1713 / 1201 / 227
Регистрация: 23.12.2010
Сообщений: 1,530
25.02.2015, 19:09 11
Вопрос: а что хранится в полях типа blob?
Как я понимаю, там записан некий массив байт, который может быть как файлом, так и изображением, так и текстом (в т.ч. rtf). По логике вещей, надо делать выборку не всех полей в таблицу а поименно с пропуском данного, а уже данное поле подгружать по требованию пользователя в массив byte(). Также, по логике вещей, в БД должна быть информация о том, данные какого типа там записаны (например, если это файл, то должно быть известно хотя бы его расширение) или же может быть так, что хранятся данные одного предопределенного типа и тогда конечная программа, которая работает с БД, сама знает что там за данные.
0
39 / 40 / 20
Регистрация: 30.09.2013
Сообщений: 141
28.02.2015, 01:03 12
Нет, решение я так и не нашел. До сих пор.

И правка реестра тоже не помогла =(((

А что конкретно можно в настройках BDE на этот счет покрутить????

Может есть какой-то вариант конвертить "на лету"?

Добавлено через 5 часов 36 минут
Смог выяснить, что текст из файла приходит в кодировке "Западноевропейская (Windows)"
Как его преобразовать в Unicode или в 1251?

Добавлено через 2 часа 50 минут
В общем, пока приколхозил вот такой вариант:

VB.NET
1
2
3
4
5
    Public Function ConvertToUtf(ByVal source As String) As String
        Dim srcEncodingFormat As Encoding = Encoding.GetEncoding("windows-1252")
        Dim originalbytestring() As Byte = srcEncodingFormat.GetBytes(source)
        Return Encoding.Default.GetString(originalbytestring)
    End Function
Работает без нареканий, но что-то подсказывает мне, есть вариант быстрее и правильнее
0
31 / 31 / 3
Регистрация: 08.08.2011
Сообщений: 195
27.03.2015, 19:40  [ТС] 13
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
Как я понимаю, там записан некий массив байт
Уважаемый Дмитрий, не в первый раз сталкиваюсь с Вашими ответами и рекомендациями, а потому, зная Ваш огромный опыт, скажу кратко - BLOB в понимании BDE действительно просто некий массив (поток, если так проще) байт. Проблема в том, что стандартные подходы OleDb и прочие (включая ODBC) от Microsoft не подходят. В MSDN они так прямо и говорят - поддерживаем все поля данных в Paradox кроме BLOB (и в этом есть некое лукавство Microsoft - решить данную проблему, не думаю, что для них сложность. Вопрос в продвижении своего продукта, а потому и незачем полноценно решать проблему - юзайте конвертеры). На сайте codeproject есть некоторые наработки на эту тему у Petr Bříza (статья: Paradox database native .NET reader), но это не совсем то, что надо - нет решения проблемы с файлами защищенными паролями, хотя подход весьма интересный, надо признать!
Однако, возвращаясь к сути - на сегодняшний день я нашел только одну приблудину, 100% решающую проблему чтения любых полей из таблиц Paradox. Это ActiveX компонент под названием Paradox Direct Engine (ActiveX edition) некоего "школьника" под ником Mike Shkolnik. Особо радует отсутствие проблем при работе с таблицами, занятыми на данный момент другими приложениями использующими BDE. (Майкрософтовские драйвера при этом вообще падают в осадок). Я позволил себе изменить демо-приложение для NET платформы Visual Studio 2013 в сборке прикрепленной ниже, включая bat-ники для инсталляции и деинсталляции данного компонента. Но, поскольку начал разглядывать его пристально только вчера, скажу сразу - некоторые моменты несколько меня не порадовали, хотя основное - читать BLOB-поля он выполняет на ура. Надеюсь, что и для Вас, FlegmaSpirit это будет мало-мальски утешением, а может и решением некоторых проблем.
Однако, в целом - проблем сохраняется. Может оговоренный выше компонент и может несколько большее, чем я отковырял в DEMO для NET, но пока я не разобрался до конца, а потому и не готов, на сегодня, платить за него 75$...
Во вложении PXDA_M.zip - измененные мной батники и Демо-проект для NET. На всякий случай во вложении pxda.zip оставил все так, как было у авторов...
Вложения
Тип файла: zip pdxa.zip (1.43 Мб, 16 просмотров)
Тип файла: zip PDXA_M.zip (1.59 Мб, 15 просмотров)
0
31 / 31 / 3
Регистрация: 08.08.2011
Сообщений: 195
28.03.2015, 00:08  [ТС] 14
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
например, если это файл, то должно быть известно хотя бы его расширение
На сколько я знаю - это просто массив байтов. Нет ничего, говорящего о том, что это за файл. Разработчик сам принимает решение о том, каким образом интерпретировать данный массив.
И еще раз спасибо, за осмысленные попытки найти истину.
Касаясь предложения
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
надо делать выборку не всех полей
можно сказать (или повторить) следующее - подключения с помощью драйверов Microsoft Jet или ODBC являются наиболее ущербными по своей сути. В статье http://support.microsoft.com/en-us/kb/230126/en-us описываются некоторые (подчеркиваю - именно НЕКОТОРЫЕ) ограничения. На деле их значительно больше. От того и проблема - местами, крайне необходимые BLOB-поля не то, что необходимо выбирать по отдельному запросу пользователя, они в принципе недоступны с использованием указанных выше драйверов... Я не стал искать статью одного уважаемого человека, который в полной прелести ощутил на себе попытки прилабунить доступ к Paradox из Visual Studio и вывел с десяток проблем на данной почве - не факт, что найду. Но помню - прочитав тогда, понял, что пользовать столь услужливо написанные Microsoft драйвера, можно только на самом примитивном уровне. Во всех более или менее серьезных вещах, ребята всегда предлагают конвертировать данные в MS SQL и далее уже работать там. (Не скажу, что это плохо - это прогресс на самом деле, просто некоторые приложения этого в принципе не позволят и мало того - конечный покупатель, он же и клиент, зачастую не может или не желает, в силу множества причин, включая финансовые, этого делать. (Плох клиент или недальновиден - вопрос другого порядка, впрочем - Вы это и сами понимаете.) При чем, самое интересное, это ошибки, которые выписывают драйвера от Microsoft при работе с таблицами Paradox. Они зачастую настолько не соответствуют действительности, что только методом проб и ошибок вообще возможно понять то, что в действительности происходит при подключении/выполнении стандартных с виду операций...
Короче - в этом месте ребята от Билла нас просто водят за нос. Вот и приходится, работать с велосипедом. Но это не значит, что парень типа Dev.Free (хоть и забанен) с виду перспективу гласит. Написать полноценное серьезное приложение для клиента в виде клиент-серверной архитектуры - всегда выглядит заманчиво. И для программиста (есть на чем подучиться, наесться и добавить не только в кошелек, но и в будущие проекты наработанный код) и для клиента (современная устойчивая к падениям база данных, скорость работы и новые технологии, включая внешний интерфейс) Upgrade предпочтителен. Но на деле - вопрос стоит не в 50 а чаще даже не 100 тысячах рублей. Значительно выше. Ибо за меньшие деньги никто и никогда, ради своего саморазвития, не пойдет на серьезные проекты, от которых зависит работоспособность серьезного предприятия. И получается - расход в виде 600/1000 тысяч рублей большинство предприятий на обслуживании обычного программиста не потянут, но те, кто готов заплатить, разламывают голову программисту простым выводом - одному, в обозначенные сроки, а то и вообще в принципе - не потянуть...
Иногда проще заморозить проект и заняться плясками с бубном, под названием Microsoft OleDb или нечто похожим...
Проходит время и раз от разу возвращаясь к проблеме, начинает хоть что-то вырисовываться, и ты начинаешь ощущать собственные возможности в решении задачи. И это хорошо! (по крайней мере, мне так это видится).
В общем и целом - это я конечно слишком далеко ушел от действительной проблемы. (Простите Дмитрий - виноват, Вам это вообще ни к чему выслушивать - более чем уверен) Однако суть от этого не изменилась - есть сотни приложений, от которых не избавиться за раз и даже за пять, но есть необходимость тянуть данные. И вот тут приходится и надо искать варианты решений. Это я как-раз к тем, кто орет о том, что надобно юзать новейшие технологии...
Извините, что так долго и нудно, (повторюсь - не к Вам лично Дмитрий, просто не стал дробить ответ) найти решение соразмерное с вознаграждением и тратой собственных усилий - по-моему самое идеальное решение. Ну и конечно: если есть решение от более опытных коллег - бывает, что лучше к ним направить ... Ну в общем направить и Бог с ним - на время позабыть задачу.
"Есть многое в природе, друг Горацио, что и не снилось нашим мудрецам." - По моему весьма достойно. Но, поиски на этом как правило не заканчиваются! Проходит время и раз за разом мы возвращаемся к тому, что не смогли одолеть когда-то! Потом приходит время - вновь решился. Конечно жаль, что поздно, но ищешь решение, которое, как правило, станет знаменателем бессонных ночей. Ведь каждому, наверняка, известна ситуация, когда ложишься спать, а варианты так и сыпят в голову. Лежишь, считаешь - что можно, что нельзя. Как лучше. Иногда встаешь и делаешь шаги. Потом опять в кроватке умолкаешь, но вот уж утро - на работу... Черт ее дери! Ну а потом, чуть позже, в свете дня, уже и полное решение возникает!

Добавлено через 31 минуту
Цитата Сообщение от FlegmaSpirit Посмотреть сообщение
Как его преобразовать в Unicode или в 1251?
На удивление, в описанном выше ActiveX компоненте, данный вопрос тоже решен - от pcDOS кодировки (по моему, не помню уже сейчас - пятница, выпил и т.п. - CP866) до Windows-1251.
Но, повторяюсь, я еще пока не до конца понял принципы работы данного компонента. Мало того - он абсолютно разрушает весь подход в плане обращения к базам данных (ну или табличкам в понимании Paradox). Без полного перелопачивания исходного кода приложения не обойтись. А потому, прежде, его следует до конца пощупать. Я только пока предложил в качестве варианта данный компонент. В DEMO-проекте для NET, меня он удовлетворил тем, что не смотря на ущербность необходимости грузить в некую промежуточную mdb-таблицу - решает загрузку всех полей в принципе. (в измененном мною демо-проекте для NET, при выгрузке cкажем в csv, прекрасно наблюдаем при открытии полученного файла в Exel поле BLOB - особо очевидно в последней строке, где виден чек из указанного поля, в текстовом формате)

Добавлено через 26 минут
Цитата Сообщение от FlegmaSpirit Посмотреть сообщение
А что конкретно можно в настройках BDE на этот счет покрутить????
Возвращаясь к Вашему вопросу, на счет "покрутить".
По сути, уж коли Вы установили BDE, то в панели управления у Вас нарисовался BDE Administrator, у которого на вкладке Configuration в дереве есть Native, где Вы должны для драйвера PARADOX и параметра LANGDRIVER указать требуемый лично Вам параметр. Как правило по-умолчанию 'ascii' ANSI не совсем то, что Вам нужно, от-того пробуйте либо Pdox ANSY Cyryllic либо Paradox Cyrr 866. Бывает, что спасает dBASE RUS cp866
Данные настройки глобальны и по сути должны помочь. Вопрос только в том, сколько разнообразных приложений со своими кодировками используется именно на Вашем компьютере.
Вообще, можно при желании менять как IDAPI32.CFG так и в наглую лезть в реестр. Вот только изменения на ходу, в работающем приложении, при этом вряд-ли возможны...
Но, при должном знании, не сомневаюсь, можно править и определенные ячейки памяти в оперативке, а проще - перед открытием файла. Какие точно: сразу не скажу - читать надо. Где-то, на страницах этого форума мне уже кидали ссылки на подобные полезняшки. Однозначно - все изначальные настройки таблицы хранятся конкретно в ее теле и задаются они предварительно, перед созданием таблицы, в настройках BDE. Изменить позже кодировку можно в DBD32.exe После изменения, я так думаю, подсмотрев в HEX - что именно изменилось, далее возможно менять этот байт (а по моему именно он один и должен меняться) извне на в принципе необходимый.
Но это моя теория, я еще не пробовал... Мало того - как правило таблицы зашифрованы при помощи как минимум стандартного jIGGAe
Как бы то ни было, надеюсь, что натолкнул на мысль!

Добавлено через 16 минут
Цитата Сообщение от FlegmaSpirit Посмотреть сообщение
Encoding.GetEncoding("windows-1252")
Уже эта строка говорит о далеко не windows-1251 - родной кириллицы.
Пробуйте! Я, к сожалению, пока нацелен на другой вопрос. Если Вам удастся найти истину, не перемените - расскажите нам всем о своей победе!

Добавлено через 49 минут
Цитата Сообщение от FlegmaSpirit Посмотреть сообщение
Encoding.GetEncoding("windows-1252")
Вот не поленился-же я наговорить глупостей немного выше!
Не принимай сказанное типа - "говорит о далеко не windows-1251" в серьез. Не буду оправдываться - гляди в настройки BDE.
Но, пользуясь моментом, немного расскажу о своих мцырях:
Попробуй оформить отправку данных с параметром даты в MySQL таблицу, через хранимую процедуру...
Вот там тоже - срыв мозга, прежде чем синаптические связи в голове приходят к пониманию, что дату надобно передавать через некий конвертор, понятный только MySQL, хотя с виду пользуешь заточенный именно под NET MySQLConnector и при этом в процессе получения значения Даты все происходит как нельзя хорошо!!!

Добавлено через 47 минут
Я что хотел сказать - пока не поправили тебя на тему
Цитата Сообщение от FlegmaSpirit Посмотреть сообщение
Код Visual Basic .NET
* * Public Function ConvertToUtf(ByVal source As String) As String
* * * * Dim srcEncodingFormat As Encoding = Encoding.GetEncoding("windows-1252")
* * * * Dim originalbytestring() As Byte = srcEncodingFormat.GetBytes(source)
* * * * Return Encoding.Default.GetString(originalbytestring)
* * End Function
Тебе-то вроде как и не зачем страховаться типа - может есть лучше...
Всегда найдется что-то лучше... Особо, если взглянуть со стороны С++...
Да правильно все!
В свое время в ZX-Revew была рубрика, которая называлась "Перлы", где для искушенных, преподавались куски кода на ассемблере, для процессора Z80 (прародителя x86, точнее это x86 родился из разногласий внутри компании-производителя. Но дело не в этом, хотя язык Z80 я понимаю намного лучше мнемоник x86). Так вот, там люди действительно боролись за байты, а порой и за 1/8 байта, дабы получить оптимально и скорость и размер тела ROUTINES. В те времена, твой вопрос, возможно и вызвал бы нездоровый интерес у профессионалов. Сегодня, мне так кажется, просто решай задачу. Решил - хорошо. Оптимизируй позже и шагами - все равно до оценки по сути миллион шагов. Сегодня перлов-то и нет. Так что бери и делай, а далее совершенствуй в меру возможности. Все равно на предмет Paradox не будет претензиатов! У них сейчас в голове совсем другие опилки! Ибо, если бы кто-то и думал об оптимизации - никогда в сторону древнего Paradox. Оставишь как есть - никто и не заметит! Сегодня языки программирования население рожает в таком количестве, что не каждая баба заметит - кто из рожденных хорош! А все болеющие Вавилоном от рождения - родят новые языки общения и программирования. Обязательно доказывая, что их язык и есть то, что люди ждали. Точнее - рожающие от скучности страдали возвышением над теми, кого им в принципе рукой не достать...
Им всегда мало. И каждый, на перебой стремиться доказать - чем новее язык, тем он богаче и умнее!
Хорошо бы так. Вот только от Ассемблер все равно, ...поматерился..., ну только из трусняков выпрыгнуть!
В общем- не парься. Нашел решение - ДЕРЖИ ПЯТЬ! Какое бы оно там ни было! Просто пройдет время и найдешь более правильное решение! В топике про Paradox, тем более в связке с Visual Studio - почти не найти искателей!
0
31 / 31 / 3
Регистрация: 08.08.2011
Сообщений: 195
12.09.2016, 11:31  [ТС] 15
В общем и целом проблема мною решена. Чтобы не повторяться с ответом, просто идите по ссылке https://www.cyberforum.ru/post9533818.html
0
12.09.2016, 11:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.09.2016, 11:31
Помогаю со студенческими работами здесь

Добавление полей в существующую таблицу Paradox
Здравствуйте. Друзья, помогите создать еще одно поле в существующей таблице Paradox (таблица уже...

Вопрос: определение полей blob и text
Требуется вывод типов полей таблицы. Проблема в том, что в базе MySql тип данных является...

Хранение изображений в виде blob полей
Добрый день. Поделитесь пожалуйста примером записи изображений в blob поля базы данных. Желательно...

Отображение полей типа BLOB в DBGrid
У меня в базе есть поле с типом BLOB, подскажите как его отобразить в DBGrid. Мне подсказали, что...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru