powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Run-time error 3027. База данных доступна только для чтения :(
6 сообщений из 6, страница 1 из 1
Run-time error 3027. База данных доступна только для чтения :(
    #32786066
lomaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никакак не могу сделать UPDATE базы данных

Код: plaintext
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.
31.
32.
33.
34.
35.
36.
37.
Sub Database_Update() 

    Dim db As Database 
    Dim ws As Workspace 
    Dim rst As Recordset 
    Dim sConnection As String 
    Dim sAdr As String 
    Dim i As Integer 
    Dim iReplaceCount As Integer 

    Set ws = DBEngine.CreateWorkspace("myName", "UID", "", dbUseODBC) 
    
    sConnection = "ODBC;DSN=ORA;UID=lomaster;PWD=123;SERVER=oracle;" 
    Set db = ws.OpenDatabase("", False, False, sConnection) 
    Set rst = db.OpenRecordset("select code, adr from person where em = '28'") 

    i =  1  
    iReplaceCount =  0  
    With rst 
        Do 
            sAdr = .Fields("adr").Value 
            If IsNumeric(Left$(sAdr,  6 )) Then 
                .Edit 
                .Fields("ps_adr_1").Value = Right$(sAdr, Len(sAdr) -  7 ) 
                iReplaceCount = iReplaceCount +  1  
            End If 
            .MoveNext 
            i = i +  1  
        Loop While Not .EOF 
    End With 
    
    rst.Update 
    rst.Close 
    db.Close 
    ws.Close 
    
    MsgBox "Обработано записей: " & i -  1  & vbNewLine & "Изменено полей: " & iReplaceCount 
End Sub 


Возникает ошибка в строчке с .Edit
Run-time error '3027'
Обновление невозможно. База данных или объект доступны только для чтения.

Как побороть ???
Пробовал подключить другую базу (не Oracle, а просто DBF) - результат аналогичный :(
Что я делаю не так ???
Нашел тут ответ, что все дело - в отсутствии индекса. Ко мне - не подходит - таблица person индексирована по полю code
...
Рейтинг: 0 / 0
Run-time error 3027. База данных доступна только для чтения :(
    #32788291
lomaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблему с UPDATE я всетаки решил - иначе бы с работы уволили - (дело было срочное и важное).
Сделал так - вместо строчек с .Edit написал так
Код: plaintext
1.
strSQL = "UPDATE person SET ps_adr_1 = '" & sAdr & "' WHERE ps_code = '" & sCode & "' AND em = '28'" 
db.Execute strSQL 

И хотя в таком варианте каждое найденное значение (а их несколько тысяч) инициирует новый sql-запрос к БД, отработало на удивление быстро :)

Правда, как мне кажется, первоначальный вариант (с .Edit) смотрится как то логичнее и отрабатывать, наверное, должен еще быстрее...
Хотя, с другой стороны, как этот Recordset обновленные данные назад в базу возвращает?

Да и не работает с этим .Edit ни в какую...
Если кто ТОЧНО знает КАК ответьте - хоть и проблема решена по другому - интересно все таки...
...
Рейтинг: 0 / 0
Run-time error 3027. База данных доступна только для чтения :(
    #32788646
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msdn
Set recordset = object.OpenRecordset (source, type, options, lockedits)
по умолчанию type=dbOpenForwardOnly
принудительно выставьте все параметры
про скорость
само собой - при edit вы тащите на клиента весь курсор, меняете его, а потом отдаете обратно на сервер, в случае же "прямого" обращения - все действия происходят на сервере, напрямую на движке сервера баз данных.

...
Рейтинг: 0 / 0
Run-time error 3027. База данных доступна только для чтения :(
    #32788788
lomaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Методом научного тыка перебрал все возможные параметры и получил вполне рабочий код :)
Привожу полностью - (мож кому сгодится).
Не смущайтесь то, что Оракл - в большинстве случаев отработает и на любой другой базе (только строчку ODBC - подключения подправить).
Код: plaintext
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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
Option Explicit

Sub Database_Update()

    Dim db As Database
    Dim ws As Workspace
    Dim rst As Recordset
    Dim sConnection As String
    Dim sChangeData As String
    Dim sCode As String
    Dim iNumRec As Long
    Dim iReplaceCount As Integer
    Dim strSQL As String
    Dim sFieldName As String
    Dim sIndexKeyFieldName As String
    Dim sIndexKey As String
        
    Set ws = DBEngine.CreateWorkspace("myName", "UID", "", dbUseODBC)

    sConnection = "ODBC;DSN=ORA;UID=myname;PWD=mypassword;SERVER=oracle;"
    Set db = ws.OpenDatabase("", False, False, sConnection)

	strSQL = "SELECT * FROM person WHERE company = '568'"
    Set rst = db.OpenRecordset(strSQL, dbOpenDynaset, dbExecDirect, dbOptimisticValue)

    sFieldName = "ps_name"
    sIndexKeyFieldName = "number"
    iNumRec =  1 
    iReplaceCount =  0 
    With rst
        Do
			sChangeData = .Fields(sFieldName).Value
			If sChangeData = "Старые данные" Then
				sChangeData = "Новые данные"
'-------------------------------------------------
' 1-й вариант
				.Edit
				.Fields(sFieldName).Value = sChangeData
				.Update
'-------------------------------------------------
' или 2-й вариант (возможно даже быстрее чем 1-й)
				sIndexKey = .Fields(sIndexKeyFieldName).Value
				strSQL = "UPDATE person SET " & sFieldName & " = '" & sChangeData & "' WHERE " & sIndexKeyFieldName & " = " & sIndexKey
				db.Execute strSQL
'-------------------------------------------------
				iReplaceCount = iReplaceCount +  1 
			End If
            iNumRec = iNumRec +  1 
            .MoveNext
        Loop While Not .EOF
    End With
    
    rst.Close
    db.Close
    ws.Close
    
    MsgBox "Обработано записей: " & iNumRec -  1  & vbNewLine & "Изменено полей: " & iReplaceCount
End Sub
...
Рейтинг: 0 / 0
Run-time error 3027. База данных доступна только для чтения :(
    #32788865
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем нужен iNumRec имхо вроде было RecordCount у RecordSet.
...
Рейтинг: 0 / 0
Run-time error 3027. База данных доступна только для чтения :(
    #32789652
lomaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
big-dukeа зачем нужен iNumRec имхо вроде было RecordCount у RecordSet.


Не то

RecordCount Property
Returns the number of records accessed in a Recordset object, or the total number of records in a table-type Recordset or TableDef object.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Run-time error 3027. База данных доступна только для чтения :(
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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