[ADO.NET] Можно ли использовать один DataProvider для N таблиц?
Есть такая класская штука, мсдном завется. =)
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_raddata/html/c9970150-b71b-4c9d-a355-5efb6b510dca.htm
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_raddata/html/c9970150-b71b-4c9d-a355-5efb6b510dca.htm
какая часть этой статьи говорит о нескольких взаимосвязанных таблицах?
и там ничего не сказано, как можно их получить сначала, чтоб сразу 3 или 4 штуки прочитать вместе со связями
и там ничего не сказано, как можно их получить сначала, чтоб сразу 3 или 4 штуки прочитать вместе со связями
нашёл про несколько уже готовых взаимосвязанных, не нашёл заполнение
Updating Two Related Tables in a Dataset?
Или я чего то не понимаю?
Или я чего то не понимаю?
вопрос в том, как заполнить DataSet несколькими связаными таблицами одной БД сохранив связи
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 генерируется автоматически из описания таблиц, полученного вижуалстудией непосредственно у базы данных, там где-то есть визард на эту тему.
Записывать обратно, полагаю, в обратном порядке.нет, при записи данных обратно в базу из датасета надо разделять (с помощью метода 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
DataSetReport генерируется автоматически из описания таблиц, полученного вижуалстудией непосредственно у базы данных, там где-то есть визард на эту тему.автор треда хотел получать связи автоматически из БД, вижуалстудия этого не делает.
Ладно, поставим вопрос по-другому.
Как за одину операцию с помощью DataAdapter заполнить сразу три таблицы DataSet'а, взяв данные из одной БД? Или же вовсе не обязательно, чтобы таблицы эти были получены одним датаадептером?
Как за одину операцию с помощью DataAdapter заполнить сразу три таблицы DataSet'а, взяв данные из одной БД? Или же вовсе не обязательно, чтобы таблицы эти были получены одним датаадептером?
Тест показал, что ....
заполняет ds тремя таблицами ...
Насчёт a.Update(ds) - хз, ломает думать над соответствующими Insert Update и Delete командами адаптера.
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 командами адаптера.
Оставить комментарий
agaaaa
т.е. скопировать в некий DataSet несколько таблиц БД, поработать с ними и залить обратно изменения.судя по заголовкам методов DataAdaptera, он это умеет. только не очень понятно, как именно.
если можно - кусок кода-примера