Страница: 1 | 2 |
|
Вопрос: Нужна помощь по ADO.NET
|
Добавлено: 26.06.09 13:56
|
|
Автор вопроса: avers_inc
|
Задача следующая: есть база данных (допустим mdb) с n-ным количеством таблиц.
Имеется форма на ней объекты: DataGridView и набор и n-ного количества переключателей (RadioButton) (кол-во переключателей соответствует количеству таблиц). Все остальные объекты, также как и связи с базой должны создаваться в коде.
Теперь мне нужно отображать в DataGridView таблицу, соответствующую выбраннному переключателю. И чтоб изменения сделанные в DataGridView (добавление, изменение, удаление) сразу вносились в БД.
Я так понимаю, что нужно создать DataSet и просто считать в него всю БД, а потом просто наполнять DataGridView данными соответствующей таблицы в DataSet. Только передать всю БД в DataSet и сделать так, чтоб сделанные изменения вносились в БД у меня не получается.
Может кто-нибудь помочь с примером кода для загрузки формы и данных, а также при выборе переключателя.
З.Ы.
Что-то совсем я запутался с этим ADO.NET... как-то тут все через...
Ответить
|
Номер ответа: 2 Автор ответа: avers_inc
Вопросов: 7 Ответов: 19
|
Профиль | | #2
|
Добавлено: 30.06.09 14:02
|
Aston пишет:
Первый вопрос как ты заполняешь датасет
Извините за глупый вопрос: просто я только начинаю разбираться с ADO.NET, а как еще можно его заполнить?
1. в этом коде SqlDataAdapter1 и DataSet1 должны быть созданы заранее?
2. а что дает это свойство "Menu": DataSet1.Menu?
Ответить
|
Номер ответа: 4 Автор ответа: avers_inc
Вопросов: 7 Ответов: 19
|
Профиль | | #4
|
Добавлено: 01.07.09 12:33
|
а можно какой-нибудь пример как он это все генерирует.
у меня задача такая: на форме будет список с названиями всех таблиц в БД, ДатаГридВью, который должен отображать таблицу,выбранную в списке, а также в нем можно было бы добавлять, редактировать и удалять записи (не в базе, а только в ДатаГридВью). а также кнопки: "OK", которая закрывает форму и производит все изменения в базе, которые были произведены в датагридвью, и "Отмена", которая закрывает форму, но без изменений в базе. А также хотелось бы все эти объекты: датаадаптер и датасет чтоб создавались из кода. тут мне нужно несколько примеров: 1. как при загрузке формы заполнить список именами всех таблиц в указанной БД, 2. пример кода для кнопки ОК.
Ответить
|
Номер ответа: 8 Автор ответа: Aston
ICQ: 214-179-991
Вопросов: 42 Ответов: 272
|
Профиль | | #8
|
Добавлено: 02.07.09 11:32
|
Смысл объявлять cn, da и ds в том чтобы ты потом мог обратиться к дата адаптеру и обработать нажатие кнопки клик, если объявить их только внутри процедуры то по завершению процедуры они уничтожаются - почитай про область видимости переменной если не знал. Я планировал сразу сделать весь пример с обработкой кнопок, но для этого надо дописывать обработку удаления, обновления и добавления для каждой таблицы а это парево - поэтому я тебе и советовал создать дата адаптер не в коде - там он всё с генерирует сам.
На счёт внесения в комбобокс имён таблиц - я не знаю такого СКЛ запроса, который выводил бы все имена таблицы и есть ли он вообще такой, да и нужды такой никогда не возникало. Если это не чужая база и ты добавляешь таблицы динамически то советую создать таблицу, которая будет содержать названия всех таблиц - я давно как то так делал.
На счёт кнопки ОК - создай датаадаптер не в коде а в визуальном режиме и подключи его к одной таблице, поставь в датагридвьюв, а в кнопке ок напиши SqlDataAdapter1.Update() и всё у тебя сработает.
В коде это добавлять скл код для удаления обновления и добавления для каждой таблицы, задавать параметры - это куча кода - по крайней мере с моими таблицами.
На счёт открытия и закрытия CN датаадаптер это сам не делает. Я читал что соединение можно открыть и оставить а вижуал студио сам определит когда его закрыть и открыть и по этому поводу не надо парится, но я привык явно закрывать и открывать соединение.
Ответить
|
Номер ответа: 9 Автор ответа: avers_inc
Вопросов: 7 Ответов: 19
|
Профиль | | #9
|
Добавлено: 02.07.09 13:53
|
Смысл объявлять cn, da и ds в том чтобы ты потом мог обратиться к дата адаптеру и обработать нажатие кнопки клик, если объявить их только внутри процедуры то по завершению процедуры они уничтожаются
я имел в виду, что именно в этом коде к ним все равно обращение идет только из одной процедуры...
Если это не чужая база и ты добавляешь таблицы динамически то советую создать таблицу, которая будет содержать названия всех таблиц - я давно как то так делал
Вообще-то в том то и дело, что хотелось бы подключить любую базу, в том числе и чужие. а про таблицу с названиями таблиц - это неплохая идея
В коде это добавлять скл код для удаления обновления и добавления для каждой таблицы, задавать параметры - это куча кода - по крайней мере с моими таблицами.
вот именно этот пример мне и нужен: во-первых в каком месте добавлять эти скл кода: на событие нажатия кнопки или при подключении? во-вторых сам пример кода хотя бы для какой-нибудь простой таблицы...
Ответить
|
Номер ответа: 10 Автор ответа: Aston
ICQ: 214-179-991
Вопросов: 42 Ответов: 272
|
Профиль | | #10
|
Добавлено: 03.07.09 13:11
|
Я переписал чуть код с дата адаптером чё то не вышло так как хотелось, чтоб с генерировать так как в визуальном режиме - чё то не хватает ему, а вот с коммандом получилось.
- Imports System.Data.SqlClient
- Public Class Form1
- Dim DA As SqlDataAdapter
- Dim CN As New SqlConnection
- Dim DS As New DataSet
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- CN.ConnectionString = "Data Source=aston-a02060210;Initial Catalog=popo;Integrated Security=True"
- With ComboBox1.Items
- .Add("Menu")
- End With
- ComboBox1.Text = ComboBox1.Items(0).ToString
- ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
- Baza(ComboBox1.Text)
- End Sub
- Private Sub Baza(ByVal str As String)
- CN.Open()
- DA = New SqlDataAdapter("Select * From Menu", CN)
- DS.Tables.Clear()
- DA.Fill(DS, str)
- DA.TableMappings.Add("Menu", DS.Tables(0).TableName)
- CN.Close()
- DataGridView1.DataSource = DS.Tables(0)
- End Sub
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- Dim row As DataRow
- For Each row In DS.Tables(0).Rows
- If row.RowState = DataRowState.Modified Then
- Dim dr As New SqlCommand
- dr.CommandText = "MenuUpdate"
- dr.CommandType = CommandType.StoredProcedure
-
- dr.Parameters.Add(New SqlParameter("@menu_id", CType(row.Item(0), Integer)))
- dr.Parameters.Add(New SqlParameter("@menu_type", CType(row.Item(1), String)))
- dr.Parameters.Add(New SqlParameter("@menu_cost", row.Item(2)))
- dr.Parameters.Add(New SqlParameter("@menu_tax", row.Item(3)))
- dr.Parameters.Add(New SqlParameter("@Original_menu_id", row.Item(0)))
- dr.Connection = CN
- CN.Open()
- dr.ExecuteNonQuery()
- CN.Close()
- End If
- Next
- CN.Close()
- End Sub
- End Class
Только ты должен понимать что я описал только обновление, удаление и добавление нужно отдельно описывать.
С датаадаптером думаю можно реализовать как то обновление удаление и добавление - всё добавил СКЛ запросы и параметры - но ещё надо чтоб в эти параметры вносил данные - я чё то не нашёл как а вот задавать их вручную это проще .
Ещё один вариант использовать LinQ с ним может даже и проще было бы.
Ответить
|
Номер ответа: 11 Автор ответа: Aston
ICQ: 214-179-991
Вопросов: 42 Ответов: 272
|
Профиль | | #11
|
Добавлено: 03.07.09 23:48
|
Я решил твою задачку даже самому было слегка интересно но по махался я норм конечно, я использовал скл запросы но желательнее использовать процедуры страховка не помешает, но тут уже всё понятно, думаю если надо будет то и процедуры используешь - как ими пользоваться я показал выше.
Даже немного к мсдн пришлосьприбегнуть.
- Imports System.Data.SqlClient
- Public Class Form1
- Dim DA As SqlDataAdapter
- Dim CN As New SqlConnection
- Dim DS As New DataSet
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- CN.ConnectionString = "Data Source=Komp;Initial Catalog=popo;Integrated Security=True"
- With ComboBox1.Items
- .Add("Menu")
- End With
- ComboBox1.Text = ComboBox1.Items(0).ToString
- ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
- Baza(ComboBox1.Text)
- End Sub
- Private Sub Baza(ByVal str As String)
- CN.Open()
- DA = New SqlDataAdapter
- DA = CreateCustomerAdapter(CN)
- DS.Tables.Clear()
- DA.Fill(DS, str)
- DA.TableMappings.Add("Menu", DS.Tables(0).TableName)
- CN.Close()
- DataGridView1.DataSource = DS.Tables(0)
- End Sub
- Public Function CreateCustomerAdapter( _
- ByVal connection As SqlConnection) As SqlDataAdapter
-
- Dim adapter As SqlDataAdapter = New SqlDataAdapter()
-
-
- Dim command As SqlCommand = New SqlCommand("SELECT * FROM Menu", connection)
-
- adapter.SelectCommand = command
-
-
- command = New SqlCommand("INSERT INTO [Menu] ([menu_type], [menu_cost], [menu_tax]) VALUES (@menu_type, @menu_cost, @menu_tax)", connection)
- Dim parm As New SqlParameter
- parm.ParameterName = "@menu_type"
- parm.Direction = ParameterDirection.Input
- parm.SqlDbType = SqlDbType.Char
- parm.SourceColumn = "menu_type"
- parm.SourceVersion = DataRowVersion.Current
- command.Parameters.Add(parm)
- parm = New SqlParameter
- parm.ParameterName = "@menu_cost"
- parm.Direction = ParameterDirection.Input
- parm.SqlDbType = SqlDbType.Money
- parm.SourceColumn = "menu_cost"
- parm.SourceVersion = DataRowVersion.Current
- command.Parameters.Add(parm)
- parm = New SqlParameter
- parm.ParameterName = "@menu_tax"
- parm.Direction = ParameterDirection.Input
- parm.SqlDbType = SqlDbType.Money
- parm.SourceColumn = "menu_tax"
- parm.SourceVersion = DataRowVersion.Current
- command.Parameters.Add(parm)
- adapter.InsertCommand = command
-
-
- command = New SqlCommand("UPDATE Menu SET menu_type = @menu_type, menu_cost = @menu_cost, menu_tax = @menu_tax WHERE (menu_id = @Original_menu_id)", connection)
-
-
- parm = New SqlParameter
- parm.ParameterName = "@menu_type"
- parm.Direction = ParameterDirection.Input
- parm.SqlDbType = SqlDbType.Char
- parm.SourceColumn = "menu_type"
- parm.SourceVersion = DataRowVersion.Current
- command.Parameters.Add(parm)
- parm = New SqlParameter
- parm.ParameterName = "@menu_cost"
- parm.Direction = ParameterDirection.Input
- parm.SqlDbType = SqlDbType.Money
- parm.SourceColumn = "menu_cost"
- parm.SourceVersion = DataRowVersion.Current
- command.Parameters.Add(parm)
- parm = New SqlParameter
- parm.ParameterName = "@menu_tax"
- parm.Direction = ParameterDirection.Input
- parm.SqlDbType = SqlDbType.Money
- parm.SourceColumn = "menu_tax"
- parm.SourceVersion = DataRowVersion.Current
- command.Parameters.Add(parm)
- parm = New SqlParameter
- parm.ParameterName = "@Original_menu_id"
- parm.Direction = ParameterDirection.Input
- parm.SqlDbType = SqlDbType.Int
- parm.SourceColumn = "menu_id"
- parm.SourceVersion = DataRowVersion.Original
- command.Parameters.Add(parm)
- parm = New SqlParameter
- parm.ParameterName = "@menu_id"
- parm.Direction = ParameterDirection.Input
- parm.SqlDbType = SqlDbType.Int
- parm.SourceColumn = "menu_id"
- parm.SourceVersion = DataRowVersion.Current
- command.Parameters.Add(parm)
- adapter.UpdateCommand = command
-
-
- command = New SqlCommand("DELETE FROM Menu WHERE (menu_id = @Original_menu_id)", connection)
-
-
- parm = New SqlParameter
- parm.ParameterName = "@Original_menu_id"
- parm.SqlDbType = SqlDbType.Int
- parm.Direction = ParameterDirection.Input
- parm.SourceColumn = "menu_id"
- parm.SourceVersion = DataRowVersion.Original
- command.Parameters.Add(parm)
- adapter.DeleteCommand = command
- Return adapter
- End Function
-
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- CN.Open()
- DA.Update(DS.Tables(0))
- CN.Close()
- Me.Close()
- End Sub
-
- Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
- Me.Close()
- End Sub
- End Class
Ответить
|
Страница: 1 | 2 |
Поиск по форуму