[ADO.NET] Можно ли использовать один DataProvider для N таблиц?

agaaaa

т.е. скопировать в некий DataSet несколько таблиц БД, поработать с ними и залить обратно изменения.
судя по заголовкам методов DataAdaptera, он это умеет. только не очень понятно, как именно.
если можно - кусок кода-примера

timefim

Есть такая класская штука, мсдном завется. =)
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_raddata/html/c9970150-b71b-4c9d-a355-5efb6b510dca.htm

agaaaa

какая часть этой статьи говорит о нескольких взаимосвязанных таблицах?
и там ничего не сказано, как можно их получить сначала, чтоб сразу 3 или 4 штуки прочитать вместе со связями

agaaaa

нашёл про несколько уже готовых взаимосвязанных, не нашёл заполнение

timefim

Updating Two Related Tables in a Dataset?
Или я чего то не понимаю?

agaaaa

вопрос в том, как заполнить DataSet несколькими связаными таблицами одной БД сохранив связи

bleyman

			ValidateConnection;

this.AuthorizationInfo.RequestAccess(this.sqlConnection, AccessLevel.HeadTeacher);

ClassCollection classes = classCollectionContainer.GetData;
DataSetReport result = new DataSetReport;
string param = GetParam(classes);

this.sqlDataAdapterClasses.SelectCommand.CommandText = "SELECT * FROM Classes WHERE Id IN " + param;
this.sqlDataAdapterStuts.SelectCommand.CommandText = "SELECT * FROM Stuts stut INNER JOIN StutsToClasses s2c ON s2c.StutId = stut.Id WHERE s2c.ClassId IN " + param;
this.sqlDataAdapterStutsToClasses.SelectCommand.CommandText = "SELECT * FROM StutsToClasses WHERE ClassId IN " + param;
this.sqlDataAdapterSubjects.SelectCommand.CommandText = "SELECT DISTINCT subject.* FROM Subjects subject INNER JOIN Groups gr ON gr.SubjectId = subject.Id WHERE gr.ClassId IN " + param;
this.sqlDataAdapterGroups.SelectCommand.CommandText = "SELECT * FROM Groups WHERE ClassId IN " + param;
this.sqlDataAdapterJournalEvents.SelectCommand.CommandText = "SELECT je.* FROM JournalEvents je INNER JOIN Groups gr ON gr.Id = je.GroupId WHERE gr.ClassId IN " + param;
this.sqlDataAdapterJournalGrades.SelectCommand.CommandText = "SELECT jg.* FROM JournalGrades jg INNER JOIN JournalEvents je ON je.Id = jg.EventId INNER JOIN Groups gr ON gr.Id = je.GroupId WHERE gr.ClassId IN " + param;

this.sqlDataAdapterClasses.Fill(result.Classes);
this.sqlDataAdapterStuts.Fill(result.Stuts);
this.sqlDataAdapterStutsToClasses.Fill(result.StutsToClasses);
this.sqlDataAdapterSubjects.Fill(result.Subjects);
this.sqlDataAdapterGroups.Fill(result.Groups);
this.sqlDataAdapterJournalEvents.Fill(result.JournalEvents);
this.sqlDataAdapterJournalGrades.Fill(result.JournalGrades);

return new DataSetReportContainer(result);

Записывать обратно, полагаю, в обратном порядке. DataSetReport генерируется автоматически из описания таблиц, полученного вижуалстудией непосредственно у базы данных, там где-то есть визард на эту тему.

6yrop

Записывать обратно, полагаю, в обратном порядке.
нет, при записи данных обратно в базу из датасета надо разделять (с помощью метода DataTable.Select(null, .. удаленные, новые и обнавленные записи, в мсдне есть об этом статья. Но в ней не учитывается ситуация, когда поле внешнего ключа (FK) может содержать NULL -ы (хотя эта ситуация редка и ее стоит избегать). В общем случае у меня получилась вот такая последовательность обновлений
Child.Update.ValueFKFieldNull
Child.Delete.All
Parent.Delete.All
Parent.Update.All
Parent.Insert.ValueFKFieldNotNull
Child.Update.All
Child.Update.All

6yrop

DataSetReport генерируется автоматически из описания таблиц, полученного вижуалстудией непосредственно у базы данных, там где-то есть визард на эту тему.
автор треда хотел получать связи автоматически из БД, вижуалстудия этого не делает.

agaaaa

Ладно, поставим вопрос по-другому.
Как за одину операцию с помощью DataAdapter заполнить сразу три таблицы DataSet'а, взяв данные из одной БД? Или же вовсе не обязательно, чтобы таблицы эти были получены одним датаадептером?

Alena_08_11

Тест показал, что ....


SqlConnection cn = new SqlConnection("....");
SqlDataAdapter a = new SqlDataAdapter("select * from table1; select * from table2; select * from table3;",cn);
DataSet ds = new DataSet;
try
{
a.Fill(ds);
}
catch(Exception ex)
{
....
}

заполняет ds тремя таблицами ...
Насчёт a.Update(ds) - хз, ломает думать над соответствующими Insert Update и Delete командами адаптера.
Оставить комментарий
Имя или ник:
Комментарий: