powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Не понятное поведение
10 сообщений из 10, страница 1 из 1
Не понятное поведение
    #35832107
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любопытный момент:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DataTable activity = dataset.Tables["Activity"];
IEnumerable<DataRow> myRows = dataset.Tables["ImportedData"].AsEnumerable()
    .Where((n, x) => n[11] != DBNull.Value).Select(n => ((string)n[11]).Trim()).Distinct()
    .OrderBy(n => n)
    .Select(n => { DataRow m = activity.NewRow(); m[1] = n; activity.Rows.Add(m); return m; });

MessageBox.Show(activity.Rows.Count.ToString());//Тут получаю 0, хотя в предидущем 
//примере добавил строки. 
//Аке, тогда добавлю записи через цикл:
foreach (DataRow item in myRows) //А здесь получаю ошибку: "Эта строка уже принадлежит данной таблице" -
// хотя перед этим показало, что мол записей 0.
{
    activity.Rows.Add(item); 
}
Так 0 или всё же принадлежит??? Неувязка какая-то... Логично, что записи все же добавлены, тогда почему Count = 0 ?
...
Рейтинг: 0 / 0
Не понятное поведение
    #35832126
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SubmitChanges() ?
...
Рейтинг: 0 / 0
Не понятное поведение
    #35832231
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buredSubmitChanges() ?
честно говоря, я не понял... Нашел этот метод у класса DataContext, но не пойму каким боком он тут может сыграть роль...
...
Рейтинг: 0 / 0
Не понятное поведение
    #35832381
SMAKSx86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка происходит при попытке добавить строку, у которой уже есть таблица, которой она принадлежит. А если скопировать строку? Так, например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
DataRow r;
foreach (DataRow item in myRows) //А здесь получаю ошибку: "Эта строка уже принадлежит данной таблице" -
// хотя перед этим показало, что мол записей 0.
{
    r = activity.NewRow();
    for(int i = 0; i < r.Columns.Count; i++)
        r[i] = item[i];
    activity.Rows.Add(r); 
}
...
Рейтинг: 0 / 0
Не понятное поведение
    #35832385
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SMAKSx86Ошибка происходит при попытке добавить строку, у которой уже есть таблица, которой она принадлежит. А если скопировать строку? Так, например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
DataRow r;
foreach (DataRow item in myRows) //А здесь получаю ошибку: "Эта строка уже принадлежит данной таблице" -
// хотя перед этим показало, что мол записей 0.
{
    r = activity.NewRow();
    for(int i = 0; i < r.Columns.Count; i++)
        r[i] = item[i];
    activity.Rows.Add(r); 
}

а смысл в этом какой?
...
Рейтинг: 0 / 0
Не понятное поведение
    #35832462
SMAKSx86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простите, не сразу осмыслил вопрос.
Если посмотреть отладчиком, то видно такой момент: после выполнения строки foreach (DataRow item in myRows) изменяется значение activity.Rows.Count.
Как я понял, в момент выполнения запроса стартует какая-то операция, очень похожая на неявную транзакцию(не в смысле транзакции базы данных). Которая должна явно коммитится, как в примере ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/dv_linqsql/html/7e26c7eb-c18a-43b5-a8f0-28fd8b04b0f0.htm.(смотрите SubmitChanges())
Но поскольку SubmitChanges() не выполняется явно, то в момент перечисления он выполняется неявно и меняется activity.Rows.Count.
...
Рейтинг: 0 / 0
Не понятное поведение
    #35832469
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SMAKSx86Простите, не сразу осмыслил вопрос.
Если посмотреть отладчиком, то видно такой момент: после выполнения строки foreach (DataRow item in myRows) изменяется значение activity.Rows.Count.
Как я понял, в момент выполнения запроса стартует какая-то операция, очень похожая на неявную транзакцию(не в смысле транзакции базы данных). Которая должна явно коммитится, как в примере ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/dv_linqsql/html/7e26c7eb-c18a-43b5-a8f0-28fd8b04b0f0.htm.(смотрите SubmitChanges())
Но поскольку SubmitChanges() не выполняется явно, то в момент перечисления он выполняется неявно и меняется activity.Rows.Count.
млин.... я совсем забыл об ленивых вычислениях...
...
Рейтинг: 0 / 0
Не понятное поведение
    #35832492
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SMAKSx86,
Спасибо, я въехал в чем дело. Правда я работаю с DataSet, а не напрямую с БД. =)
...
Рейтинг: 0 / 0
Не понятное поведение
    #35832496
SMAKSx86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мдя, косяк-с. Неправильно я понял смысл происходящего. Зато статью нашел на эту тему. Может, пригодится кому: тынц (пример в самом конце статьи)
...
Рейтинг: 0 / 0
Не понятное поведение
    #35832506
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача была такая (точнее ее часть):
из файла екселя качнуть данные, затем разбить их на две слинкованные между собой таблицы. решил сделать это так: залить данные во временную таблу ДатаСета и задействовав линкю выполнить все необходимые операции. Затем полученный результаты сохранить в БД.
Юзеры ранее могли для каждой компании указывать только один вид экономической деятельности, а теперь потребовалось несколько. соответственно для этого нужно изменить структуру БД (в моем случае - я имею на руках лишь файл екселя с выборкой в виде единой таблицы). Т.о. я выбираю из поля все виды экономической деятельности, исключая пустые записи и повторения и сохраняю в отдельную таблу.
Конечный результат (применительно к примеру данного топика) выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
...
DataTable imported = dataset.Tables["ImportedData"];
DataTable activity = dataset.Tables["Activity"];
IEnumerable<DataRow> myRows = imported.AsEnumerable()
    .Where((n, x) => n[11] != DBNull.Value).Select(n => ((string)n[11]).Trim()).Distinct().OrderBy(n => n)
    .Select(n => { DataRow m = activity.NewRow(); m[1] = n; 
        activity.Rows.Add(m);
        return m;
    }).ToList();//Нельзя забывать о "ленивых" вычислениях!!! =)))))
...
Всё работает как часики.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Не понятное поведение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]