Страница: 1 |
Страница: 1 |
Вопрос: Добавление записи в БД
Добавлено: 19.04.07 23:13
Автор вопроса: danchik | ICQ: 293234469
Салют, всем!!!
Народ, помоги, больше нету сил и мозгов...
У меня форма с датагридом и кнопками "загрузить" и "обновить".
Так вот "обновить" у меня не работает....
1.Я при Form_Load создаю (не в конструкторе а в коде) вместо датасета дататэйбл со солбцами "код" и "название"....
Потом грид связываю с дата тейбл: DataGrid.DataSource=DataTable.
2.Но когда я пишу процедуру для кнопки "загрузить" Sub Loadbutton_Click:
DataTable.Clear()
adapter.fill(DataTable),
выдает ошибку, что DataTable не объявлена, приходится и в Sub Loadbutton_Click писать все что в пункте 1, начиная с объявления DataTable и заканчивая заполнением датагрида DataTable.
3.То же самое с кнопкой "обновить", но если "загрузить" как-то работает после объявления DataTable, то тут дальше загрузки не идет.
Тут я все переписываю из пунктов 1 и 2 и добавляю команду с параметрами, у которых в качестве параметров объявляю значения колумов DataTable , т.е. "код" и "название"....
Когда запускаешь форму, при нажатии кнопки Load ДатаГрид заполняется таблицей из БД....Далее ввожу запись в Грид и нажимаю кнопку Update, но увы, все что вводилось все исчезает, а данные так и остаются не тронутыми
Кто-нибудь может объяснить в чем дело?
Поделитесь, пожалуйста, как Вы вообще добавляете данные в БД?
Народ помогите, пожалуйста, а?
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #1
Добавлено: 24.04.07 18:40
напиши в сторонке кусок рабочего кода и напиши его сюда, а то так на пальцах объясняешь - непонятно.
МЫ добавляем данные в БД по всякому. Если адаптеры юзать, то всё сводится к такому:
1. объявляем на уровне формы таблицу (DataTable).
2. рядом с ней BindingSource (мне удобнее).
3. пишем процедурку Revert в которой заполняем таблицу adap.Fill(YourTable), привязываем YourSource к YourTable, а YourDataGrid к YourSource.
4. пишем процедурку Apply(), в которой делаем adap.Update(YourTable).
5. В Form_Load вызываем Revert().
6. редактируем данные ручками.
7. в кнопке "сохранить" вызываем Apply().
8. в кнопке "вернуть" вызываем Revert().
Всё.
Ест-но, адаптер должен быть с командами. Сурсы использовать непринципиально.
Номер ответа: 2
Автор ответа:
s12
Вопросов: 24
Ответов: 363
Профиль | | #2
Добавлено: 25.04.07 14:17
А по мне так будет проще всего
Dim conn As New OleDbConnection()
 im da As New OleDbDataAdapter()
 im ds As New DataSet()
 im db As New OleDbCommandBuilder(da)
dim dg1 as New DataGrid()
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
conn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "ataSource=funtik.mdb"
conn.Open()
da.SelectCommand() = New OleDbCommand("select mytable.* from mytable;", conn)
da.Fill(ds, "table"
dg1.DataSource() = ds
End Sub
Private Sub Update_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Update.Click
ds = dg1.DataSource
da.Update(ds, "table"
End Sub
мерси за внимание.
Номер ответа: 3
Автор ответа:
danchik
ICQ: 293234469
Вопросов: 1
Ответов: 4
Профиль | | #3
Добавлено: 25.04.07 15:30
Спасибо.
Вот только теперь я задачу усложнила...
в Датагриде данные из двух таблиц, связанных между собою ключем...
Пользователь вводит значение, а программка должна эти значения распределять по двум таблицам, причем если вводимые данные не существуют в таблицах...
Написала процедуру, но опять же не понятно почему не работает...Имеются
Таб.City(cityID,city_name) и
таб.Rrgion(regID,reg_num,cityID
Пользователем вводятся значения "city_name" и "reg_num" в VisualBasic.
CREATE PROCEDURE insertglobal
@cityID INT,
@city_name VARCHAR,--значение из параметризованной комманды в BV.NET
@regID INT,
@reg_num INT --значение из параметризованной комманды в BV.NET
AS
BEGIN
if exists(select cityID from City where city_name=@city_name)
BEGIN
set @cityID=cityID
if exists(select regID from Region where reg_num=@reg_num)
set @regID=regID
else insert into Region values(@regID,@reg_num,@cityID)
END
else
BEGIN
select MAX(cityID)as Mcity from City
SET @cityID=Mcity+100
select MAX(regID)as Mreg from Region
SET @regID=Mreg+1
insert into City values(@cityID,@city_name)
insert into Region values(@regID,@reg_num,@cityID)
END
END
GO
Буду очень признательна за помощь...
Номер ответа: 4
Автор ответа:
danchik
ICQ: 293234469
Вопросов: 1
Ответов: 4
Профиль | | #4
Добавлено: 25.04.07 15:30
S12,Да, вроде не сложно, и самое главное ,в чем и была моя ошибка, все адаптеры и тому подобные объявляешь в самом начале , т.е. до процедур...
Моя грубейшая ошибка - объявляла в самой процедуре...
Спасибо.
Вот только теперь я задачу усложнила...
в Датагриде данные из двух таблиц, связанных между собою ключем...
Пользователь вводит значение, а программка должна эти значения распределять по двум таблицам, причем если вводимые данные не существуют в таблицах...
Написала процедуру, но опять же не понятно почему не работает...
Номер ответа: 5
Автор ответа:
s12
Вопросов: 24
Ответов: 363
Профиль | | #5
Добавлено: 26.04.07 09:45
Ну ошибки это не беда, ошибаемся все мы.
А я еще и не по разу в день.
По теме:
А саму процедуру на vb.net написать слабо?
Иль ты всю прогу на си делаешь? Если так дык нафиг тебе барсик?
И еще а не жирно ли юзеру доступ к базе через грид давать?
Ну если всетаки очень надо могу набросать примерное решение через датасет.
PS bv.net--а че ето за изык такой???
Номер ответа: 6
Автор ответа:
danchik
ICQ: 293234469
Вопросов: 1
Ответов: 4
Профиль | | #6
Добавлено: 26.04.07 10:50
S12, привет!
пардон, BV.NET это и есть вижуалбэйсик.нет, торопилась
А юзер будет всего лишь вводить данные, но никак не модифицировать...
А на счет процедуры, то мне кажется(по крайней мере как нас учили) если она будет выполняться на сервере плюсов больше будет, хотя могу и ошибаться
Вот ты пишешь просто :
ds = dg1.DataSource
da.Update(ds, "table"
что если в грид вводятся название города и номер района, которые нужно записать в две твблицы БД?
название города в таблицу городов, номер района в таблицу районов причем сюда же нужно будет записать и код города(через этот код связаны две таблицы), как тогда можно использовать Update(ds)?
Номер ответа: 7
Автор ответа:
s12
Вопросов: 24
Ответов: 363
Профиль | | #7
Добавлено: 27.04.07 14:36
Здравы будем, бояре!
Если все так просто, то лично я бы гридом пользоваться не стал. Три текстовых поля
-ID
-TOWN
-REGION
и с юзверя хватит.
Пример
<a href='http://vbnet.ru/forum/show.aspx?id=136515'>здесь</a>
Там каждая строчка прокоментирована, для твоей задачи там только запрос поменять, и можно сразу в код вгонять.
Номер ответа: 8
Автор ответа:
s12
Вопросов: 24
Ответов: 363
Профиль | | #8
Добавлено: 27.04.07 14:38
тьфу, форум хтмл в сообщениях не тянет ссылка вот:
http://vbnet.ru/forum/show.aspx?id=136515
Номер ответа: 9
Автор ответа:
danchik
ICQ: 293234469
Вопросов: 1
Ответов: 4
Профиль | | #9
Добавлено: 27.04.07 18:17
ему легко....
вместо <faking off> он просто указывает textbox...
а у меня ведь не textbox а целый датагрид...
т.е. там не одна запись...
может, счас конец рабочего дня и я нифига не соображаю, но мне тебя не дается понять...
вот так...
хотя очень хотелось бы...
скажи у меня наверное тяжелый случай и мне уже никак не помочь, нет?
Номер ответа: 10
Автор ответа:
s12
Вопросов: 24
Ответов: 363
Профиль | | #10
Добавлено: 28.04.07 13:38
дык я и говорю.
в смысле нафиг датагрид, ИМХО он был придуман для натурально лентяев...
я говорю текстовые поля юзать нада, кода будет конечно, побольше, он будет посложнее но:
во-первых лекче юзерские ошибки отслеживать
во-вторых удобнее работать с данными (ну это кому как нравится, я лично с ООП не очень)
в-третьих экономится место на форме, рама и ресурсы.
ну в общем вроде ясно мысль выразил.