Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Update нескольких баз из DataGridView


Автор: yur1221 28.6.2011, 22:38
Всем привет.
Заполняю DataGridView  с помощью SQL запроса, в которjм объединяются 2 базы. Что-то меняю в дата гриде, хочу проапдейтить базы. Естественно он мне пишет: "Динамическое создание SQL для нескольких базовых таблиц не поддерживается". А как тогда лучше поступить, подскажите плиз?

Код:

Код

Dim connetionString As String
    Dim connection As SqlConnection
    Dim adapter As SqlDataAdapter
    Dim ds As New DataSet
    Dim good As String
    Dim sql As String



    Public Sub DataGrid_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DataGrid.Click
        connetionString = "Data Source=.\SQLEXPRESS1;Initial Catalog=test;User Id=test;Password=*;Trusted_Connection=False"
        connection = New SqlConnection(connetionString)
        sql = "select g.id as Id, g.good as [Название], p.amount as [Кол-во], p.price as [Цена]" + _
        " from good g inner loop join prop p on p.goodid=g.id"
        Try
            connection.Open()
            adapter = New SqlDataAdapter(sql, connection)
            adapter.Fill(ds)
            connection.Close()
            DataGridView1.DataSource = ds.Tables(0)
            Dim builder As New SqlCommandBuilder(adapter)
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub

    Private Sub BUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BUpdate.Click

        ' DataGridView1.BeginEdit(True)
        adapter.Update(ds, ds.Tables(0).ToString)

    End Sub

Автор: yur1221 29.6.2011, 21:27
Совсем нет идей :(

Автор: diadiavova 29.6.2011, 22:10
Цитата(yur1221 @  29.6.2011,  22:27 Найти цитируемый пост)
Совсем нет идей 

Идеи есть, но сам их не пробовал. Попробуй обновлять не весь датасет, а таблицы поотдельности. В дизайнере датасета добавь к адаптерам таблиц соответствующие запросы и выполняй их. Ну это если речь об идее, а готового решения нет smile 

Автор: yur1221 29.6.2011, 22:41
Я пробовал создавать мастером tableadapter'ы, первый вытаскивает данные из 1 таблицы, второй из второй. В первом tableadapter'е задаю запрос объединения таблиц, типа как 
Код

"select g.id as Id, g.good as [Название], p.amount as [Кол-во], p.price as [Цена]" + _
        " from good g inner loop join prop p on p.goodid=g.id"

затем заливаю адаптеры в датасеты:

Код

  Me.GoodTableAdapter.FillBy(Me.TestDataSet.good)
  Me.PropTableAdapter.Fill(Me.TestDataSet.prop)


потом заполняю датагрид:

Код

DataGridView1.DataSource = Me.TestDataSet.good


в датагрид все встает прекрасно, но если я меняю в датагриде данные из первой и второй таблицы и затем апдейчу, менятся только первая таблица.. в принципе логично ,т.к. DataGridView1.DataSource = Me.TestDataSet.good

А как же мне сделать так чтобы менялось и во второй табле тоже?

код апдейта:

Код

Me.GoodTableAdapter.Update(Me.TestDataSet.good)
Me.PropTableAdapter.Update(Me.TestDataSet.prop)

Автор: diadiavova 30.6.2011, 10:19
Ну вообще-то, хранить однотипные данные надо в одном месте, поэтому я уж не знаю, какая такая необходимость в том, чтобы использовать для этого разные базы. Но если уж кровь с носа нужно, то придется львиную долю работы вручную делать. Я бы добавил в датасет еще одну таблицу, в которой будут содержаться данные из обеих таблиц, связанными с базами. После заполнения таблиц из баз, данные вручную передавать в это таблицу, в ней, по всей видимости, еще надо будет сделать поле, в котором будет указано, из какой базы эта запись. При обновлении раскидывать данные из этой таблицы по адаптерам, связанным с базами и уже из них выполнять обновление. Правда тут еще надо определить, куда пихать данные, которые были добавлены во время редактирования, но я полагаю у тебя есть ответ на этот вопрос. 
А вообще, лучше создать одну базу, если это возможно.

Автор: yur1221 30.6.2011, 10:49
Мдя.. гимор еще тот  smile, придется лепить все в одну таблицу, спасибо за ответ.

Автор: yur1221 8.7.2011, 23:17
Цитата(diadiavova @ 30.6.2011,  10:19)
...какая такая необходимость в том, чтобы использовать для этого разные базы....

diadiavova только щас внимательно прочитал ответ , у меня база одна.. таблицы 2 юзается. Вот как бы мне при использовании отношений 2-х таблиц, связать их, вывести в датагриде и проапдейтить каждую в отдельности. Выводить получается, апдейтить тоже.. но только ту таблицу, которая заполняет датагрид первой

Автор: diadiavova 8.7.2011, 23:29
Не должно быть в одной базе двух таблиц с одинаковым набором полей. Это грубая ошибка при проектировании базы данных. Забей все в одну таблицу в базе и проблемы не будет. Если надо разделить данные таблиц, то добавь в эту общую таблицу еще одно поле, в котом укажи параметр, по которому данные различаются. Все эти действия не предусмотрены именно потому, что так никто не делает и для этого вся эта система не приспособлена. Можно сделать через жо руками, но зачем? smile 

Автор: yur1221 8.7.2011, 23:37
Я мб не так что-то обьяснил? У меня нет одинаковых наборов. 1 таблица- это товар и его производитель, 2- это свойство товара (цена, количество и т.д.) 2 таблица связана со второй по ключевому полю goodid= полю id во второй таблице.
Почему по разным таблицам- потому что из первой юзается имя товара гдето еще, и производитель..чтобы не плодить одинаковые поля в других таблицах

Автор: diadiavova 8.7.2011, 23:42
А что происходить при апдейте второй таблицы?

Автор: yur1221 8.7.2011, 23:50
Цитата(diadiavova @ 8.7.2011,  23:42)
А что происходить при апдейте второй таблицы?

Должно происходить или происходит?

1)Должна обновлятся так же как и первая, при внесении изменений в датагриде
2) А она ессно не обновляется ,т.к. в датагрид заливается дататейбл из первой таблицы с соотвествущим запросом там
 о чем я писал чуть выше:

