Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Заменить начало строки во всех записях таблицы БД "Access" в определенном поле / 9 сообщений из 9, страница 1 из 1
06.12.2021, 02:05
    #40117624
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить начало строки во всех записях таблицы БД "Access" в определенном поле
В общем есть БД аля MSAccess
Код: vbnet
1.
2.
3.
4.
    Try : adoConn = CreateObject("ADODB.Connection") : Catch : End Try 'New ADODB.Connection
    Try
      adoConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
...


Есть там в таблице назовем её 'outbox' поле назовем его 'file'

Когда-то пути к файлам писались относительные
fileout\4427B38D.tif
fileout\7DF71D92E361ECCECC.tif

Потом (лет 7 назад) понадобилось заменить на абсолютные вида

C:\ProgramData\My Proga\fileout\4427B38D.tif
C:\ProgramData\My Proga\fileout\7DF71D92E361ECCECC.tif

Справился тогда так (path_AppData = "C:\ProgramData\My Proga"):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
   Try
      'outbox
      adoConn.BeginTrans()
      adoConn.Execute("UPDATE outbox SET file='" _
       & path_AppData & "\' + file WHERE file  LIKE 'fileout\%'")
      adoConn.CommitTrans()
...
    Catch
    End Try



Сейчас при апгрейде до новой версии надо проапгрейдить это поле (имя папки данных программы меняется)
Т.е. переношу БД, муваю папку с файлами в новое место,
но надо стандартно поменять пути в самой БД к виду

C:\ProgramData\My Proga New Name\fileout\4427B38D.tif
C:\ProgramData\My Proga New Name\fileout\7DF71D92E361ECCECC.tif

Т.е. надо произвести замену в начале каждой строки
path_old_AppData= C:\ProgramData\My Proga\
на
path_new_AppData= C:\ProgramData\My Proga New Name\

Очень давно этими SQL запросами не занимался, тупеем(С)
м.б. кто сможет подсказать по быстрому чтоб мозг не рушить.
...
Рейтинг: 0 / 0
06.12.2021, 02:14
    #40117626
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить начало строки во всех записях таблицы БД "Access" в определенном поле
update <table> set field = REPLACE(field, from, to)
ну или логику обновления по умнее, стоит проверить, что строка начинается с заданной, обрезать её и вставить новую
...
Рейтинг: 0 / 0
06.12.2021, 02:42
    #40117630
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить начало строки во всех записях таблицы БД "Access" в определенном поле
Roman Mejtes
update <table> set field = REPLACE(field, from, to)
ну или логику обновления по умнее, стоит проверить, что строка начинается с заданной, обрезать её и вставить новую


Мне ну если дотошно, то надо
WHERE file LIKE path_old_AppData + 'fileout\%'"
то заменить path_old_AppData на path_new_AppData

Записи стандартные path_old_AppData + жесткое имя подпапки fileout + имя файла с расширением

Ну в принципе и ваш вариант REPLACE(field, from, to) без доп. проверок вполне пойдет
path_AppData = IO.Path.Combine(GetFolderPath(SpecialFolder.CommonApplicationData), "My Proga Name")
если конечно эта конструкция работает с этим типом БД, которая вообще говоря не Access а делается таким кодом
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
    ' Create the new database.
    Try : adoxCat = CreateObject("ADOX.Catalog") 'New ADOX.Catalog
    Catch : Exit Sub : End Try
    Try
      adoxCat.Create( _
       "Provider=Microsoft.Jet.OLEDB.4.0;" & _
       "Data Source=" & IO.Path.Combine(path_AppData, "log\<bdname>.mdb") & ";Jet OLEDB:Database Password=<password>")
    Catch


Процедура разовая,
решился наконец разделить большой проект "2 в 1" на два независимых, отсюда "My Proga New Name",
но надо б юзерам дать возможность автоматически перенести данные при апгрейде.

Ну я понял, надо пробовать, идея с REPLACE понятна
...
Рейтинг: 0 / 0
06.12.2021, 20:51
    #40117920
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить начало строки во всех записях таблицы БД "Access" в определенном поле
Код: vbnet
1.
UPDATE outbox SET file=REPLACE(file, 'C:\ProgramData\My Proga', 'C:\ProgramData\My Proga New Name') WHERE file LIKE 'C:\ProgramData\My Proga'\fileout\%'

Первый этап обработки исключения типа "System.Runtime.InteropServices.COMException" в Microsoft.VisualBasic.dll
Код: vbnet
1.
-2147217900: Неопределенная функция 'REPLACE' в выражении.



Undefined function replace

The Jet Database Engine doesn't support some of the functions you can use in Access, one of them is the Replace function.Unfortunatly, their is no alternative available, so the only option is do the replace in C# (or VB) code.

Не мой ли случай? И че делать?
Трехэтажный код с извлечением каждой строки и запихиванием обратно?
Неохота в это все врубаться.

Еще логический вариант убрать первые N символов (длина 'C:\ProgramData\My Proga' считается и добавить 'C:\ProgramData\My Proga New Name' к остатку).

Но хотелось бы через один запрос по любому без "do the replace in C# (or VB) code".
...
Рейтинг: 0 / 0
06.12.2021, 22:38
    #40117939
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить начало строки во всех записях таблицы БД "Access" в определенном поле
Осилил:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    Try
      'outbox
      adoConn.BeginTrans()
      adoConn.Execute("UPDATE outbox SET file='" _
       & path_AppData & "' + RIGHT(file, LEN(file) - " & CStr(Strings.Len(path_AppData_old)) _
       & ") WHERE file LIKE '" & path_AppData_old & "%'")
      adoConn.CommitTrans()
...
    Catch
    End Try
...
Рейтинг: 0 / 0
07.12.2021, 09:07
    #40117987
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить начало строки во всех записях таблицы БД "Access" в определенном поле
Дмитрий77
В общем есть БД аля MSAccess
Код: vbnet
1.
2.
3.
4.
    Try : adoConn = CreateObject("ADODB.Connection") : Catch : End Try 'New ADODB.Connection
    Try
      adoConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
...


Есть там в таблице назовем её 'outbox' поле назовем его 'file'

Когда-то пути к файлам писались относительные
fileout\4427B38D.tif
fileout\7DF71D92E361ECCECC.tif

Потом (лет 7 назад) понадобилось заменить на абсолютные вида

C:\ProgramData\My Proga\fileout\4427B38D.tif
C:\ProgramData\My Proga\fileout\7DF71D92E361ECCECC.tif

Справился тогда так (path_AppData = "C:\ProgramData\My Proga"):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
   Try
      'outbox
      adoConn.BeginTrans()
      adoConn.Execute("UPDATE outbox SET file='" _
       & path_AppData & "\' + file WHERE file  LIKE 'fileout\%'")
      adoConn.CommitTrans()
...
    Catch
    End Try



Сейчас при апгрейде до новой версии надо проапгрейдить это поле (имя папки данных программы меняется)
Т.е. переношу БД, муваю папку с файлами в новое место,
но надо стандартно поменять пути в самой БД к виду

C:\ProgramData\My Proga New Name\fileout\4427B38D.tif
C:\ProgramData\My Proga New Name\fileout\7DF71D92E361ECCECC.tif

Т.е. надо произвести замену в начале каждой строки
path_old_AppData= C:\ProgramData\My Proga\
на
path_new_AppData= C:\ProgramData\My Proga New Name\

Очень давно этими SQL запросами не занимался, тупеем(С)
м.б. кто сможет подсказать по быстрому чтоб мозг не рушить.


вам бы сделать доплнительную таблицу, вписать туда путь иди пути, заменить везде путь на параметр, и потом (через очередные 17 лет) менять в одно м месте - быстро и без проблем.
...
Рейтинг: 0 / 0
07.12.2021, 17:38
    #40118210
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить начало строки во всех записях таблицы БД "Access" в определенном поле
Ролг Хупин,

Откуда ж я знаю что мне через 17 лет понадобится.
Но за попытку помочь спасибо.
Система с этой базой работает без нареканий 10+ лет, забыл про нее, но вот понадобился маленький change.
Справился и ладно.
Нет уж того программирования в этом мире, сам у себя копипастю мышкой потихоньку, вот и все развитие.
На форумах уж почти никого нет.
...
Рейтинг: 0 / 0
07.12.2021, 19:24
    #40118251
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить начало строки во всех записях таблицы БД "Access" в определенном поле
Дмитрий77,

используй ado.net
...
Рейтинг: 0 / 0
07.12.2021, 22:50
    #40118292
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить начало строки во всех записях таблицы БД "Access" в определенном поле
pation
Дмитрий77,

используй ado.net


Честно когда-то пытался, поспотыкался и забил, например:
Эквивалент JRO.RefreshCache adoConn при переходе ADODB.Connection->OleDb.OleDbConnection

Мне надо чтоб работало, оно работает.
Я задал простой вопрос, простой ответ получен.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Заменить начало строки во всех записях таблицы БД "Access" в определенном поле / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]