|
|
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
Возникла интересная ситуация. MS SQL Server. В базе имеются процедуры, которые работают с временными таблицами. Эти процедуры вызываются из триггера на обновление таблицы с данными. На клиенте при старте приложения создаю временные таблицы через CREATE TABLE #TMP... Затем делаю изменения в таблице с данными. Вызываю tableadapter.Update(...) таблицы с данными в которой триггер на обновление использует процедуры, работающие с временными таблицами. Получаю exeption от базы, что временной таблицы не существует. Что за беда. Строка соединения у адаптера и SQLCommand на создание таблиц одна и та же (из конфига приложения). Какие у кого будут мысли. Что я делаю не так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2008, 22:29 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
пулинг соединений? опробовать отключить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2008, 22:42 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
Pooling отключал. Не помогло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 00:04 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
Методом научного тыка дошел до следующего. При загрузке приложения врем. таблицы однозначно создаются. Затем происходит первое обращение к данным tableadapter.Fill(...). И все, временные таблицы как ветром сдуло. Не пойму, куда дальше копать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 01:25 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
Вот и решилась проблема. Если кому интересно, то для правильной работы с локальными временными таблицами в свойствах соединения должны быть указаны следующие параметры: Pooling=True; Connection Reset=False ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 01:43 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
savolvВот и решилась проблема. Если кому интересно, то для правильной работы с локальными временными таблицами в свойствах соединения должны быть указаны следующие параметры: Pooling=True; Connection Reset=False Грабли готовы... и ждут своих героев. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 09:23 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
buser Грабли готовы... и ждут своих героев. Назвался груздем, полезай в кузовок. Поподробнее про грабли, если нетрудно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 13:14 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
в смысле адаптер закрывает коннект.и поэтому таблицы сдувает. может у адаптера есть настройка не закрыавть коннект после метода fill? ведь времянка привязана к spid. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 13:22 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
AlexeiKв смысле адаптер закрывает коннект.и поэтому таблицы сдувает. может у адаптера есть настройка не закрыавть коннект после метода fill? ведь времянка привязана к spid. Самое интересное что коннект сбрасывается до запроса на выборку в Fill адаптера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 13:26 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
Connection Reset=False просто вот это ,может закосячить все работу ado.net. так как если работа ведется с несколькими базами ,через один коннект,то может замутиться каша. так как database context не будет сброшен. ну у вас видимо все проще.так что опасаться не стоит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 13:28 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
savolv AlexeiKв смысле адаптер закрывает коннект.и поэтому таблицы сдувает. может у адаптера есть настройка не закрыавть коннект после метода fill? ведь времянка привязана к spid. Самое интересное что коннект сбрасывается до запроса на выборку в Fill адаптера. значит код пишите так :) чудес то не бывает. вы код покажите уже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 13:29 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
В профайлере это выглядит примерно так: exec sp_reset_connection Выполнение запроса на создание локальных таблиц (ExceNonQuery) ... ... ... exec sp_reset_connection Запрос для первого метода Fill... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 13:32 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
так,вы каким кодом то создаете времянки? такое ощущение что вы постоянно делаете новый sqlconnection объект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 13:35 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
AlexeiK значит код пишите так :) чудес то не бывает. вы код покажите уже. Код просто банален. В Load формы SQLCommand.ExecuteNonQuery() с текстом CREATE TABLE #... По кнопке заполням адаптер из таблицы данных базы. И вот здесь локальных таблиц уже нет при Connection Reset=True. При Connection Reset=False все нормально. Строка подключения у всех одна, берется из config приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 13:43 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
AlexeiKтак,вы каким кодом то создаете времянки? такое ощущение что вы постоянно делаете новый sqlconnection объект. Я пользуюсь типизированным Dataset и все sqlconnection создаются самими адаптерами. Но если мне не изменяет память система пулинга должна следить затем, чтобы реально было одно соединение с базой для идентичных строк подключения в приложении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 13:48 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
ну ,короче хорошо то,что вы не работаете с разными базами данных внутри приложения. как только... так сразу вспомните про Connection Reset. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 13:57 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
Примерный код в Load формы Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код вызываемый по кнопке Код: plaintext 1. 2. Помоему ничего особенного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 14:01 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
В предыдущем посте правильнее вот так (все лишнее удалил) Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 14:04 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
Вопрос остался чисто теоретический. Почему все-таки сбрасывается соединение перед вызовом Fill адаптера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 14:07 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
потому что никто не обязан гарантировать что что-то там должно подбирать один и тот же коннект, кроме того ещё и работающий. Вообще это плохая практика, надеяться на такой случай ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 17:35 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
зыпотому что никто не обязан гарантировать что что-то там должно подбирать один и тот же коннект, кроме того ещё и работающий. Вообще это плохая практика, надеяться на такой случай А как же тогда использовать локальные таблицы??? Их смысл с том, что они создаются только для текущего соединения текущего пользователя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 18:06 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
savolv зыпотому что никто не обязан гарантировать что что-то там должно подбирать один и тот же коннект, кроме того ещё и работающий. Вообще это плохая практика, надеяться на такой случай А как же тогда использовать локальные таблицы??? Их смысл с том, что они создаются только для текущего соединения текущего пользователя. адаптер позволяет указать для себя не только строку подключения, но и уже готовый открытый коннект. вот и используйте эту возможность, как раз ваш случай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 23:34 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
savolv зыпотому что никто не обязан гарантировать что что-то там должно подбирать один и тот же коннект, кроме того ещё и работающий. Вообще это плохая практика, надеяться на такой случай А как же тогда использовать локальные таблицы??? Их смысл с том, что они создаются только для текущего соединения текущего пользователя. нафига они вообще тебе нужны? они на то и временные, что существуют только в определенном scope, а держать в них данные между запросами - это глупость и рано или поздно перестанет работать 100%. Времянки надо создать, воспользоваться и сразу удалить. Все остальное это уже обычные таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2008, 12:37 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
Артем1 адаптер позволяет указать для себя не только строку подключения, но и уже готовый открытый коннект. вот и используйте эту возможность, как раз ваш случай. Я думал об этом. Но ведь соединение с базой и так должно быть одно (pooling). Весь вопрос, откуда берется второе, если строка подключения у всех адаптеров одна и та же. Где может быть косяк не пойму. Может быть в недрах сборок Framework и можно найти ответ, но просто нет на это времени и желания. Факт остался фактом. При создании соединения руками и адаптерами, созданными студией строки подключения чем-то отличаются из-за чего реально образуются два соединения с сервером. Хотя и в том и другом случае строка соединения берется из глобальных настроек приложения. Всем спасибо за участие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2008, 17:55 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
да блииин, ещё раз говорю - пулинг не означает что у тебя будет одно одинаковое на всех соединение. Новые соединения могут создаваться в любой момент по запросу, а старые закрываться, и тебя это не должно волновать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2008, 18:42 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
savolvА как же тогда использовать локальные таблицы??? Их смысл с том, что они создаются только для текущего соединения текущего пользователя. Временные таблицы выносить за пределы сервера есть зло. Не для этого они предназначены. Как вариант - пересматривайте логику (лучший вариант), что бы клиент не общался с таблицами вообще (и с временными в том числе). Или делайте костыли - постоянную таблицу + view (для разделения данных пользователей) + табличную функцию над ней для разделения данных пользователя (если используете более одного логического соединения). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2008, 19:58 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
Roman S. GolubinВременные таблицы выносить за пределы сервера есть зло. +1 я вообще не понимаю, что автор сам создает себе проблемы, временные таблицы пусть будут на серваке, они там никому не мешают, а вам проблем меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 08:55 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
Ладно поясню задачу. Делаю конвертор по переброске данных из одной базы (не MS SQL) в другую (MS SQL). В новой базе (сторонних производителей) логика крутится вокруг локальных таблиц. В приложении на Delphi с этим нет вообще никаких проблем. Я пишу приложение-конвертор на .NET. И вот у меня есть проблемы. Я не в силах менять никакой логики работы базы. Я лишь хочу чтобы мой конвертор нормально работал с учетом того, что на сервере процедуры используют локальные таблицы. По существу кто-нибудь может что-нибудь сказать по вопросу появления двух соединений с базой при наличии только одной строки подключения. Ведь если есть прецедент, то почему, например не возникнет ситуации, когда мое приложение будет самопроизвольно плодить не два, а сто соединений? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 12:31 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
Очень жаль что Вы не хотите ничего почитать про то, как работает пул соединений... Покажите код (естесно без лишнего фарша) кторый приводит к появлению ещё одного соединения... И ещё... просто моё мнение - строить трансфер так, как это делаете Вы не эффективно... нак Вам логика этих производителей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 12:43 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
buserОчень жаль что Вы не хотите ничего почитать про то, как работает пул соединений... Покажите код (естесно без лишнего фарша) кторый приводит к появлению ещё одного соединения... И ещё... просто моё мнение - строить трансфер так, как это делаете Вы не эффективно... нак Вам логика этих производителей? Логика производителей мне как раз таки и нужна. Допустим есть процедура которая заполняет основную таблицу в базе и пяток дополниельных. Причем в каждой из этих таблиц есть триггеры с процедурами увязанными на локальные таблицы. Так вот в этих процедурах много различных условий и проверок, которые уже реализованы разработчиками базы. Почему я не должен использовать эту логику? Это в разы упрощает мою задачу. Этот код я уже приводил выше Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 12:51 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
Т.е. Вы хотите сказать что у Вас между conn.Open(); и conn.Close(); создаютсяновые сессии? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 13:04 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
buserТ.е. Вы хотите сказать что у Вас между conn.Open(); и conn.Close(); создаютсяновые сессии? Нет. Я хочу сказать что здесь создаются локальные таблицы Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: plaintext 1. 2. В несколько измененном коде, если не делать conn.Close() реально висят два соединения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 13:14 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
В этих соединениях через профайлер замечен разный SPID. Еще раз напомню, что строка подключения в приложении ОДНА. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 13:22 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
хз... может... Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 13:37 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
buserхз... может... Код: plaintext Не помогает. Помогает только ConnectionReset=false. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 13:48 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
savolvПомогает только ConnectionReset=false. Вам помочь может только изменение логики работы с "таким" сервером. Пишите всю обработку на SQL и пускайте все что касается временнчх таблиц в одном батче: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 14:00 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
Да, и еще - не забудьте надавать разработчикам серверной части линейкой по граблям! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 14:02 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
Roman S. GolubinДа, и еще - не забудьте надавать разработчикам серверной части линейкой по граблям! +1 Но все таки интересно почему два соединения от клиента, хотя по логике, как ни крути должно быть одно. Пул для того он и пул, чтобы не выдавать лишние соединения если строка подключения одна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 14:07 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
savolvПул для того он и пул, чтобы не выдавать лишние соединения если строка подключения одна. В пуле есть собственные процессы. Часть из них, при нагрузке, или недофетченном курсоре, например, может быть отложена "на потом", и вместо освобождения текущего соединения пул легко может выдать новое. Именно для этих целей, в том числе, пул и предназначен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 14:18 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
Roman S. Golubin В пуле есть собственные процессы. Часть из них, при нагрузке, или недофетченном курсоре, например, может быть отложена "на потом", и вместо освобождения текущего соединения пул легко может выдать новое. Именно для этих целей, в том числе, пул и предназначен. Все ясно. Значит постулат "единая строка подключения -> одно соединение" не верен. Хотя в литературе я обратного утверждения нигде не встречал. Возможно мало читал по этому поводу. Применительно к моему случаю все равно непонятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 14:35 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
savolvВсе ясно. Значит постулат "единая строка подключения -> одно соединение" не верен. Зависит от того, что Вы считаете "одним соединением". Логическое соединение - да. Физическое - как придется, иначе зачем тогда вообще пул нужен? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 14:38 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
savolvПрименительно к моему случаю все равно непонятно. Что не понятно? Аналогия с пистолетом. Стреляете из одного пистолета, патроны одни и те же, но вместо того, что бы перезаряжать каждый раз одну и ту же обойму, когда патроны в ней закончились (или заклинило, или еще что нибудь), Вы достаете другую и продолжаете стрелять дальше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 14:42 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
Roman S. Golubin savolvПрименительно к моему случаю все равно непонятно. Что не понятно? Аналогия с пистолетом. Стреляете из одного пистолета, патроны одни и те же, но вместо того, что бы перезаряжать каждый раз одну и ту же обойму, когда патроны в ней закончились (или заклинило, или еще что нибудь), Вы достаете другую и продолжаете стрелять дальше. Как раз и непонятно где у меня заклинило или патроны кончились, что потребовалось новую обойму вставлять :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 14:47 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
savolvКак раз и непонятно где у меня заклинило или патроны кончились, что потребовалось новую обойму вставлять :) Думаю, в Вашем случае проблема в том, что Вы пытаетесь повторно использовать один и тот же объект SqlCommand - создайте отдельный для каждого запроса, не забывайте использовать Command.Dispose, что бы команда "отпустила" соединение. Хотя, я не уверен, возможно, именно в этот момент может происходить "смена обоймы", точно так же, как и при изменении Command.CommandText. Рефлектором. конечно, можно посмотреть, что там происходит, но не факт, что завтра логику не сменят и не придется все переписывать. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 15:10 |
|
||
|
Временные таблицы и ADO.NET
|
|||
|---|---|---|---|
|
#18+
Roman S. Golubin Думаю, в Вашем случае проблема в том, что Вы пытаетесь повторно использовать один и тот же объект SqlCommand - создайте отдельный для каждого запроса, не забывайте использовать Command.Dispose, что бы команда "отпустила" соединение. Хотя, я не уверен, возможно, именно в этот момент может происходить "смена обоймы", точно так же, как и при изменении Command.CommandText. Рефлектором. конечно, можно посмотреть, что там происходит, но не факт, что завтра логику не сменят и не придется все переписывать. :) Попробовал. Не помогло :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 15:29 |
|
||
|
|

start [/forum/topic.php?all=1&fid=17&tid=1352253]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
74ms |
get topic data: |
11ms |
get forum data: |
4ms |
get page messages: |
79ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 437ms |

| 0 / 0 |