Цитата

...Я пробовал создавать мастером tableadapter'ы, первый вытаскивает данные из 1 таблицы, второй из второй...


Честно говоря мне это нужно позарез осуществить. Хотя бы куда закинуть удочки.. чтото мыслей уже не осталось.

Автор: diadiavova 8.7.2011, 23:56
Цитата(yur1221 @  9.7.2011,  00:50 Найти цитируемый пост)
Должна обновлятся так же как и первая, при внесении изменений в датагриде

Я что-то видимо не понимаю. В гриде у тебя первая таблица, изменения ты вносишь в нее же, обновляется тоже она, а вопрос в том, почему не обновляется вторая? Толи ты чего-то не договариваешь, толи я уже не соображаю. 
А составить пример небольшой можешь, чтобы я посмотрел, а то так можно долго говорить и ни до чего не договориться. 

Но это уже не сегодня ессно. smile 

Автор: yur1221 8.7.2011, 23:59
Пример- ехе-шник скомпилировать?

Автор: diadiavova 9.7.2011, 00:03
Цитата(yur1221 @  9.7.2011,  00:59 Найти цитируемый пост)
Пример- ехе-шник скомпилировать? 

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

Автор: yur1221 9.7.2011, 00:39
Вот архив с проектом и базой. Пароль от архива в личке. Гляньте, плиз, что можно сделать.

Автор: diadiavova 11.7.2011, 21:28
Посмотрел я твой проект(непонятно зачем ты его зашифровал, ну да ладно), опять-таки смысла в разделении на две таблицы я не увидел. У тебя там связь один к одному. Это все можно в одну таблицу уместить и не мучиться. Твой проект у меня не захотел запускаться, поскольку там не было подключения к базе(видимо что-то изменилось во время апгрейда проекта).


Поскольку апдейт выполняется для одной таблицы, то все, что могу посоветовать в случае, если ты оставишь две таблицы(хотя этого и не стоит делать) - это изменить значение свойства UpdateCommand адаптера этой таблицы. Когда ты его обновляешь выполняется команда записанная именно в этом свойстве. Допиши туда инструкции обновления и второй таблицы тоже.

Вот, что выполняется при апдейте сейчас
Код

UPDATE [dbo].[good] SET [Id] = @Id, [Good] = @Good, [Vendor] = @Vendor, 
[Life] = @Life WHERE (([Id] = @Original_Id) AND 
((@IsNull_Good = 1 AND 
[Good] IS NULL) OR ([Good] = @Original_Good)) AND 
((@IsNull_Vendor = 1 AND [Vendor] IS NULL) OR ([Vendor] = @Original_Vendor)) AND 
((@IsNull_Life = 1 AND [Life] IS NULL) OR ([Life] = @Original_Life)));
SELECT Id, Good, Vendor, Life FROM good WHERE (Id = @Id)


Автор: yur1221 12.7.2011, 19:22
Это таблицы для примера.  В реальном проекте таблицы по серьезнее. Жаль что не помог :(
Цитата

Допиши туда инструкции обновления и второй таблицы тоже.

Да там все тоже написано. В проекте же есть. А обновляется одна таблица, потому что
Цитата

 DataGridView1.DataSource = Me.TestDataSet.good

Жаль, но все равно спасибо.

Автор: diadiavova 12.7.2011, 20:06
Цитата(yur1221 @  12.7.2011,  20:22 Найти цитируемый пост)
Это таблицы для примера.  В реальном проекте таблицы по серьезнее.

если в реальном проекте одной записи первой таблицы соответствует строго одна запись второй, то это не имеет значения. Если нет, то и в этом проекте не надо было так делать, поскольку сбивает с толку.
Цитата(yur1221 @  12.7.2011,  20:22 Найти цитируемый пост)
Да там все тоже написано.

Я здесь привел текст запроса, который выполняется при обновлении. Никаких упоминаний о таблице prop я там не заметил. Возможно что-то просмотрел.
Цитата(yur1221 @  12.7.2011,  20:22 Найти цитируемый пост)
DataGridView1.DataSource = Me.TestDataSet.good

Грид обычно привязывают к датасету
Код

DataGridView1.DataSource = Me.TestDataSet
DataGridView1.DataMember = "good"
Хотя не важно наверно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)