Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 1 | 2 |

 

  Вопрос: Нужна помощь по ADO.NET Добавлено: 26.06.09 13:56  

Автор вопроса:  avers_inc
Задача следующая: есть база данных (допустим mdb) с n-ным количеством таблиц.
Имеется форма на ней объекты: DataGridView и набор и n-ного количества переключателей (RadioButton) (кол-во переключателей соответствует количеству таблиц). Все остальные объекты, также как и связи с базой должны создаваться в коде.
Теперь мне нужно отображать в DataGridView таблицу, соответствующую выбраннному переключателю. И чтоб изменения сделанные в DataGridView (добавление, изменение, удаление) сразу вносились в БД.
Я так понимаю, что нужно создать DataSet и просто считать в него всю БД, а потом просто наполнять DataGridView данными соответствующей таблицы в DataSet. Только передать всю БД в DataSet и сделать так, чтоб сделанные изменения вносились в БД у меня не получается.
Может кто-нибудь помочь с примером кода для загрузки формы и данных, а также при выборе переключателя.
З.Ы.
Что-то совсем я запутался с этим ADO.NET... как-то тут все через...
    

Ответить

  Ответы Всего ответов: 24  

Номер ответа: 1
Автор ответа:
 Aston



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #1 Добавлено: 26.06.09 22:33
Тут всё не через. Первый вопрос как ты заполняешь датасет, если ты используешь дата адаптер то после того как ты внёс изменения в датагридвиьв ты должен обновить и дата адаптер который поставлял эту таблицу.
  1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  2.         SqlDataAdapter1.Fill(DataSet1)
  3.         DataGridView1.DataSource = DataSet1.Menu
  4.     End Sub
  5.  
  6.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  7.         SqlDataAdapter1.Update(DataSet1)
  8.     End Sub

А если хочешь чтоб без кнопки то тебе надо производить обновление после того как была изменена та или иная ячейка, но если честно то тебе надо отлавливать ошибки а при такой структуре их будет немерено - несоответствие данных и тд.

Ответить

Номер ответа: 2
Автор ответа:
 avers_inc



Вопросов: 7
Ответов: 19
 Профиль | | #2 Добавлено: 30.06.09 14:02
Aston пишет:
Первый вопрос как ты заполняешь датасет

Извините за глупый вопрос: просто я только начинаю разбираться с ADO.NET, а как еще можно его заполнить?

1. в этом коде SqlDataAdapter1 и DataSet1 должны быть созданы заранее?
2. а что дает это свойство "Menu": DataSet1.Menu?

Ответить

Номер ответа: 3
Автор ответа:
 Aston



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #3 Добавлено: 01.07.09 01:28
Есть ещё дата риадер дата командер - это тоже входит в адо ток они менее гибкие чем дата адаптер - он более универсален.
Да дата адаптер создал визуально добави его в тулбокс если его у тебя нет на панели инструментов создаю подключение, запрос к таблице или таблицам - обновление и редактированиеи удаление он сгенерирует сам на основе этого дата адаптера создай датасет - щёлкни правой кнопкой на датаадаптере и выбери generate Dataset - дальше поймёшь. А меню это не свойство - это название таблицы - так как я создал подключение не в коде то название таблицы можно указать сразу и онапоявляется в списке свойств можно и по другому.
  1. DataGridView1.DataSource = DataSet1.Table(0)

Ответить

Номер ответа: 4
Автор ответа:
 avers_inc



Вопросов: 7
Ответов: 19
 Профиль | | #4 Добавлено: 01.07.09 12:33
а можно какой-нибудь пример как он это все генерирует.
у меня задача такая: на форме будет список с названиями всех таблиц в БД, ДатаГридВью, который должен отображать таблицу,выбранную в списке, а также в нем можно было бы добавлять, редактировать и удалять записи (не в базе, а только в ДатаГридВью). а также кнопки: "OK", которая закрывает форму и производит все изменения в базе, которые были произведены в датагридвью, и "Отмена", которая закрывает форму, но без изменений в базе. А также хотелось бы все эти объекты: датаадаптер и датасет чтоб создавались из кода. тут мне нужно несколько примеров: 1. как при загрузке формы заполнить список именами всех таблиц в указанной БД, 2. пример кода для кнопки ОК.

Ответить

