• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

База данных и Vb

  • Автор темы Alex77777
  • Дата начала
A

Alex77777

Всем доброе утро!!!

Тема такая: есть прога из нее данные вставляются в БД ACCESS.
При создании любой таблицы в БД ACCESS автоматом создается доп.поле "код_ID"
На форме есть текстбокс1, текстбокс2 и клавиша сохранить. Мне нужно чтобы при нажатии клавиши "сохранить" данные из текстбокса1 вставлялись БД (это я знаю как делать), и в это же время нужно чтобы в текстбокс2 вставиласть цифра, которая стоит в поле "код_ID" БД.
Вопрос 1: как это сделать?
Вопрос 2: как потом, если данные в текстбоксе1 я поменял, сделать при нажатии клавиши "сохранить", чтобы данные из текстбокс1 снова вставились в уже существующей строке той же таблицы БД ACCESS с номером ID, который вставился в текстбокс2.

как я понимаю при вставке данных в БД он вставляет их в последнюю строку и ей автоматом присваиваеся ID.то есть схема кода при нажатии "сохранить" получается такой:

начало
проверяем
если в текстбоксе нет цифры то
просто сохраняем инфу в БД
иначе
находим в БД строку с такой же цифрой и вставляем в нее данные
конец
 
O

Over

Для Alex77777: Так а в чём проблема? Ты ведь и сам знаешь, как всё делать. Алгоритм ты написал правильно. Тебе подсказать команды SQL? Вот, на всякий случай, если вдруг не знаешь: SELECT - для выборки данных, INSERT - для вставки новых данных, UPDATE - для изменения данных в БД. При этом твой алгоритм уточнится до такого:
Код:
начало
проверяем 
если в текстбоксе нет цифры то
просто сохраняем инфу в БД
{ INSERT INTO...... //Вставка данных
//А теперь нужно получить ID, для этого сделаем SELECT
SELECT ID FROM ..... WHERE .......
//После этого выбранный ID присваиваем в переменную и её значение засовываем в TextBox2
}
иначе
находим в БД строку с такой же цифрой...
{
SELECT ... FROM <TableName> WHERE Цифра = введённой
}
... и вставляем в нее данные
{
UPDATE <TableName>
SET <имя_поля> = ....
WHERE условия отбора записи
}
конец
Естественно, в программе тебе нужно будет работать через ADO, и запросы формировать в виде строки, а потом вызывать метод Query.Execute (или Query.Open для запроса SELECT).
 
S

skysun

Код:
 If ldb.rsResearch.State = 1 Then ldb.rscmdTmp.Close
ldb.rsResearch.Open SQLStr, , , adLockOptimistic, adCmdText
If (ldb.rsResearch.EOF = True) And (ldb.rsResearch.BOF = True) Then
ldb.rsResearch.AddNew

ldb.rsResearch![FieldName] = anyValue

Else
ldb.rsResearch![FieldName] = anyValue
ldb.rsResearch.Update
End If
 
A

Alex77777

для sax_ol

Цитата(Alex77777 @ 14:11:2007, 08:08 )

попробуй в Access'e сделать БД в режиме ввода дынных, и самый последний столбец и будет "_ID" (он просто скрыт, возьми кусором и растащи его

можно взглянуть?

Гляди не жалко!!!
Код:
Private Sub Command1_Click()
Dim db As New adodb.Connection

Dim d As String
Dim s  As String
d = txtText.Text
s = txtText1.Text

Set db = New adodb.Connection

With db
.Provider = "Microsoft.Jet.OLEDB.3.51"
.Open "Data Source=C:\БД.mdb;"
.Execute _
"insert into имя_таблицы (поле1,поле2) values (' " & d & " ',' " & s & " ')"
End With
db.Close
End Sub

для Over

После этого выбранный ID присваиваем в переменную и её значение засовываем в TextBox2

ссори не совсем правильно поставил вопрос:
вопрос собственно и заключался в том, как результат запроса присвоить переменной из SQL-запроса (как вставить переменную в него я знаю).

пробовал через рекордсеты не получается

Код:
 set rs.OpenRecordset ("SELECT ID FROM имя_табл WHERE поле1 = ' " & d & " ' ")
тексбокс2.AddItem rs.Fields ("d")

так комп ругается: Арнгументы имеют неверный тип, выходят за пределы допустимого диапазона или всл=тупают в конфликт друг с другом.
и подчеркивает строку set rs.OpenRecordset ("SELECT ..........
 
O

Over

А есть ещё такой объект QueryDef. У него свойство SQL - строка SQL-запроса. Есть ещё у него метод OpenRecordset, который выполняет запрос и возвращает объект результирующий Recordset. К полям рекордсета можно доступиться через свойство Fields.
В итоге:
1. Создать объект QueryDef
2. Присвоить свойству .SQL строку SQL-запроса
3. Вызвать метод .OpenRecordset с присвоением результата новосозданному объекту типа RecordSet
4. Обратиться к свойству .Fields(индекс поля) объекта Recordset получив таким образом нужное нам значение, и присвоить его в переменную
5. Установить значение ТекстБокса2 = значению переменной
6. Закрыть рекордсет (метод Close)
7. Закрыть QueryDef

P.S. Проверь правильность синтаксиса SQL-запроса. Сначала напиши его вручную, в блокноте или др., подставь туда реальные значения, и попробуй выполнить его в аксессе. Если всё будет ок, тогда заменяй значения на переменные и вставляй в прогу.
 
N

Normann

Тебе все еще нужна помощь по ADO?
 
A

Alex77777

всем привет!
не было времени на форум взглянуть.
да с данным вопросом я еще не полностью разобрался(только еще пытаюсь освоить VB & Access):

вопрос1 что такое "объект QueryDef", можно о нем поподробнее.
вопрос2 как проверить работу запроса в саом аксессе.
 
N

Normann

На счет QuerryDef я ничего не знаю, это не из ADO, а вот про аксес расскажу. Открываешь базу, в разделе "Объекты" (меню-колонка слева) открываешь "Запросы", создаешь запрос в режиме конструктора, если умеешь то ресуешь его руками, если тебе это не нужно то тогда просто находишь на панели кнопку под названием "Вид" (она имеет вид миниатюрной таблицы (грид)), жмешь на стрелку и выбираешь в выпавшем меню "Режим SQL" и окно конструктора твоего запроса превращается в текстовый редактор для SQL запроса, отражающий наделанное тобой в конструкторе, редактируешь это дело или вставляешь и лучше с начала перейти обратно в режим конструктора, чтобы посмотреть что Аксес скажет, потом таким же методом переходишь в "Режим таблицы" и она тебе покажет что-то похожее на результат работы запроса, т.е. выбранные данные или те которые должны будут удалиться согласно запросу или обновиться или еще чтото. Если не заругался то изучай его "правильность на свой взгляд". Там же можно и выполнить этот запрос по настоящему - на той же панели есть кнопка в виде восклицательного знака, называется "Выполнить". Надеюсь я нормально объяснил.
 
O

Over

Про объект QueryDef можно прочитать в справке по VBA. Заходишь в редактор VBA в экселе или аксессе - не важно, нажимаешь F1, вылазит справка, делаешь поиск по названию QueryDef. Должно выдать строку QueryDef Object (DAO). Кликаешь на неё - вылазит справка. Читаешь, вникаешь.
 
A

Alex77777

для Normann спасибо за подсказку по аксесу, теперь комп вроде не ругается при выполнении запроса

для Over смотрел справку, создалось такое впечасление что QueryDef и рекордсет практически одно и тоже.


в итогеполучилось вот такой код:
Код:
Dim db As New adodb.Connection

Dim d As String
Dim s  As String
Dim ID  As String
d = txtText.Text
s = txtText1.Text
ID=txtID.Text
Set db = New adodb.Connection
With db
.Provider = "Microsoft.Jet.OLEDB.3.51"
.Open "Data Source=C:\БД.mdb;"
.Execute _
"insert into имя_таблицы (поле1,поле2) values (' " & d & " ',' " & s & " ')"

.Execute _
"SELECT имя_табл.ID FROM имя_табл WHERE (((имя_табл.поле1) = ' " & d & " ' ))"
ID = имя_табл.ID 
txtID.Text=ID
End with

пишет: ошибка 424, требуемый объект.
и подчеркивает строку "ID = имя_табл.ID"

получаается только одна загвоздка как итог запроса из поля "имя_табл.ID" присвоить переменной.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!