InfinityJoe Ответов: 2

Помогите! , Vb OLEDB вставить запись с табличными отношениями!


Надеюсь, кто-нибудь сможет мне помочь....

так просто , у меня есть 2 таблицы в базе данных access, и я хочу вставить новую запись в DBChild C_Name & C_Code через мой VB.Чистый проект. >_<

DBParent
P_ID = PK (автономер)
P_Name = строка
P_Info = строка

DBChild
P_ID = отношение / отражение от P_ID DBParent (так что этот автономер тоже как-то)
Основные достижения и итоговые документы ПК (счетчик)
C_Name = строка
C_Code = строка


*Информация о связях таблиц (P_ID)
- Тип : Один Ко Многим
- Проверено : Обеспечение Ссылочной Целостности
- Проверено : Каскадное Обновление Связанных Полей
*Примечание: в режиме просмотра DBParent он имеет выпадающий/складной DBChild, и я могу легко редактировать и добавлять новую запись непосредственно оттуда через базу данных Access

*Как он выглядит в базе данных Access (у каждого родительского элемента есть свой собственный дочерний элемент, и он складывается)
[-] P_ID | P_Name | P_Info 
    6    | PName6 | PInfo6
----------------------------
    C_ID | C_Name | C_Code
    5    | Child1 | Code1
    7    | Child2 | Code2
    8    |????? <- Add new row inside this P_ID /C_ID to fill C_Name & C_Code via VB?
----------------------------
[+] 7    | PName7 | PInfo7
----------------------------



*Что я предпочитаю:
- держите DBChild - основные достижения и итоговые документы к ПК (счетчик) - мне очень нужен этот на мой проект)
- Keep P_ID = Relation / Reflection From P_ID of DBParent - еще одна важная вещь
- Использование условного "где", поскольку мой проект нуждается в этом, чтобы сравнить значение с UniqeID, о котором я упоминал ниже.
- Господи, помоги мне найти ответ, или хотя бы Чака Норриса...

Что я уже пробовал:

Я уже пробовал это сделать
Try
dim UniqeID = 6 'Let's say this number as uniqe for now
DB.OpenConnection() 'Open Connection
DB.SQLQuery = "INSERT INTO DBChild (C_Name,C_Code) VALUES (@Name,@Code) " & 
              "SELECT * FROM DBParent WHERE P_ID = " & UniqeID & ";"
DB.Command = New OleDbCommand(DB.SQLQuery, DB.Connection)
With DB.Command
    .Parameters.AddWithValue("@Name", Txt_Snippet_Title.Text)
    .Parameters.AddWithValue("@Code", Txt_Editor_Tag.Text)
    .ExecuteNonQuery()
End With

MsgBox("Record Saved!.", MsgBoxStyle.Information) 'Never Reach this Line...
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Error " & GetCurrentMethod().Name & " !")
DB.CloseConnection()
Finally
DB.CloseConnection()
End Try



Но Ошибка Говорят : Отсутствует точка с запятой (;) в конце инструкции SQL
и когда я пытаюсь отредактировать/изменить непосредственно DBChild (как C_Name, так и C_Code) через VB, то ошибка говорит :
"Вы не можете добавить или изменить запись, потому что связанная запись требуется в таблице DBParent"


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

Заранее спасибо.
Дж

2 Ответов

Рейтинг:
11

InfinityJoe

Ладно, наконец-то я сам это понял!!, как я и думал раньше, эта проблема должна быть решена простым способом каким-то образом :)

Для тех, кто ищет те же ответы, вот мои рабочие решения

Try
dim UniqeID = 6 'Let's say this number as uniqe for now
DB.OpenConnection() 'Open Connection
DB.SQLQuery = "INSERT INTO DBChild (P_ID, C_Name, C_Code) VALUES (@PID, @Name, @Code)" 
DB.Command = New OleDbCommand(DB.SQLQuery, DB.Connection)
With DB.Command
    .Parameters.AddWithValue("@PID", UniqeID) 'This is The Key!
    .Parameters.AddWithValue("@Name", Txt_Snippet_Title.Text)
    .Parameters.AddWithValue("@Code", Txt_Editor_Tag.Text)
    .ExecuteNonQuery()
End With

MsgBox("Record Saved!.", MsgBoxStyle.Information) 'Finally! :)
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Error " & GetCurrentMethod().Name & " !")
DB.CloseConnection()
Finally
DB.CloseConnection()
End Try


Итак, просто убедитесь, что значение "P_ID" существует в DBParent при добавлении новой записи в DBChild, и да, просто используя "INSERT INTO", только мы можем обернуть это, вот и все!

Спасибо до этого Мацей Лос ибо скрасит мой путь и CPallini за то, что указал путь! \ м /

Овации,
Дж


Maciej Los

Супер, ты сам все решил! Мои 5 тебе!
Если мой ответ был полезен в поиске окончательного решения, вы тоже можете принять его.

Рейтинг:
0

Maciej Los

Взгляните на свой запрос:

"INSERT INTO DBChild (C_Name,C_Code) VALUES (@Name,@Code) " & 
"SELECT * FROM DBParent WHERE P_ID = " & UniqeID & ";"


Вы действительно объединили 2 запроса в один. Ты не можешь этого сделать , потому что ... .ExecuteNonQuery() принимает только INSERT | UPDATE | DELETE заявления.
Вы должны использовать INSERT в одном заявлении и SELECT в другой (ExecuteReader).
Видеть: Как создать и выполнить инструкцию SQL, возвращающую строки[^]

Кстати: никогда не используйте конкатенацию строк в качестве запроса!
"SELECT * FROM DBParent WHERE P_ID = " & UniqeID & ";

Это самая главная причина того, что SQL-инъекция[^]!


InfinityJoe

Thanks for your valuable Response Mate, that's really brighteen my way :), yes i thought that about concatenate 2 queries into one on this case (and thanks for confirm that it's impossible with direct join of query), but i really needs to make this works as for some reason i needs this engine for my projects most >_<, so would be perfect if you give some quick example for the Query that should i use for make that happen ? (i have checked the link you gave to me but still can't figure it out), i mean just insert new Row to DBChild with new record of C_Name & C_Code in exact location of P_ID after comparing that via VB/oledb form, or another mean to reach "MsgBox("Record Saved!.", MsgBoxStyle.Information) " Line ,and yes will use proper parameters to avoid SQL Injection later on :) , God Bless you man...

InfinityJoe

о немного воображения, что то, что я ищу (это образец того, как это выглядит в доступе):

[-] P_ID | P_Name | P_Info (складной)
6 | PName6 | PInfo6
----------------------------
Основные достижения и итоговые документы | C_Name | C_Code
5 | Child1 | Code1
7 | Child2 | Code2
8 |????? <- добавьте новую строку в этот P_ID/C_ID, чтобы заполнить C_Name & C_Code
----------------------------
[+] 7 | PName7 | PInfo7
----------------------------

CPallini

5.

InfinityJoe

Здравствуйте, сэр, спасибо за указание, если вы не возражаете, может быть, вы можете бросить магию для этого в примере кода/запроса ? мне действительно нужно закончить свой проект как можно скорее, но я все еще не могу понять его :)

заранее спасибо,
Дж

Maciej Los

Спасибо, Карло.