Номер ответа: 5
Автор ответа:
 Aston



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #5 Добавлено: 01.07.09 23:32
Я сделал примерчик генерации тебе дата адаптера и датасета, но обновление здесь не катит так как он сгенерирован в коде, при создании его во время разработки он сам генерирует операции добавления удаления и изменения а так их тут надо добавлять вручную - а это парево.
  1. Imports System.Data.SqlClient
  2. Public Class Form1
  3.     Dim DA As SqlDataAdapter
  4.     Dim CN As New SqlConnection
  5.     Dim DS As New DataSet
  6.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  7.         CN.ConnectionString = "Data Source=Komp;Initial Catalog=WebBaza;Integrated Security=True" ' соединение с базой
  8.         With ComboBox1.Items
  9.             .Add("Menu") ' вношу в комбобокс название таблиц
  10.             .Add("Drinks")
  11.             .Add("Orders")
  12.         End With
  13.         ComboBox1.Text = ComboBox1.Items(0).ToString
  14.         ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
  15.         Baza(ComboBox1.Text)
  16.     End Sub
  17.     Private Sub Baza(ByVal str As String)
  18.         CN.Open()
  19.         DA = New SqlDataAdapter("Select * From " & str, CN)
  20.         DS.Tables.Clear()
  21.         DA.Fill(DS, str)
  22.         CN.Close()
  23.         DataGridView1.DataSource = DS.Tables(0)
  24.     End Sub
  25.     Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
  26.         Baza(ComboBox1.Text)
  27.     End Sub
  28. End Class

Ответить

Номер ответа: 6
Автор ответа:
 avers_inc



Вопросов: 7
Ответов: 19
 Профиль | | #6 Добавлено: 01.07.09 23:53
спасибо за пример. в общем-то я так и делаю... какой смысл в этом примере объявлять cn, da и ds не внутри процедуры?..
но у меня как раз вопрос в другом: 1. в этом примере в комбобокс вносятся имена таблиц в коде, а мне нужно чтоб они сами читались из базы, т.к. я не знаю, какие в базе будут таблицы.
2. мне нужен пример, для кнопки ОК (описывал выше) хотя бы для какой-то определенной таблицы, чтоб изменения сделанные в датагридвью (добавление, изменение, удаление) вносились в базу по нажатию этой кнопки.
Заранее спасибо. ОЧЕНЬ нужно!

Ответить

Номер ответа: 7
Автор ответа:
 avers_inc



Вопросов: 7
Ответов: 19
 Профиль | | #7 Добавлено: 01.07.09 23:56
кстати CN по-моему тут тоже открывать/закрывать необязательно,т.к. датаадаптер это по идее сам делает, или я не прав?

Ответить

Номер ответа: 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
Я переписал чуть код с дата адаптером чё то не вышло так как хотелось, чтоб с генерировать так как в визуальном режиме - чё то не хватает ему, а вот с коммандом получилось.
  1. Imports System.Data.SqlClient
  2. Public Class Form1
  3.     Dim DA As SqlDataAdapter
  4.     Dim CN As New SqlConnection
  5.     Dim DS As New DataSet
  6.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  7.         CN.ConnectionString = "Data Source=aston-a02060210;Initial Catalog=popo;Integrated Security=True"
  8.         With ComboBox1.Items
  9.             .Add("Menu") ' вношу в комбобокс название таблиц
  10.         End With
  11.         ComboBox1.Text = ComboBox1.Items(0).ToString
  12.         ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
  13.         Baza(ComboBox1.Text)
  14.     End Sub
  15.     Private Sub Baza(ByVal str As String)
  16.         CN.Open()
  17.         DA = New SqlDataAdapter("Select * From Menu", CN)
  18.         DS.Tables.Clear()
  19.         DA.Fill(DS, str)
  20.         DA.TableMappings.Add("Menu", DS.Tables(0).TableName)
  21.         CN.Close()
  22.         DataGridView1.DataSource = DS.Tables(0)
  23.     End Sub
  24. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  25.         Dim row As DataRow
  26.         For Each row In DS.Tables(0).Rows
  27.             If row.RowState = DataRowState.Modified Then
  28.                 Dim dr As New SqlCommand
  29.                 dr.CommandText = "MenuUpdate"
  30.                 dr.CommandType = CommandType.StoredProcedure
  31.  
  32.                 dr.Parameters.Add(New SqlParameter("@menu_id", CType(row.Item(0), Integer)))
  33.                 dr.Parameters.Add(New SqlParameter("@menu_type", CType(row.Item(1), String)))
  34.                 dr.Parameters.Add(New SqlParameter("@menu_cost", row.Item(2)))
  35.                 dr.Parameters.Add(New SqlParameter("@menu_tax", row.Item(3)))
  36.                 dr.Parameters.Add(New SqlParameter("@Original_menu_id", row.Item(0)))
  37.                 dr.Connection = CN
  38.                 CN.Open()
  39.                 dr.ExecuteNonQuery()
  40.                 CN.Close()
  41.             End If
  42.         Next
  43.         CN.Close()
  44.     End Sub
  45. End Class


Только ты должен понимать что я описал только обновление, удаление и добавление нужно отдельно описывать.
С датаадаптером думаю можно реализовать как то обновление удаление и добавление - всё добавил СКЛ запросы и параметры - но ещё надо чтоб в эти параметры вносил данные - я чё то не нашёл как а вот задавать их вручную это проще :).
Ещё один вариант использовать LinQ с ним может даже и проще было бы.

Ответить

Номер ответа: 11
Автор ответа:
 Aston



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #11 Добавлено: 03.07.09 23:48
Я решил твою задачку даже самому было слегка интересно но по махался я норм конечно, я использовал скл запросы но желательнее использовать процедуры :) страховка не помешает, но тут уже всё понятно, думаю если надо будет то и процедуры используешь - как ими пользоваться я показал выше.
Даже немного к мсдн пришлосьприбегнуть.
  1. Imports System.Data.SqlClient
  2. Public Class Form1
  3.     Dim DA As SqlDataAdapter
  4.     Dim CN As New SqlConnection
  5.     Dim DS As New DataSet
  6.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  7.         CN.ConnectionString = "Data Source=Komp;Initial Catalog=popo;Integrated Security=True"
  8.         With ComboBox1.Items
  9.             .Add("Menu") ' вношу в комбобокс название таблиц
  10.         End With
  11.         ComboBox1.Text = ComboBox1.Items(0).ToString
  12.         ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
  13.         Baza(ComboBox1.Text)
  14.     End Sub
  15.     Private Sub Baza(ByVal str As String)
  16.         CN.Open()
  17.         DA = New SqlDataAdapter
  18.         DA = CreateCustomerAdapter(CN)
  19.         DS.Tables.Clear()
  20.         DA.Fill(DS, str)
  21.         DA.TableMappings.Add("Menu", DS.Tables(0).TableName)
  22.         CN.Close()
  23.         DataGridView1.DataSource = DS.Tables(0)
  24.     End Sub
  25.     Public Function CreateCustomerAdapter( _
  26.   ByVal connection As SqlConnection) As SqlDataAdapter
  27.  
  28.         Dim adapter As SqlDataAdapter = New SqlDataAdapter()
  29.  
  30.         ' Create the SelectCommand.
  31.         Dim command As SqlCommand = New SqlCommand("SELECT * FROM Menu", connection)
  32.  
  33.         adapter.SelectCommand = command
  34.  
  35.         ' Create the InsertCommand.
  36.         command = New SqlCommand("INSERT INTO [Menu] ([menu_type], [menu_cost], [menu_tax]) VALUES (@menu_type, @menu_cost, @menu_tax)", connection)
  37.         Dim parm As New SqlParameter
  38.         parm.ParameterName = "@menu_type"
  39.         parm.Direction = ParameterDirection.Input
  40.         parm.SqlDbType = SqlDbType.Char
  41.         parm.SourceColumn = "menu_type"
  42.         parm.SourceVersion = DataRowVersion.Current
  43.         command.Parameters.Add(parm)
  44.         parm = New SqlParameter
  45.         parm.ParameterName = "@menu_cost"
  46.         parm.Direction = ParameterDirection.Input
  47.         parm.SqlDbType = SqlDbType.Money
  48.         parm.SourceColumn = "menu_cost"
  49.         parm.SourceVersion = DataRowVersion.Current
  50.         command.Parameters.Add(parm)
  51.         parm = New SqlParameter
  52.         parm.ParameterName = "@menu_tax"
  53.         parm.Direction = ParameterDirection.Input
  54.         parm.SqlDbType = SqlDbType.Money
  55.         parm.SourceColumn = "menu_tax"
  56.         parm.SourceVersion = DataRowVersion.Current
  57.         command.Parameters.Add(parm)
  58.         adapter.InsertCommand = command
  59.  
  60.         ' Create the UpdateCommand.
  61.         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)
  62.  
  63.         ' Add the parameters for the UpdateCommand.
  64.         parm = New SqlParameter
  65.         parm.ParameterName = "@menu_type"
  66.         parm.Direction = ParameterDirection.Input
  67.         parm.SqlDbType = SqlDbType.Char
  68.         parm.SourceColumn = "menu_type"
  69.         parm.SourceVersion = DataRowVersion.Current
  70.         command.Parameters.Add(parm)
  71.         parm = New SqlParameter
  72.         parm.ParameterName = "@menu_cost"
  73.         parm.Direction = ParameterDirection.Input
  74.         parm.SqlDbType = SqlDbType.Money
  75.         parm.SourceColumn = "menu_cost"
  76.         parm.SourceVersion = DataRowVersion.Current
  77.         command.Parameters.Add(parm)
  78.         parm = New SqlParameter
  79.         parm.ParameterName = "@menu_tax"
  80.         parm.Direction = ParameterDirection.Input
  81.         parm.SqlDbType = SqlDbType.Money
  82.         parm.SourceColumn = "menu_tax"
  83.         parm.SourceVersion = DataRowVersion.Current
  84.         command.Parameters.Add(parm)
  85.         parm = New SqlParameter
  86.         parm.ParameterName = "@Original_menu_id"
  87.         parm.Direction = ParameterDirection.Input
  88.         parm.SqlDbType = SqlDbType.Int
  89.         parm.SourceColumn = "menu_id"
  90.         parm.SourceVersion = DataRowVersion.Original
  91.         command.Parameters.Add(parm)
  92.         parm = New SqlParameter
  93.         parm.ParameterName = "@menu_id"
  94.         parm.Direction = ParameterDirection.Input
  95.         parm.SqlDbType = SqlDbType.Int
  96.         parm.SourceColumn = "menu_id"
  97.         parm.SourceVersion = DataRowVersion.Current
  98.         command.Parameters.Add(parm)
  99.         adapter.UpdateCommand = command
  100.  
  101.         ' Create the DeleteCommand.
  102.         command = New SqlCommand("DELETE FROM Menu WHERE (menu_id = @Original_menu_id)", connection)
  103.  
  104.         ' Add the parameters for the DeleteCommand.
  105.         parm = New SqlParameter
  106.         parm.ParameterName = "@Original_menu_id"
  107.         parm.SqlDbType = SqlDbType.Int
  108.         parm.Direction = ParameterDirection.Input
  109.         parm.SourceColumn = "menu_id"
  110.         parm.SourceVersion = DataRowVersion.Original
  111.         command.Parameters.Add(parm)
  112.         adapter.DeleteCommand = command
  113.         Return adapter
  114.     End Function
  115.  
  116.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  117.         CN.Open()
  118.         DA.Update(DS.Tables(0))
  119.         CN.Close()
  120.         Me.Close()
  121.     End Sub
  122.  
  123.     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  124.         Me.Close()
  125.     End Sub
  126. End Class

