Здравствуйте, Andrbig, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
A>>>То что данные могут по разному считываться и сохраняться — здорово, но к вопросу отношения не имеет. Вопрос — зачем хранить данные на сервере приложений? Клиент стартовал — запрос на сервер приложений — тот выполнил запрос на базу — получил 100 записей — сунул их в типизированный датасет — отдал клиенту.
А>>отдал клиенту и очистил датасет?
A>Да. Просто не храни ссылки на датасет и мусорщик его уберет.
А>>а если клиент сохраняет новую запись с автоинкрементным полем тогда как быть? А>>использовать свое значение локальное автоинкремента он не может А>>на моем серверной части датасет пуст а сохранять сразу в sql serverenую бд надо прописывать insert команду для каждой таблицы...
A>Не очень понял в чем именно проблема. Записывается новая запись, есть автоинкремент — это понятно. Что непонятно? Как получить значение вставленной записи? Использовать ли автоинкремент или генерить самому? Как получить какие ID соответствуют при нескольких строками на запись?
спрошу проще
как в такой случае добавить запись в sql serverную БД ? (в таблице куда надо добавить есть автоинкремент
Здравствуйте, Аноним, Вы писали:
А>спрошу проще А>как в такой случае добавить запись в sql serverную БД ? (в таблице куда надо добавить есть автоинкремент
Добавить проблем нет — добавляешь в датасет, потом адаптер при Update вызывает команду на добавление. Это то что ты хотел услышать или я тебя не понял?
Re[16]: Sql и работа с данными
От:
Аноним
Дата:
05.10.05 14:36
Оценка:
Здравствуйте, Andrbig, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>спрошу проще А>>как в такой случае добавить запись в sql serverную БД ? (в таблице куда надо добавить есть автоинкремент
A>Добавить проблем нет — добавляешь в датасет, потом адаптер при Update вызывает команду на добавление. Это то что ты хотел услышать или я тебя не понял?
ну я потихоньку подвожу к проблеме
при добавлении в датасет с каким индексом она добавиться (новая строка)
Здравствуйте, Аноним, Вы писали:
А>ну я потихоньку подвожу к проблеме
А>при добавлении в датасет с каким индексом она добавиться (новая строка)
Есть два варианта нормального решения вопроса вставки новых строк:
1. автоинкремент Плюсы: нумерация без пропусков, простота вставки Минусы: сложность получения ID вставленных строк (если их несколько), невозможность сброса нумерации даже при пустой базе
2. генерация ID на сервере, вставка с клиента Плюсы: клиент знает ID вставляемых строк до того, как они попадут в базу (это полезно если есть связанные строки — прописать FK), можно сбросить нумерацию (да и вообще над нумерацией полный контроль) Минусы: возможность образования дыр в нумерации (номер взяли, запись обломилась по каким-то причинам. Впрочем, благодаря контролю над нумерацией это можно решить, если очень мешает )
От того, какое у тебя решение, зависит с каким ID встанет новая строка.
Re[18]: Sql и работа с данными
От:
Аноним
Дата:
06.10.05 06:28
Оценка:
Здравствуйте, Andrbig, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>ну я потихоньку подвожу к проблеме
A>
А>>при добавлении в датасет с каким индексом она добавиться (новая строка)
A>Есть два варианта нормального решения вопроса вставки новых строк:
A>1. автоинкремент A>Плюсы: нумерация без пропусков, простота вставки A>Минусы: сложность получения ID вставленных строк (если их несколько), невозможность сброса нумерации даже при пустой базе
A>2. генерация ID на сервере, вставка с клиента A>Плюсы: клиент знает ID вставляемых строк до того, как они попадут в базу (это полезно если есть связанные строки — прописать FK), можно сбросить нумерацию (да и вообще над нумерацией полный контроль) A>Минусы: возможность образования дыр в нумерации (номер взяли, запись обломилась по каким-то причинам. Впрочем, благодаря контролю над нумерацией это можно решить, если очень мешает )
A>От того, какое у тебя решение, зависит с каким ID встанет новая строка.
второй вариант мне больше нравиться как более правильный, если ты имел ввиду получения следующего id из sql servera, дыр не будет потому что id мы можем получать непосредстевенно перед вставкой, то есть когда строка полностью сформирована, получаем id (get_insert_id, вроде так) и выполняем insert, а вот про первый способ я хотел спросить:
какой именно автоинкремент ты имел ввиду (на моем сервере, sqlservere ...) и если на sql server то как можно сделать инсерт новой строки в sql serverную БД не указывая id?
Здравствуйте, Аноним, Вы писали:
А>второй вариант мне больше нравиться как более правильный, если ты имел ввиду получения следующего id из sql servera, дыр не будет потому что id мы можем получать непосредстевенно перед вставкой, то есть когда строка полностью сформирована, получаем id (get_insert_id, вроде так) и выполняем insert,
Да, генерация из sql-сервера. Если таблиц несколько, то вариантов снова два:
1. на каждую таблицу своя таблица со счетчиком Плюсы: все можно делать в одной транзакции — и получение ID, и вставку Минусы: много таблиц
2. все счетчики сидят в одной таблице (название, последний ID) Плюсы: не надо иметь кучу таблиц, можно сделать одну ХП для получения ID и она подойдет ко всем таблицам Минусы: работу с этой таблицей надо выполнять в отдельной транзакции, чтобы вставки в разные таблицы не мешали друг другу (пересекаясь на генерации ID), и как следствие этого — возможность образования дыр
А>а вот про первый способ я хотел спросить:
А>какой именно автоинкремент ты имел ввиду (на моем сервере, sqlservere ...) и если на sql server то как можно сделать инсерт новой строки в sql serverную БД не указывая id?
Да, автоинкремент как свойство колонки таблицы на sql сервере. Собственно, другого автоинкремента я не знаю.
А в чем проблема с инсертом? Почему собственно нельзя написать оператор инсерт, просто не указав там поля ID?
Re[20]: Sql и работа с данными
От:
Аноним
Дата:
06.10.05 07:43
Оценка:
Здравствуйте, Andrbig, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>второй вариант мне больше нравиться как более правильный, если ты имел ввиду получения следующего id из sql servera, дыр не будет потому что id мы можем получать непосредстевенно перед вставкой, то есть когда строка полностью сформирована, получаем id (get_insert_id, вроде так) и выполняем insert,
A>Да, генерация из sql-сервера. Если таблиц несколько, то вариантов снова два:
A>1. на каждую таблицу своя таблица со счетчиком A>Плюсы: все можно делать в одной транзакции — и получение ID, и вставку A>Минусы: много таблиц
A>2. все счетчики сидят в одной таблице (название, последний ID) A>Плюсы: не надо иметь кучу таблиц, можно сделать одну ХП для получения ID и она подойдет ко всем таблицам A>Минусы: работу с этой таблицей надо выполнять в отдельной транзакции, чтобы вставки в разные таблицы не мешали друг другу (пересекаясь на генерации ID), и как следствие этого — возможность образования дыр
А>>а вот про первый способ я хотел спросить:
А>>какой именно автоинкремент ты имел ввиду (на моем сервере, sqlservere ...) и если на sql server то как можно сделать инсерт новой строки в sql serverную БД не указывая id?
A>Да, автоинкремент как свойство колонки таблицы на sql сервере. Собственно, другого автоинкремента я не знаю.
а как же автоинкремент таблицы типизированного dataseta?
A>А в чем проблема с инсертом? Почему собственно нельзя написать оператор инсерт, просто не указав там поля ID?
да потому что таблиц аж 25
может это и немного но писать почти для каждой insert =((
а commandbuilder сделает все за меня и можно смело вызывать update
Здравствуйте, Аноним, Вы писали:
А>а как же автоинкремент таблицы типизированного dataseta?
От генерации ID на клиенте до катастрофы — один шаг. Никому не посоветую так делать.
A>>А в чем проблема с инсертом? Почему собственно нельзя написать оператор инсерт, просто не указав там поля ID?
А>да потому что таблиц аж 25 А>может это и немного но писать почти для каждой insert =(( А>а commandbuilder сделает все за меня и можно смело вызывать update
Я попробовал — он правильно сгенерил инсерт (не указал автоинкремент). Однако он обломился с update — говорит Select command не вернул ни одного ключевого поля. Похоже, тут надо разбираться.
Лично я написал бы свой commandbuilder, подходящий под все требования конкретной задачи.
Re[22]: Sql и работа с данными
От:
Аноним
Дата:
06.10.05 08:24
Оценка:
Здравствуйте, Andrbig, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>а как же автоинкремент таблицы типизированного dataseta?
A>От генерации ID на клиенте до катастрофы — один шаг. Никому не посоветую так делать.
A>>>А в чем проблема с инсертом? Почему собственно нельзя написать оператор инсерт, просто не указав там поля ID?
А>>да потому что таблиц аж 25 А>>может это и немного но писать почти для каждой insert =(( А>>а commandbuilder сделает все за меня и можно смело вызывать update
A>Я попробовал — он правильно сгенерил инсерт (не указал автоинкремент). Однако он обломился с update — говорит Select command не вернул ни одного ключевого поля. Похоже, тут надо разбираться.
A>Лично я написал бы свой commandbuilder, подходящий под все требования конкретной задачи.
The SelectCommand must also return at least one primary key or unique column. If none are present, an InvalidOperation exception is generated, and the commands are not generated.
это про sqlcommandbuilder
то есть
dataadapter.select(select * from customers, conn);
//в кастомерс обязано быть ключевое поле
//и если оно есть то можно создавать cb
sqlcommandbuilder cb = new sqlcommanbuilder(dataadapter);
тут он генерит для dataadapter insert, update, delete
так вот у меня есть dataTable
dataadapter.Fill(dataTable);
сча у этой таблицы есть автоинкрементное поле
как теперь ты предлагаешь добавить запись?
(что бы можно быловоспользоваться dataadapter.Update(dataTable))
Здравствуйте, Аноним, Вы писали:
А>сча у этой таблицы есть автоинкрементное поле А>как теперь ты предлагаешь добавить запись? А>(что бы можно быловоспользоваться dataadapter.Update(dataTable))
С update проблем нет, вопросы только с insert.
Я попробовал, если поле на sql сделать ключом и автоинкрементом, то все команды генерятся нормально — insert, update, delete. Слушай, если ты так плотно пользуешь commadbuilder, скажи как сделать так, чтобы он в delete и в update включал в условия только ключевые поля, а не все, как он делает сейчас?
Что до твоего вопроса, я бы вероятнее всего отказался от автоинкремента. Мне больше нравится иметь второй вариант. Кстати, именно его ты и пользуешь, только генеришь pk на клиенте, с чем я не согласен.
Re[24]: Sql и работа с данными
От:
Аноним
Дата:
06.10.05 09:57
Оценка:
Здравствуйте, Andrbig, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>сча у этой таблицы есть автоинкрементное поле А>>как теперь ты предлагаешь добавить запись? А>>(что бы можно быловоспользоваться dataadapter.Update(dataTable))
A>С update проблем нет, вопросы только с insert.
при существующем commandbuildere
dataAdapter.Update выполняет не только ведь update
он изменяет в sql бд все переданные методу строки которые помечены как unchaged
A>Я попробовал, если поле на sql сделать ключом и автоинкрементом, то все команды генерятся нормально — insert, update, delete. Слушай, если ты так плотно пользуешь commadbuilder, скажи как сделать так, чтобы он в delete и в update включал в условия только ключевые поля, а не все, как он делает сейчас?
updatecommand and deletecommand and insertcommand commandbuilder генерит в соответствии от команды select переданной dataadapteru на основании которого (dataadaptera)и делается commandbuilder
а дальше можно попробывать вручную изменить updatecommand and deletecommand and insertcommand у dataadaptera
или я не правильно понял вопрос?
A>Что до твоего вопроса, я бы вероятнее всего отказался от автоинкремента. Мне больше нравится иметь второй вариант. Кстати, именно его ты и пользуешь, только генеришь pk на клиенте, с чем я не согласен.
я не генерю id на клиенте...(если ты не имеешь ввиду мой remoting server)
с клиента я лишь передаю данные на сервер (грубо говоря hashtable где ключи имена полей таблицынуи значения их соответственно а по ним могу сформировать строку и вот тут делема как?
все твои ответы мення вели в заблуждение не мог бы ты подробнее начиная с момента получения сервером информации о заказе перед непосредственным добавлением, где надо убирать автоинкремент, чем обновлять и тд
Re[25]: Sql и работа с данными
От:
Аноним
Дата:
06.10.05 10:00
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Andrbig, Вы писали:
A>>Здравствуйте, Аноним, Вы писали:
А>>>сча у этой таблицы есть автоинкрементное поле А>>>как теперь ты предлагаешь добавить запись? А>>>(что бы можно быловоспользоваться dataadapter.Update(dataTable))
A>>С update проблем нет, вопросы только с insert.
А>при существующем commandbuildere А>dataAdapter.Update выполняет не только ведь update А>он изменяет в sql бд все переданные методу строки которые не помечены как unchaged
У меня таблица с полями: pk (key, increment), f1, f2. Вот какой update сделал commandbuilder:
UPDATE ab SET f1 = @p1 , f2 = @p2 WHERE ( (pk = @p3) AND ((@p4 = 1 AND f1 IS NULL) OR (f1 = @p5)) AND ((@p6 = 1 AND f2 IS NULL) OR (f2 = @p7)) )
Вопрос: можно ли сделать так, чтобы commandbuilder выдал:
UPDATE ab SET f1 = @p1 , f2 = @p2 WHERE pk = @p3
Меня не устраивал его код. Кроме того, для формирования своего кода он выполняет запрос на сервер — за схемой! Вот поэтому я отказался от commandbuilder-a. У меня не было динамических таблиц, все фиксированное и ходить за неизменной схемой было незачем.
А>я не генерю id на клиенте...(если ты не имеешь ввиду мой remoting server)
Речь идет про sql сервер. Клиентом для него является твой ремотинг-сервер — я про него говорю.
А>все твои ответы мення вели в заблуждение не мог бы ты подробнее начиная с момента получения сервером информации о заказе перед непосредственным добавлением, где надо убирать автоинкремент, чем обновлять и тд
Чтобы говорить подробнее, надо знать подробнее:
1. клиент (твой ремотинг-сервис) добавляет строки в базу (в таблицу sql то бишь). Надо ли ему знать id вставленных строк и зачем?
2. к таблице, которая содержит новые строки (еще на записанным) есть подчиненные таблицы (master-detail)?
Re[26]: Sql и работа с данными
От:
Аноним
Дата:
06.10.05 12:01
Оценка:
A>Чтобы говорить подробнее, надо знать подробнее: A>1. клиент (твой ремотинг-сервис) добавляет строки в базу (в таблицу sql то бишь). Надо ли ему знать id вставленных строк и зачем?
надо что бы потом разослать всем клиентам регистрирующим вызовы эту строку с правильным id
A>2. к таблице, которая содержит новые строки (еще на записанным) есть подчиненные таблицы (master-detail)?
нет, таблица польностью без всяких связей и ограничений
Здравствуйте, Аноним, Вы писали:
A>>Чтобы говорить подробнее, надо знать подробнее: A>>1. клиент (твой ремотинг-сервис) добавляет строки в базу (в таблицу sql то бишь). Надо ли ему знать id вставленных строк и зачем?
А>надо что бы потом разослать всем клиентам регистрирующим вызовы эту строку с правильным id
A>>2. к таблице, которая содержит новые строки (еще на записанным) есть подчиненные таблицы (master-detail)?
А>нет, таблица польностью без всяких связей и ограничений
В твоем случае самым простым решением будет автоинкрементный ключ. Открываешь connection, стартуешь транзакцию, находишь максимальный ID (select max(id) from xxx), далее делаешь DataAdapter.Update, потом делаешь select * where ID > того максимального, транзакцию комитишь.
Все, записи у тебя есть, рассылаешь.
Re[28]: Sql и работа с данными
От:
Аноним
Дата:
06.10.05 13:15
Оценка:
Здравствуйте, Andrbig, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
A>>>Чтобы говорить подробнее, надо знать подробнее: A>>>1. клиент (твой ремотинг-сервис) добавляет строки в базу (в таблицу sql то бишь). Надо ли ему знать id вставленных строк и зачем?
А>>надо что бы потом разослать всем клиентам регистрирующим вызовы эту строку с правильным id
A>>>2. к таблице, которая содержит новые строки (еще на записанным) есть подчиненные таблицы (master-detail)?
А>>нет, таблица польностью без всяких связей и ограничений
A>В твоем случае самым простым решением будет автоинкрементный ключ. Открываешь connection, стартуешь транзакцию, находишь максимальный ID (select max(id) from xxx), далее делаешь DataAdapter.Update,
почему update?мне же надо строку вставить...
или ты предлагаешь просто добавлять строку в таблицу и потом вызывать
da.Update c самописным insertcommandom? (гдене надо учитывать id)
а как ты предлагаешь adapter делать?
прописывать сови insert, update, remove commands?
брррррр.... опять запутался
A> потом делаешь select * where ID > того максимального, транзакцию комитишь.
A>Все, записи у тебя есть, рассылаешь.
Здравствуйте, Аноним, Вы писали:
А>брррррр.... опять запутался
Да, действительно запутался. Итак, по порядку.
1. есть база с таблицей, в которой ключевое поле является автоинкрементным
2. на эту таблицу делаешь адаптер, у которого SelectCommand такой: select * from xxx
3. вызываешь commanbuilder с этим адаптером, он генерит три остальные команды. При этом он понимает что поле автоинкрементное и не вклчюет его в update и insert
4. присваиваешь полученные команды в адаптер. Ура! Адаптер готов к работе.
Теперь приходят записи с твоего клиента на ремотинг сервис, где происходит следующее:
1. создаешь пустой датасет
2. добавленные записи у клиента добавляешь в таблицу в датасете
3. открываешь connection, стартуешь транзакцию
4. выполняешь в этой транзакции selct max(id) from xxx, запоминаешь полученное число как N
5. вызываешь DataAdapter.Update
6. выполняешь select * from xxx where id > N
7. комитишь транзакцию
8. полученное на шаге 6 рассылаешь клиентам
С insert-ом стало понятней, идем дальше?
Re[30]: Sql и работа с данными
От:
Аноним
Дата:
06.10.05 14:11
Оценка:
Здравствуйте, Andrbig, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>брррррр.... опять запутался
A>Да, действительно запутался. Итак, по порядку.
A>1. есть база с таблицей, в которой ключевое поле является автоинкрементным A>2. на эту таблицу делаешь адаптер, у которого SelectCommand такой: select * from xxx A>3. вызываешь commanbuilder с этим адаптером, он генерит три остальные команды. При этом он понимает что поле автоинкрементное и не вклчюет его в update и insert A>4. присваиваешь полученные команды в адаптер. Ура! Адаптер готов к работе.
A>Теперь приходят записи с твоего клиента на ремотинг сервис, где происходит следующее:
A>1. создаешь пустой датасет A>2. добавленные записи у клиента добавляешь в таблицу в датасете A>3. открываешь connection, стартуешь транзакцию A>4. выполняешь в этой транзакции selct max(id) from xxx, запоминаешь полученное число как N A>5. вызываешь DataAdapter.Update A>6. выполняешь select * from xxx where id > N A>7. комитишь транзакцию A>8. полученное на шаге 6 рассылаешь клиентам
A>С insert-ом стало понятней, идем дальше?
да, только я думал что комманды присваивать не надо
во всех примерах в msdn просто создается SqlCommandBuilder cb = new SqlCommandBuilder(da);
и сё...
кстати для вставкин надо искать не max(id) а `Id`=last_insert_id() вот...
а так супер... все понял
идем дальше?
Здравствуйте, Аноним, Вы писали:
А>да, только я думал что комманды присваивать не надо А>во всех примерах в msdn просто создается SqlCommandBuilder cb = new SqlCommandBuilder(da); А>и сё...
Может просто создать SqlCommandBuilder будет достаточно. Я с SqlCommandBuilder не работаю, таких тонкостей не знаю. Проверь.
А>кстати для вставкин надо искать не max(id) а `Id`=last_insert_id() вот... А>а так супер... все понял А>идем дальше?
Нет, не идем. Теперь я уже не понял, что ты понял. Поясни почему надо искать "не max(id) а `Id`=last_insert_id()". max — агрегативная функция sql. Кто такой last_insert_id?
A>Нет, не идем. Теперь я уже не понял, что ты понял. Поясни почему надо искать "не max(id) а `Id`=last_insert_id()". max — агрегативная функция sql. Кто такой last_insert_id?
есть таблица с автоинкрементом на server sqlной БД
при добавлении туда записи генериться id но он != "max(id) from tableName"
можешь попробывать добавлять записи через какой нить sql манагер
например у тебя 10 записей
ты добавляешь новую у нее стал id = 11;
далее ты удалил 11-ую запись — у тебя снова стало 10 записей но если ты еще раз попытаешься вставить запись то её id будет не 11 а 12... то есть образуется пропуск (из-за удаленной записи)
то есть я сделаю инсерт у моей новой записи будет id 12 а незадолго до этого я получу max(id) = 10... хотя я смотрю ты тут предложил искать все записи что больше 10 тогда нормально я все равно получу 12
и еще update и delete генеряться commandbuilderom нормально а вот инсерт можно делать только по одной записи иначе будетпопыстка вставить 10 записей с один и тем же индексом... насчет последнего я понятно объяснил? просто это важный момент походу изза него у меня и проблемы