| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Базы данных под .NET > Номер записи в таблице |
| Автор: kaa 2.1.2006, 12:55 |
| Передо мной встал вопрос - как добраться до последней записи в таблице? Я порылся в методах DataTable и DataRow но ничего подобного MoveEnd ненашёл. Добавлено @ 12:58 Я воопще к чему эту тему завёл: надо строку вставить, ру и соответственно у неё первое поле ключевое. Так мне надо перед вставкой строки записать туда значение на единицу больше значения ключевого поля последней строки, а як до него добраться я ненаю! |
| Автор: Дрон 2.1.2006, 14:19 |
| kaa В любом случае вручную это делать не хорошо. У DataColumn есть свойства AutoIncrement, AutoIncrementSeed, AutoIncrementStep -- поставь их такими же как и в твоей базе данных и будет тебе счастье. ЗЫ: Такого понятия как "последняя запись в таблице" не существует. Какая из них будет последней зависит от выбранной сортировки. |
| Автор: kaa 2.1.2006, 14:41 |
| Дрон Тогда позвольте спрошу немного подругому: как определить наибольшее значение ключа в таблице (ключ - число). Ведь помоему запрос SQL не анализирует ключевое поле? Добавлено @ 14:43 Дрон А еще не подскажете гже поподробнее можно узнать о свойствах и методах DtaGrid |
| Автор: Дрон 2.1.2006, 18:07 | ||||||
| kaa Я же сказал, что вручную этим заниматься категорически не стоит. Самое большое значение ключа не всегда последнее, т.к. последние добавленные записи могли быть удалены. А вообще, если есть DataTable, то можно написать так:
НО ТАК ДЕЛАТЬ НЕ СТОИТ!!!
Не совсем понятно, о чём речь.
MSDN -- http://msdn.microsoft.com |
| Автор: kaa 3.1.2006, 00:05 | ||
Наверное нада сказать откуда ноги растут... Я хачу реализовать в своей пробной, так сказать программе, возможность добавления записей. Так прежде чем новая запись будет добавлена в объект DataTable нужно всем полям присвоить требуемые значения. В таблице присутствует ключевое поле. Ключ - число ( тип int). Соответственно мне нужно записать новое значение ключа. Разумно будет предположить што оно должно быть на единицу больше наибольшего из ключей (они у меня в таблице идут по порядку с возрастанием значения). Перефразирую вопрос: как мне найти максимальное значение ключевого поля чтобы потом на его основе вычислять значение новго ключа Добавлено @ 00:08 И еще одна мысль прибежала: а если мы вставляем строку в таблицу, у которой клучевое поле со свойством автоинкремента, то тоже надо значение ключа забивать или ключь вычислится автоматически? Добавлено @ 00:10 ЗЫ: Помоему название темы должно быть другим... Его нельзя поменять??? |
| Автор: -ser- 3.1.2006, 08:12 | ||
ключЪ вычислится автоматически, тебе о нем беспокоиться не стоит, сервер сам помнит какой будет следующий. и как уже упомянул Дрон: Самое большое значение ключа не всегда последнее, т.к. последние добавленные записи могли быть удалены. т.е. если ты удалил последнюю строку в таблице с номером ключа 100, а затем добавляешь новую, то новый ключ все равно будет например 101, а никак не 100, в противном случае ты представляешь к каким результатам может привести создание новой строки с тем же ключом, что уже когда-то существовала. |
| Автор: kaa 3.1.2006, 11:30 |
| -ser- O! ЧИЛОВЕК! ПАСИБА ТЕ! РАЗЪЯСТНИЛ |
| Автор: mr.DUDA 3.1.2006, 12:11 |
| З.Ы. если ещё надо, чтобы заполнялись любые поля (не только ключевое), можно выставить у колонок (DataColumn) св-во DefaultValue. |
| Автор: kaa 3.1.2006, 14:46 |
| mr.DUDA Как понять заполнялись? Сами собой что-ли? |
| Автор: kaa 3.1.2006, 14:57 |
| -ser- То ли я тормоз, то ли я чего не понимаю, но у меня идут траблы с ключевым полем при вставке новой строки! Кстати, я пытаюсь её добавить в локальный объёкт DataTble, а не запросом на сервер.... Та кне делают? В общем код такой: private void Create_Click(object sender, System.EventArgs e) { DataRow row = ds.Tables["trunk"].NewRow(); row["KEY"]=null; row["NUMMASCH"]=10000; row["NUMTRUNK"]="NuNuCa Nuss-Nougat-Creme"; row["MARK"]=10000; row["SER_NUM"]=10000; ds.Tables["trunk"].Rows.Add(row); } Так у меня вылазит исключение - типа в ключевом поле запрещено значение NULL. Когда ремарю строку row["KEY"]=null; Все работает, но в ключевом поле появляется значение NULL. В базе данных у меня поле KEY имеет свойство счетчик. Когда я загружаю таблицу в структуру DataSet это свойство сохраняется или нет? Почему при добавлении строки у меня не происходит автоматического изменения значения поля KEY ЗЫ: я еще только начинаю учиться кодить на C#, но меня уже задолбал данный трабл - грёбанную строку в таблицу впихнуть невозможно |
| Автор: Дрон 3.1.2006, 15:22 | ||||||
| kaa Когда приводишь исходники, выделяй их кнопкой Код. И вообще старайся, по-меньше использовать красный цвет
По-моему, нет. Ты должен после загрузки данных сам написать:
Тогда всё будет нормально. А при создании новой строки вообще поле KEY не трогай. А кстати, как ты обновляешь БД? Через DataAdapter или вручную?
А C# тут совсем не причём |
| Автор: Exception 3.1.2006, 15:39 | ||||||
Точно. Скорее причем
На будущее: для этого необходимо в гугле набрать имякласса members. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformsdatagridmemberstopic.asp |
| Автор: kaa 3.1.2006, 21:56 | ||||
Да я уже... Типа вчера битый час хреначил странички с сайта мелкомягкого в Word ЗЫ: ПАРДОН ЗА ОФТОП Добавлено @ 21:59 Дрон
А вот до этого я еще не дошёл... Предполагаю через DataAdapter, а что? |
| Автор: kaa 3.1.2006, 22:47 | ||||
Дрон
Фигу! У меня в таблице уже есть значение поля KEY=1, так эта гадость такое же значение ставит не стесняясь
Вылезает трабл в виде исключения - типа усё! Типа такое значение (1) уже есть! И какое же начальное значение мне задавать? Да что за хрень-то, а?????????????????????????????????? |
| Автор: Дрон 3.1.2006, 23:12 |
| kaa Пожалуйста меньше эмоций, мы же серьёзные люди Если руки растут не совсем оттуда, то зачем же ругаться на такую удобнейшую систему как .NET. Что ж. Теперь попробую объяснить тот подход, который использую я. Во-первых, я был не совсем прав насчёт того, что значения автоинкремента надо ставить такими же как и базе. Но об этом позже. А для начала рассмотрим как раз финальный этап -- обновление БД. Я думаю, что большинство БД (ты вроде используешь Access?) не дадут вручную записать произвольное значение в поле с автоинкрементом. Тем самым и тебе в твоей программе в простейшем случае вообще не надо трогать это поле. При добавлении новых записей в таблицу сама БД будет генерировать нужные значения. В более сложном случае общим подходом (вроде рекомендованным майкрософт) является установка значения AutoIncrementSeed = -1, AutoIncrementStep = -1. Тогда те поля, которые добавлены в таблицу, но ещё не сохранены в БД будут иметь ОТРИЦАТЕЛЬНЫЕ ключи, которые не пересекутся с уже существующими. А когда ты будешь обновлять через DataAdapter -- он заменит их на реальные, которые сгенерирует база данных (при работе вручную тебе нужно будет вручную их обновлять -- и это для Access немного напряжно). Нужно ещё учесть, что если у тебя не одна таблица, а несколько и при этом у тебя есть связь, использующая значения этого ключа, то нужно всё правильно настроить и обновлять таблицы в правильном порядке, чтобы ссылки на эти отрицательные ключи обновились во всех таблицах. Если что-то не ясно, то могу попробовать объяснить подробнее и с примерами. |
| Автор: kaa 4.1.2006, 00:04 |
| Дрон Пасибо! Вроде пока всё всасал, к тому же книженцую поштудировал по ADO.NET, ща буду с обновлениями маятся - как, чё... |
| Автор: kaa 4.1.2006, 22:57 |
| Дрон Товарисч! Я сегодня весь день читал книжецу ADO.NET любезно выложенную кем-то на ентом форуме. Почитал-почитал и решил таки пойти к Вам за советом. Оказывается код обновления нужно ваять самому... Меня это сильно покоробило. В книге есть пример, но там навалена куча кода и некоторых маментов я никак не пойму... Можно пару примерчиков с объяснениями,а? Добавлено @ 22:57 Или на крайняк ссылочку на какую-нить литературку по данному вопросу... |