Запрос на изменение

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Запрос на изменение

Сообщение KPEATOP » 10.06.2005 (Пт) 14:01

Путаюсь занести данные в таблицу базы данных, при выполнении Execute программа пишет Run-Time Error 3073(В операции должен использоваться обновляемый запрос). Как мне это сделать. Если кто подскажет, заранее спасибо

Set qdfTemp = db.CreateQueryDef("")
qdfTemp.SQL = "UPDATE arx_kwd_tnp SET Koprod=" & OP & _
",Ckin_eff=" & SKIN & " WHERE Id=" & TnpID
qdfTemp.Execute
Вечность пахнет нефтью

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 10.06.2005 (Пт) 20:28

Попробуй так:
Код: Выделить всё

Dim sCn as String, sSQL as String
Dim Cn As ADODB.Connection

sCn = "Driver={Microsoft Access Driver (*.mdb)};" & _
        "Dbq=C:\db.mdb;Uid=Admin;Pwd=;"   'Строка подключения к БД
Set Cn = New ADODB.Connection       'Создаем новый экземпляр

Cn.CursorLocation = adUseClient     'Cursor Location (Client/Server)
Cn.Open sCn

sSQL="UPDATE ... "   'Твой запрос
Cn.Execute sSQL


KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Сообщение KPEATOP » 15.06.2005 (Ср) 7:18

Не получилось у меня так. В самой первой строке ошибку выдает
Dim Cn As ADODB.Connection

пишет "User-defined type not defined"
Вечность пахнет нефтью

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Сообщение KPEATOP » 15.06.2005 (Ср) 7:27

Кстати, база данных, в которую я хочу сохранить данные, не Access а ODBC
Вечность пахнет нефтью

Al Khamid
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 274
Зарегистрирован: 11.02.2004 (Ср) 10:00
Откуда: Москва, Ховрино

Сообщение Al Khamid » 15.06.2005 (Ср) 8:06

22
Последний раз редактировалось Al Khamid 08.12.2007 (Сб) 9:22, всего редактировалось 1 раз.

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Сообщение KPEATOP » 15.06.2005 (Ср) 9:34

"arx_kwd_tnp" это таблица
Вечность пахнет нефтью

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Сообщение KPEATOP » 15.06.2005 (Ср) 10:08

У меня ошибку выдает когда пишу
Dim Cn As ADODB.Connection
Как мне добавить ADO ?
Вечность пахнет нефтью

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 15.06.2005 (Ср) 10:49

Меню проект ->Информация->ставишь галку на микрософт activeX Data...

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 15.06.2005 (Ср) 13:27

Алексей К. писал(а):Меню проект ->Информация->ставишь галку на микрософт activeX Data...


у как, народ 6 рашен юзает....
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Сообщение KPEATOP » 15.06.2005 (Ср) 13:31

может кто-нибудь напишет код, как мне запрос сделать на сохранение.
Я пишу:

Set qdfTemp = db.CreateQueryDef("")
qdfTemp.SQL = "UPDATE arx_kwd_tnp SET Koprod=" & OP & _
",Ckin_eff=" & SKIN & " WHERE Id=" & TnpID
qdfTemp.Execute

у меня выдает ошибку на .Execute
может я непрвильно делаю или есть другой способ?
Вечность пахнет нефтью

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 15.06.2005 (Ср) 13:34

Дорогой КРЕАТОР, какого типа у тебя поля: Koprod и Ckin_eff?
надеюсь, что сам найдешь свою ошибку :wink:

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Сообщение KPEATOP » 15.06.2005 (Ср) 13:52

У полей Koprod и Ckin_eff тип Long
А где ошибка то? Не вижу
Вечность пахнет нефтью

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 15.06.2005 (Ср) 13:54

почитай про CreateQueryDef, узнаешь , что запросы в базе данных Access бывают разных типов

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 15.06.2005 (Ср) 13:56

и не забывай:
Код: Выделить всё
...
db.QueryDefs.Append qdfTemp
db.QueryDefs.Refresh
...
qdfTemp.Execute

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Сообщение KPEATOP » 15.06.2005 (Ср) 14:05

у меня база данных не Access а Oracle
Вечность пахнет нефтью

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 15.06.2005 (Ср) 14:15

...а подробностей становилось все больше и больше...

tarrac
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 14.06.2005 (Вт) 16:58

Сообщение tarrac » 15.06.2005 (Ср) 14:21

А я вот эти кодом в принципе всю работу с базами данных делаю:
Код: Выделить всё

Option Explicit

Public cn As ADODB.Connection
Public rs As New ADODB.Recordset
Public strConnect As String


Function ADODB_ConnectedJet() As Boolean
'Подключение к базе даззых
On Error GoTo er_error
'Сборка пути к базе данных
Dim strcon As String: strcon = App.Path & "\Data\Date.mdb"
    Set cn = New ADODB.Connection
    cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strcon & ";Mode=ReadWrite|Share Deny None;Persist Security Info=False"
    cn.Open
    cn.CursorLocation = adUseClient
'связывание RecordSet'а с соединением
    Set rs.ActiveConnection = cn
    ADODB_ConnectedJet = True
        Exit Function
er_error:
    ADODB_ConnectedJet = False
End Function

Function connect(strConnect As String, i As Boolean) As Boolean
On Error GoTo er_error
'занесение запроса в recordset
rs.Source = strConnect
'открытие запроса
rs.Open
'если надо вставать на 1-ю запись (для select, например) i = true
If i = True Then rs.MoveFirst
    connect = True
    Exit Function
er_error:
Dim a As Double: a = Err.Number
Select Case a
    Case 3705
        'если recordset уже открыт - закрываем его
        rs.Close
        Resume
    Case 3021
        'при rs.EOF=true - и при попытки встать на первую запись (при втором параметре функции true)
        MsgBox "Отсутствуют записи в таблице"
        connect = False
    Case Else
        'во всех остальных случаях выдать сообщение об ошибке и наш
        'SQL запрос для анализа
        MsgBox Err.Description & " " & strConnect
        connect = False
End Select
End Function

Функция connect принимает собственно SQL запрос. Вторая переменная показывает надо ли вставать на первую запись (true надо только при Select)
Может поможет...
Явное указание наследственности отменяет полиморфизм виртуальных функций

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 15.06.2005 (Ср) 15:06

может у тебя в настройках DSN ODBC для оракла стоит галка Только для чтения? или возможно, что у тебя нет прав на изменение данных в указанной тобой таблице на стороне оракла.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 15.06.2005 (Ср) 15:10

а у тебя таблица arx_kwd_tnp - это имя прилинковой таблицы оракла в Access-е ? если это имя таблицы в самом оракле, то тогда тебе надо сначала прилинковать саму таблицу или passthru запрос к ней в твою базу, а уже потом update выполнять, иначе только через прямое соединение ADO через провайдер к ораклу
и не забывай указывать схему данных для оракла иначе будет схема по-умолчанию, т.е под тем юзером, что ты входишь в оракл по данному соединению

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Сообщение KPEATOP » 15.06.2005 (Ср) 15:41

Счтывание данных из базы у меня идет нормально. Соединяюсь я вот так :
"ODBC;DSN=bdskw 10.1.6.5;uid=;pwd=;DATABASE=bd_skw;
А вот запись данных в базу не идет.
arx_kwd_tnp - это имя таблицы в самом оракле.
А кам это "через прямое соединение ADO через провайдер к ораклу" ?
Вечность пахнет нефтью

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 15.06.2005 (Ср) 15:51

А это так:

Код: Выделить всё
Dim cn as ADODB.Connection
Dim ConnectString as String
Dim SQL as String

ConnectString="Provider=Microsoft OLE DB Provider for Oracle;Data Source=oracleTNS;User ID=scott;Password=tiger;"

Set cn=New ADODB.Connection
cn.Open ConnectString

SQL="UPDATE MyTable SET Field1=123 WHERE ID=1"
cn.Execute SQL

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 15.06.2005 (Ср) 16:01

"В операции должен использоваться обновляемый запрос" в том числе может означать ошибка в синтаксисе запроса. Что возвращает debug.print qdfTemp.SQL?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 15.06.2005 (Ср) 16:07

Sedge
он пытается через акцессовский QueryDef обновить таблицу, котрая находится в оракле (в акцессе ее нет и она не прилинкована)

конечно можно сделать passthru-запрос, но тогда надо обязательно перед свойством SQL указать Connect:

Код: Выделить всё
Set qdfTemp = db.CreateQueryDef("Upd_myquery")
qdfTemp.Connect="ODBC;DSN=bdskw 10.1.6.5;uid=;pwd=;DATABASE=bd_skw;"
qdfTemp.SQL = "UPDATE arx_kwd_tnp SET Koprod=" & OP & _
",Ckin_eff=" & SKIN & " WHERE Id=" & TnpID
db.QueryDefs.Append qdfTemp
db.QueryDefs.Refresh

qdfTemp.Execute

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 15.06.2005 (Ср) 16:09

и все равно нужно схему данных указывать:

SCOTT.arx_kwd_tnp

SCOTT - это схема данных, а у тебя вообще UID пустой, а должен быть юзер, через которого ты в оракл заходишь (это и есть схема данных для тебя)

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Сообщение KPEATOP » 16.06.2005 (Чт) 6:51

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

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Сообщение KPEATOP » 16.06.2005 (Чт) 7:06

debug.print qdfTemp.SQL возвращает
UPDATE arx_kwd_tnp SET Koprod= 2.52,Ckin_eff=-1.26,Gidr= 136.09,Kprod= 88.89,Pplast= 12.96,Pzab= 12.87,Pplast_vnk= 13.25,Pron_w= .0337,Pron_n= .0012,Kol_zam= 7,K_kor= .986 WHERE Id=1395

здесь ошибки нет, потому что на стороне Оракла проверяли этот запрос, работает
Вечность пахнет нефтью

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.06.2005 (Чт) 11:43

прочитай мои предыдущие посты, там я тебе предложил 2 варианта решения твоей проблемы: 1 - использовать ADO, 2 - используя Passthru Query в Access

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Сообщение KPEATOP » 16.06.2005 (Чт) 13:09

Через ADO я не понял как мне подключаться к базе.

ConnectString="Provider=Microsoft OLE DB Provider for Oracle;Data Source=oracleTNS;User ID=scott;Password=tiger;"

у меня подключение для чтения данных

ODBC;DSN=bdskw & _ 10.1.6.5;uid=guest_armits;pwd=armits;DATABASE=bd_skw;



так тоже не получается:

Set qdfTemp = db.CreateQueryDef("Upd_myquery")
qdfTemp.Connect="ODBC;DSN=bdskw 10.1.6.5;uid=;pwd=;DATABASE=bd_skw;"
qdfTemp.SQL = "UPDATE arx_kwd_tnp SET Koprod=" & OP & _
",Ckin_eff=" & SKIN & " WHERE Id=" & TnpID
db.QueryDefs.Append qdfTemp
db.QueryDefs.Refresh

Когда выполняется db.QueryDefs.Append qdfTemp , пишет "Invalid Operation"
Вечность пахнет нефтью

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.06.2005 (Чт) 14:02

Код: Выделить всё
ConnectString="Provider=Microsoft OLE DB Provider for Oracle;Data Source=bd_skw;User ID=guest_armits;Password=armits;"



только проверь свой TNS на своей машине в файле tnsnames.ora :!:
я подставил тебе bd_skw (он может отличаться)

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Сообщение KPEATOP » 16.06.2005 (Чт) 14:58

с какими параметрами нужно сделать
Set gwsMainWS = CreateWorkspace("", "admin", "", dbUseODBC)
Set db = gwsMainWS.OpenDatabase("", False, False, sConnect)

чтоб база была открыта для записи ?
А то у меня постоянно пишет "База данных открыта только для чтения"
Вечность пахнет нефтью

След.

Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList