powered by simpleCommunicator - 2.0.33     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Вопрос по EF
15 сообщений из 15, страница 1 из 1
Вопрос по EF
    #39852478
denis_viktorovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток. Временами сталкиваюсь с непонятной проблемой, хотелось бы для себя прояснить, что не так.
Есть рабочая процедура в MS SQL Server, она возвращает рекордсет, пытаюсь в модели (вэб сайт, MVC 3) сделать новый ComplexType и возвращать его. При нажатии Get Column Information получаю сообщение, что выбранная процедура не возвращает столбцов.
Смотрю профайлером - упрощенно тестовый пример в процедуре сначала создается временная таблица, затем заполняется, затем итоговый селект. При обычном запуске все нормально, при нажатии в студии Get Column Information вижу, что выполнение create table не происходит, сразу делается попытка выполнить Insert с ошибкой "Invalid object name '#MyTempTable'." Если временно использовать табличную переменную или обычную таблицу - то все проходит. Куда копать, чтобы это обойти без костыля с табличной переменной?


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create procedure dbo.MyProcedureTest
as
begin
set nocount on

create table #MyTempTable(id int identity, name varchar(255))

insert into #MyTempTable(name) select 'hkjhkjhkj' 
insert into #MyTempTable(name) select 'ghghgfhg' 
insert into #MyTempTable(name) select 'fghfgtryt' 
insert into #MyTempTable(name) select 'yrtyhgfnb' 

select * from #MyTempTable

end
...
Рейтинг: 0 / 0
Вопрос по EF
    #39852488
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если попробовать select into #MyTempTable?
...
Рейтинг: 0 / 0
Вопрос по EF
    #39852492
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я подозреваю что разные запросы идут через разные соединения с MSSQL, в результате чего в одном соединении временная таблица создается, в другом читается, а ее там нет.
...
Рейтинг: 0 / 0
Вопрос по EF
    #39852494
denis_viktorovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Аналогично Create table, команды select * into #Temp в профайлере не вижу, зато вижу ошибку что "Invalid object name '#MyTempTable'.
...
Рейтинг: 0 / 0
Вопрос по EF
    #39852502
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Get Column Information - это какой-то мастер?
...
Рейтинг: 0 / 0
Вопрос по EF
    #39852505
denis_viktorovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Хм, так это же просто одна хранимая процедура. Если я запускаю ее под тем же юзером из менеджмент студии, то вижу в профайлере (фильтр по хосту) нормальный порядок команд в проце. А если щелкаю Get column information - то часть как бы выпадает. Можно конечно (как я и сделал) сначала сделать через табличные переменные, подключит (создать ComplexType), потом вернуть обратно времянки и все работает. НО до дого момента, как поменяется выходной набор и надо будет его обновить.
...
Рейтинг: 0 / 0
Вопрос по EF
    #39852511
denis_viktorovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
VS 2010, открываю мою модель, Model Browser, в function imports щелкаю дважды нужную процу.
...
Рейтинг: 0 / 0
Вопрос по EF
    #39852514
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_viktorovichDima T,

Хм, так это же просто одна хранимая процедура. Если я запускаю ее под тем же юзером из менеджмент студии, то вижу в профайлере (фильтр по хосту) нормальный порядок команд в проце. А если щелкаю Get column information - то часть как бы выпадает. Можно конечно (как я и сделал) сначала сделать через табличные переменные, подключит (создать ComplexType), потом вернуть обратно времянки и все работает. НО до дого момента, как поменяется выходной набор и надо будет его обновить.
Я может путаю, не пользуюсь EF. Но уже успел наступить на похожие грабли: в ADO.NET используется пул соединений к MS SQL, с одной стороны это хорошо, т.к. пока идет получение данных по одному запросу, другой уходит через следующее соединение. Но это делает невозможным использование временных таблиц (#table), т.к. эта таблица доступна только в пределах того соединения, в котором она создана.
Проверить просто, выполни там где создается таблица и там где читается
Код: c#
1.
SELECT @@SPID


Если вернет разное, то проблема в том что я выше описал.
...
Рейтинг: 0 / 0
Вопрос по EF
    #39852530
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

SPID можно просто посмотреть в профайлере.
Вопрос тут в том, почему процедура вдруг выполняется как пакет команд, а не как процедура.
И вопрос тут не к самому EF, а к мастеру Database First, насколько я понимаю.
...
Рейтинг: 0 / 0
Вопрос по EF
    #39852660
denis_viktorovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Выяснил, он перед вызовом делает SET FMTONLY ON;
И если брать с него пример, то получаем ошибку:

SET FMTONLY ON;
EXEC [dbo].[MyProcedureTest]
SET FMTONLY OFF;

Сообщение 208, уровень 16, состояние 0, процедура MyProcedureTest, строка 12
Invalid object name '#MyTempTable'.
...
Рейтинг: 0 / 0
Вопрос по EF
    #39852675
denis_viktorovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_viktorovich,

ну то есть SET FMTONLY OFF сразу после set nocount on спасает ситуацию.
З.Ы. Но зачем так сделано - непонятно и не помню, чтобы такое замечал в 2015 студии.
...
Рейтинг: 0 / 0
Вопрос по EF
    #39852692
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_viktorovichЗ.Ы. Но зачем так сделано - непонятно и не помню, чтобы такое замечал в 2015 студии.Что тут непонятного? Процедура может выполнять не только выборки, но и изменение данных. Это было бы сильно неожиданное поведение для того, кто "просто настраивал модель"
...
Рейтинг: 0 / 0
Вопрос по EF
    #39852824
denis_viktorovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Непонятно игнорирование времянок, хотя наверное смысл есть в этом.
...
Рейтинг: 0 / 0
Вопрос по EF
    #39852855
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Временная таблица - это просто таблица в БД temp
SET FMTONLY запрещает любые изменяющие действия, видимо.
...
Рейтинг: 0 / 0
Вопрос по EF
    #39852859
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так перепишите
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create procedure dbo.MyProcedureTest
as
begin
set nocount on;

declare  @MyTempTable table(id int identity, name varchar(255));

insert into @MyTempTable(name) select 'hkjhkjhkj' 
insert into @MyTempTable(name) select 'ghghgfhg' 
insert into @MyTempTable(name) select 'fghfgtryt' 
insert into @MyTempTable(name) select 'yrtyhgfnb' 

select * from @MyTempTable;

end
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Вопрос по EF
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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