Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Ошибка / 22 сообщений из 22, страница 1 из 1
10.12.2015, 14:08
    #39124932
=Сергей=
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
помогите найти ошибку:
Код: c#
1.
2.
3.
4.
Cmd_B.CommandText = @"create table #test([id] int identity(1,1), [value] int)";
Cmd_B.ExecuteNonQuery;
Cmd_B.CommandText = "select [cmd] = count(*) from #test";
Int32 k = (Int32)Cmd_B.ExecuteScalar();


первый запрос исполняется без проблем, а вот во втором - ошибка: Invalid object name '#test'.
если убираешь # (не временная таблица, а постоянная) - всё работает.
в чем проблема?
...
Рейтинг: 0 / 0
10.12.2015, 14:10
    #39124938
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
в разных батчах потому что
...
Рейтинг: 0 / 0
10.12.2015, 14:14
    #39124944
=Сергей=
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
Konst_Oneв разных батчах потому что
Так ведь внутри ОДНОГО коннекта
...
Рейтинг: 0 / 0
10.12.2015, 14:16
    #39124948
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
=Сергей=Konst_Oneв разных батчах потому что
Так ведь внутри ОДНОГО коннекта
Connection один, а scope разный. Потому и вылетает ошибка.
...
Рейтинг: 0 / 0
10.12.2015, 14:17
    #39124950
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
=Сергей=Konst_Oneв разных батчах потому что
Так ведь внутри ОДНОГО коннекта
Проверь что это действительно так
Код: c#
1.
select @@SPID
...
Рейтинг: 0 / 0
10.12.2015, 14:22
    #39124959
=Сергей=
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
а вот если сделать так, то работает!!!
Код: c#
1.
2.
3.
4.
5.
6.
7.
using (SQLCommand Cmd = new SQLCommand("", Conn))
{
     Cmd.CommandText = @"create table #test([id] int identity(1,1), [value] int)";
     Cmd.ExecuteNonQuery;
     Cmd.CommandText = "select [cmd] = count(*) from #test";
     Int32 k = (Int32)Cmd.ExecuteScalar();
}
...
Рейтинг: 0 / 0
10.12.2015, 14:22
    #39124960
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
Axeleron=Сергей=пропущено...

Так ведь внутри ОДНОГО коннекта
Connection один, а scope разный. Потому и вылетает ошибка.
Ни причем тут scope. Это же #test а не @test
так не сработает
Код: sql
1.
2.
3.
declare @test table([id] int identity(1,1), [value] int)
go
select [cmd] = count(*) from @test


а так работает
Код: sql
1.
2.
3.
create table #test([id] int identity(1,1), [value] int)
go
select [cmd] = count(*) from #test
...
Рейтинг: 0 / 0
10.12.2015, 14:25
    #39124964
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
Dima TНи причем тут scope.
Активный scope как раз и причем.
...
Рейтинг: 0 / 0
10.12.2015, 14:41
    #39124976
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
AxeleronDima TНи причем тут scope.
Активный scope как раз и причем.
Это особенность чего? C#? Где почитать можно?

Пользую временные таблицы (#test) и ни разу с подобной проблемой не сталкивался. Работает стабильно пока соединение не рвется.
Из C# к MS SQL пока не пробовал цепляться, но в будущем актуально. Не хотелось бы на подобные грабли наступить.
...
Рейтинг: 0 / 0
10.12.2015, 14:46
    #39124983
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
используй ##test
такие таблицы будут распространяться на соединение
...
Рейтинг: 0 / 0
10.12.2015, 14:50
    #39124988
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
Shocker.Proиспользуй ##test
такие таблицы будут распространяться на соединениесорри, я наврал, такая таблица будет видна всем
...
Рейтинг: 0 / 0
10.12.2015, 14:56
    #39124999
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
Скорее всего ADO делает пулы коннектов внутри себя и может использовать разные коннекты по каким-то причинам. Я с таким сталкивался, когда работал с курсорами, как раз-таки временная таблица выпадала из области видимости.
Выполняй один запрос, зачем в данном случае его разбивать на два???
...
Рейтинг: 0 / 0
10.12.2015, 14:57
    #39125004
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
Dima TЭто особенность чего? C#? Где почитать можно?
тут
...
Рейтинг: 0 / 0
10.12.2015, 14:59
    #39125007
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
скорее всего ты производишь на этом коннекте еще какие-то операции, и если у тебя там остался незакрытый рекордсет, то при выполнении нового запроса коннекшн (внутри АДО) будет клонирован. А когда в варианте с using ты используешь отдельный коннект для этой пары операций, такого не происходит.
...
Рейтинг: 0 / 0
10.12.2015, 15:02
    #39125012
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
Shocker.Proскорее всего ты производишь на этом коннекте еще какие-то операции, и если у тебя там остался незакрытый рекордсет, то при выполнении нового запроса коннекшн (внутри АДО) будет клонирован. А когда в варианте с using ты используешь отдельный коннект для этой пары операций, такого не происходит.
Нет, на самом деле открытый один коннект не гарантирует одной области видимости при выполнении команд с временными таблицами.
...
Рейтинг: 0 / 0
10.12.2015, 15:06
    #39125020
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
Программное создание таблиц - ЗЛО
...
Рейтинг: 0 / 0
10.12.2015, 15:08
    #39125023
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
AxeleronDima TЭто особенность чего? C#? Где почитать можно?
тут
Если правильно понял @fparam1 у него теряется из-за scope.

Это объяснение правдоподобнее
Shocker.ProСкорее всего ADO делает пулы коннектов внутри себя и может использовать разные коннекты по каким-то причинам.
...
Рейтинг: 0 / 0
10.12.2015, 15:15
    #39125031
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
Dima T,
Конекшн в данном примере как бы и не закрывался... А вот если он закрыл и открыл бы его опять, то, да, конекше был бы взят из пула коннекций с другой областью видимости. Так что эта теория не объясняет проблемы.
...
Рейтинг: 0 / 0
10.12.2015, 15:18
    #39125035
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
AxeleronКонекшн в данном примере как бы и не закрывался...Коннекшн с точки зрения ADO (Connection) и коннекшн с точки зрения сервера (SPID) не обязательно эквивалентны.
...
Рейтинг: 0 / 0
10.12.2015, 15:21
    #39125040
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
Shocker.ProAxeleronКонекшн в данном примере как бы и не закрывался...Коннекшн с точки зрения ADO (Connection) и коннекшн с точки зрения сервера (SPID) не обязательно эквивалентны.
Я в принципе не очень-то и понял что именно ТС сделал, что у него заработало. Если стал использовать IDisposable SqlCommand'ы, то там никакой разницы, которая влияет на область видимости временной таблицы, быть не может.
...
Рейтинг: 0 / 0
10.12.2015, 15:24
    #39125044
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
AxeleronDima T,
Конекшн в данном примере как бы и не закрывался... А вот если он закрыл и открыл бы его опять, то, да, конекше был бы взят из пула коннекций с другой областью видимости. Так что эта теория не объясняет проблемы.
Временная таблица (#temp) видна только в одном коннекшене (в котором ее создали), соответственно если запрос к этой таблице будет через другой коннекшн то будет ошибка Invalid object name '#test' (Еще хуже если она там тоже будет но с другой инфой). При этом оба коннекшена остаются открыты. Тут тоже самое написано 18540875

Теперь понятно. Проблема именно в пуле. Просто не знал что создается пул соединений. Работаю из фокспро, там сколько явно создал - столько и пользуешь.
...
Рейтинг: 0 / 0
10.12.2015, 15:25
    #39125049
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка
AxeleronЯ в принципе не очень-то и понял что именно ТС сделал, что у него заработало. Если стал использовать IDisposable SqlCommand'ы, то там никакой разницы, которая влияет на область видимости временной таблицы, быть не может.Он выделил ОТДЕЛЬНЫЙ коннекшн под эти две операции. Так как других операций с этим коннекшеном не производилось, ADO использовал для него один и тот же SPID. А в первом примере, который наверняка приведен не полностью, ТС скорее всего делал еще какие-то манипуляции до или во время этих операций.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Ошибка / 22 сообщений из 22, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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