Модераторы: gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Номер записи в таблице, Как определить послденюю запись 
:(
    Опции темы
kaa
Дата 2.1.2006, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 817
Регистрация: 5.11.2005

Репутация: нет
Всего: 2



Передо мной встал вопрос - как добраться до последней записи в таблице? Я порылся в методах DataTable и DataRow но ничего подобного MoveEnd ненашёл.


Добавлено @ 12:58
Я воопще к чему эту тему завёл: надо строку вставить, ру и соответственно у неё первое поле ключевое. Так мне надо перед вставкой строки записать туда значение на единицу больше значения ключевого поля последней строки, а як до него добраться я ненаю! smile
PM MAIL   Вверх
Дрон
Дата 2.1.2006, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 5
Всего: 93



kaa
В любом случае вручную это делать не хорошо.

У DataColumn есть свойства AutoIncrement, AutoIncrementSeed, AutoIncrementStep -- поставь их такими же как и в твоей базе данных и будет тебе счастье.

ЗЫ:
Такого понятия как "последняя запись в таблице" не существует. Какая из них будет последней зависит от выбранной сортировки.


--------------------
Да. Именно так.
PM   Вверх
kaa
Дата 2.1.2006, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 817
Регистрация: 5.11.2005

Репутация: нет
Всего: 2



Дрон
Тогда позвольте спрошу немного подругому: как определить наибольшее значение ключа в таблице (ключ - число). Ведь помоему запрос SQL не анализирует ключевое поле?


Добавлено @ 14:43
Дрон
А еще не подскажете гже поподробнее можно узнать о свойствах и методах DtaGrid
PM MAIL   Вверх
Дрон
Дата 2.1.2006, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 5
Всего: 93



kaa
Я же сказал, что вручную этим заниматься категорически не стоит.
Самое большое значение ключа не всегда последнее, т.к. последние добавленные записи могли быть удалены.

А вообще, если есть DataTable, то можно написать так:

Код
DataTable tbl; // вот это твоя таблица, и пусть ключевое поле называется ID
int topID = Convert.ToInt32( tbl.Select(string.Empty, "ID desc" )[0]["ID"] );


НО ТАК ДЕЛАТЬ НЕ СТОИТ!!!

Цитата(kaa @ 2.1.2006, 14:41)
Ведь помоему запрос SQL не анализирует ключевое поле?

Не совсем понятно, о чём речь.

Цитата(kaa @ 2.1.2006, 14:41)
А еще не подскажете гже поподробнее можно узнать о свойствах и методах DtaGrid

MSDN -- http://msdn.microsoft.com
smile

Это сообщение отредактировал(а) Дрон - 2.1.2006, 21:48


--------------------
Да. Именно так.
PM   Вверх
kaa
Дата 3.1.2006, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 817
Регистрация: 5.11.2005

Репутация: нет
Всего: 2



Цитата

Не совсем понятно, о чём речь.


Наверное нада сказать откуда ноги растут...
Я хачу реализовать в своей пробной, так сказать программе, возможность добавления записей. Так прежде чем новая запись будет добавлена в объект DataTable нужно всем полям присвоить требуемые значения.
В таблице присутствует ключевое поле. Ключ - число ( тип int). Соответственно мне нужно записать новое значение ключа. Разумно будет предположить што оно должно быть на единицу больше наибольшего из ключей (они у меня в таблице идут по порядку с возрастанием значения).

Перефразирую вопрос: как мне найти максимальное значение ключевого поля чтобы потом на его основе вычислять значение новго ключа smile smile
Добавлено @ 00:08
И еще одна мысль прибежала: а если мы вставляем строку в таблицу, у которой клучевое поле со свойством автоинкремента, то тоже надо значение ключа забивать или ключь вычислится автоматически?
Добавлено @ 00:10
ЗЫ: Помоему название темы должно быть другим... Его нельзя поменять???
PM MAIL   Вверх
-ser-
Дата 3.1.2006, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 1.2.2005

Репутация: 4
Всего: 13



Цитата
а если мы вставляем строку в таблицу, у которой клучевое поле со свойством автоинкремента, ... или ключь вычислится автоматически?

ключЪ вычислится автоматически, тебе о нем беспокоиться не стоит, сервер сам помнит какой будет следующий. и как уже упомянул Дрон: Самое большое значение ключа не всегда последнее, т.к. последние добавленные записи могли быть удалены. т.е. если ты удалил последнюю строку в таблице с номером ключа 100, а затем добавляешь новую, то новый ключ все равно будет например 101, а никак не 100, в противном случае ты представляешь к каким результатам может привести создание новой строки с тем же ключом, что уже когда-то существовала.



--------------------
"Тонкая, однако, работа." 
PM MAIL ICQ   Вверх
kaa
Дата 3.1.2006, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 817
Регистрация: 5.11.2005

Репутация: нет
Всего: 2



-ser-
O! ЧИЛОВЕК! ПАСИБА ТЕ! РАЗЪЯСТНИЛ smile
PM MAIL   Вверх
mr.DUDA
Дата 3.1.2006, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



З.Ы. если ещё надо, чтобы заполнялись любые поля (не только ключевое), можно выставить у колонок (DataColumn) св-во DefaultValue.


--------------------
user posted image
PM MAIL WWW   Вверх
kaa
Дата 3.1.2006, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 817
Регистрация: 5.11.2005

Репутация: нет
Всего: 2



mr.DUDA
Как понять заполнялись? Сами собой что-ли?
PM MAIL   Вверх
kaa
Дата 3.1.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 817
Регистрация: 5.11.2005

Репутация: нет
Всего: 2



-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#, но меня уже задолбал данный трабл - грёбанную строку в таблицу впихнуть невозможно smile


Это сообщение отредактировал(а) kaa - 3.1.2006, 14:59
PM MAIL   Вверх
Дрон
Дата 3.1.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 5
Всего: 93



kaa
Когда приводишь исходники, выделяй их кнопкой Код. И вообще старайся, по-меньше использовать красный цвет smile

Цитата(kaa @ 3.1.2006, 14:57)
В базе данных у меня поле KEY имеет свойство счетчик. Когда я загружаю таблицу в структуру DataSet это свойство сохраняется или нет?

По-моему, нет. Ты должен после загрузки данных сам написать:
Код

ds.Tables["trunk"].Columns["KEY"].AutoIncrement = true;
ds.Tables["trunk"].Columns["KEY"].AutoIncrementStep = 1;
ds.Tables["trunk"].Columns["KEY"].AutoIncrementSeed = 1;

Тогда всё будет нормально. А при создании новой строки вообще поле KEY не трогай.

А кстати, как ты обновляешь БД? Через DataAdapter или вручную?

Цитата(kaa @ 3.1.2006, 14:57)
ЗЫ: я еще только начинаю учиться кодить на C#, но меня уже задолбал данный трабл - грёбанную строку в таблицу впихнуть невозможно smile

А C# тут совсем не причём smile

Это сообщение отредактировал(а) Дрон - 3.1.2006, 15:23


--------------------
Да. Именно так.
PM   Вверх
Exception
Дата 3.1.2006, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 2
Всего: 186



Цитата
А C# тут совсем не причём

Точно. Скорее причем
Цитата(kaa @ 3.1.2006, 01:05)
нада сказать откуда ноги растут...

smile

Цитата(kaa @ 2.1.2006, 15:41)
А еще не подскажете гже поподробнее можно узнать о свойствах и методах DtaGrid

На будущее: для этого необходимо в гугле набрать имякласса members.
http://msdn.microsoft.com/library/default....emberstopic.asp
PM   Вверх
kaa
Дата 3.1.2006, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 817
Регистрация: 5.11.2005

Репутация: нет
Всего: 2



Цитата(Exception @ 3.1.2006, 15:39)
На будущее: для этого необходимо в гугле набрать имякласса members.
http://msdn.microsoft.com/library/default....emberstopic.asp

Да я уже... Типа вчера битый час хреначил странички с сайта мелкомягкого в Word smile Они у меня по человечьи не сохраняются, браузэр потом ругается - типа немогу открыть и всё такое. Но своё грязное дело я всётаки сделал smile


ЗЫ: ПАРДОН ЗА ОФТОП
Добавлено @ 21:59
Дрон
Цитата
А кстати, как ты обновляешь БД? Через DataAdapter или вручную?


А вот до этого я еще не дошёл... Предполагаю через DataAdapter, а что?
PM MAIL   Вверх
kaa
Дата 3.1.2006, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 817
Регистрация: 5.11.2005

Репутация: нет
Всего: 2



Дрон
Код

ds.Tables["trunk"].Columns["KEY"].AutoIncrement = true;
ds.Tables["trunk"].Columns["KEY"].AutoIncrementStep = 1;
ds.Tables["trunk"].Columns["KEY"].AutoIncrementSeed = 1;



Фигу! У меня в таблице уже есть значение поля KEY=1, так эта гадость такое же значение ставит не стесняясь smile .А когда я добавляю уникальность (её оказывается он тоже не переносит из базы данных):

Код

ds.Tables["trunk"].Columns["KEY"].Unique=true;


Вылезает трабл в виде исключения - типа усё! Типа такое значение (1) уже есть! smile

И какое же начальное значение мне задавать?

Да что за хрень-то, а??????????????????????????????????smile

PM MAIL   Вверх
Дрон
Дата 3.1.2006, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 5
Всего: 93



kaa
Пожалуйста меньше эмоций, мы же серьёзные люди smile
Если руки растут не совсем оттуда, то зачем же ругаться на такую удобнейшую систему как .NET.

Что ж. Теперь попробую объяснить тот подход, который использую я.

Во-первых, я был не совсем прав насчёт того, что значения автоинкремента надо ставить такими же как и базе. Но об этом позже.

А для начала рассмотрим как раз финальный этап -- обновление БД.

Я думаю, что большинство БД (ты вроде используешь Access?) не дадут вручную записать произвольное значение в поле с автоинкрементом. Тем самым и тебе в твоей программе в простейшем случае вообще не надо трогать это поле. При добавлении новых записей в таблицу сама БД будет генерировать нужные значения.

В более сложном случае общим подходом (вроде рекомендованным майкрософт) является установка значения AutoIncrementSeed = -1, AutoIncrementStep = -1. Тогда те поля, которые добавлены в таблицу, но ещё не сохранены в БД будут иметь ОТРИЦАТЕЛЬНЫЕ ключи, которые не пересекутся с уже существующими.

А когда ты будешь обновлять через DataAdapter -- он заменит их на реальные, которые сгенерирует база данных (при работе вручную тебе нужно будет вручную их обновлять -- и это для Access немного напряжно).

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

Если что-то не ясно, то могу попробовать объяснить подробнее и с примерами.


--------------------
Да. Именно так.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0600 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.