Ответить

Номер ответа: 12
Автор ответа:
 Дмитрий Юпатов



Вопросов: 4
Ответов: 457
 Web-сайт: cargomaster.at.ua/
 Профиль | | #12
Добавлено: 04.07.09 21:40
ну для получения списка всех таблиц в БД такой запрос: "SELECT * FROM sys.tables" и в итоге получаем сводную таблицу в которой среди прочего есть столбец Name. Он-то нам и нужен для заливки в Комбо...
А вообще рекомендую пошариться тут: http://www.intuit.ru/catalog/database/

Ответить

Номер ответа: 13
Автор ответа:
 Aston



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #13 Добавлено: 05.07.09 00:09
Да про такой скл запрос я вроде ещё не читал, это я так понял входит в стандарт анси СКЛ запросов. И лучше набрать так "Select Name From sys.Tables" так как при таком запросе что показал дмитрий там куча столбцов лишних выдаёт размер таблицы и ещё куча всякой инфы.
Дмитрий и какой это ты раздел по БД на этом сайте читал - я про такие тонкости тоже не проч узнать.
Читал про всякие тригеры, процедуры, функции, представления а вот про такое не читал вроде -мож и читал но забыл но вроде нет.

Ответить

Номер ответа: 14
Автор ответа:
 Дмитрий Юпатов



Вопросов: 4
Ответов: 457
 Web-сайт: cargomaster.at.ua/
 Профиль | | #14
Добавлено: 05.07.09 01:31
я читал там многое, где именно сидит тот запрос, не скажу. Задача стояла такая - создать приложение-клиент, которое соединяется с заданным сервером и в нем с заданной БД. Должна быть возможность перехода между таблицами БД. Комплект приложений-клиентов (хоть 2, хоть 100), работающий в пределах локали, обменивается между собой короткими сообщениями по UDP - для своевременного принудительного обновления набора записей у всех (т.к. имеется возможность коллективной работы с одной таблицей).
Собственно, что там было для удобства сделано: получение списка доступных серверов, затем БД-шек на выбранном сервере, и затем таблиц на выбранной БД.

Ответить

Номер ответа: 15
Автор ответа:
 avers_inc



Вопросов: 7
Ответов: 19
 Профиль | | #15 Добавлено: 09.07.09 22:25
Всем спасибо за ответы! Извините за задержку: просто не было времени - нужно было срочно программу дописать...
Нашел книжку хорошую по ADO.NET: "Д.Сеппа. Программирование на Microsoft ADO.NET 2.0" - достаточно доступно и подробно все описано, хотя у самого нет времени всю внимательно почитать, но хоть в чем-то разобраться смог. Например: для получения списка таблиц, а также кучи других данных, достаточно воспользоваться методом GetShema объекта connection.
Вот только пока не понял, что означает строка Return adapter (последняя в Public Function CreateCustomerAdapter)?
И еще: зачем писать такой длинный список параметров, а можно просто в строку запроса вставить переменные? Ну строка конечно длинная получается, зато одна...

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам