2010-07-27 6 views
3

У меня возникла бесконечная проблема с попыткой вызвать хранимую процедуру с контроллера - если бы я мог добавить щедрость к этому, так как это было слишком много время уже и я не знаю, что еще делать (но у меня нет точек). Основываясь на моих исследованиях, кажется, что это известная ошибка, но не обходные методы для меня работали, поэтому я сделаю все возможное, чтобы объяснить в надежде на решение:Проблема с хранимой процедурой в LINQ-to-SQL

1- Я создаю хранимую процедуру, которая выглядит примерно так: это:

CREATE PROCEDURE [dbo].[db_name] 
    @start_dt datetime, 
    @end_dt datetime 

AS 
BEGIN 

SET FMTONLY OFF; 

SELECT [date], 
    COUNT(visits) as Visits, 
    SUM(CASE entrance WHEN '1' THEN 1 ELSE 0 END) AS ENT1, 
    SUM(CASE entrance WHEN '2' THEN 1 ELSE 0 END) AS ENT2, 
    SUM(CASE entrance WHEN '3' THEN 1 ELSE 0 END) AS ENT3, 
    SUM(CASE entrance WHEN '4' THEN 1 ELSE 0 END) AS ENT4, 
    SUM(CASE entrance WHEN '5' THEN 1 ELSE 0 END) AS ENT5 
FROM some_view 
WHERE [date] between @start_dt and @end_dt 
group by [date] 

END 

2 - Затем я создал LINQ к SQL объекту сущности вручную, которая имеет свойство для каждого из вышеуказанных возвращаемых столбцов (Даты, посещений, ent1, ent2 ... ent5).

3 - Я попытался перетащить хранимую процедуру как функцию в указанный объект объекта в конструкторе VS, но это не позволило мне, поскольку он говорит, что «возвращенная схема не соответствует целевому классу». Поэтому я просто перетащил его в другое место и создал функцию (я даже изменил тип возврата на объект, но не работал, см. Ниже).

** ПРИМЕЧАНИЕ. Я полагаю, что Visual Studio считает, что хранимая процедура возвращает Int - не ожидаемую таблицу значений. ** Предлагаемое исправление для этого типа проблемы состояло в том, чтобы создать фиктивную хранимую процедуру, которая имеет только простой оператор выбора и заменяет его после перетаскивания на объект, но это не сработало.

4 - Я пробовал все, что я может думать в контроллере, например, пытаться вернуть IMultipleResults при вызове хранимой процедуры и преобразовании ее в объект модели без каких-либо успехов.

Основная проблема заключается в том, что не возвращаются строки, а только int.

Заранее благодарим за помощь! Я новичок в MVC, поэтому, пожалуйста, не стесняйтесь рассказывать мне весь путь, который я собираюсь сделать, если вы считаете, что это так.

UPDATE, вот сгенерированный XML модели:

<?xml version="1.0" encoding="utf-8"?> 
<Database Name="DB_Name" Class="nameDataContext" xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007"> 
    <Connection Mode="WebSettings" ConnectionString="Data Source=some_data_source;Initial Catalog=some_db;Integrated Security=True" SettingsObjectName="System.Configuration.ConfigurationManager.ConnectionStrings" SettingsPropertyName="name_ConnectionString" Provider="System.Data.SqlClient" /> 
    <Table Name="" Member="Visits"> 
    <Type Name="Visit"> 
     <Column Name="Date" Type="System.DateTime" CanBeNull="false" /> 
     <Column Name="Visits" Type="System.Int32" CanBeNull="false" /> 
     <Column Name="ENT1" Type="System.Int32" CanBeNull="false" /> 
     <Column Name="ENT2" Type="System.Int32" CanBeNull="false" /> 
     <Column Name="ENT3" Type="System.Int32" CanBeNull="false" /> 
     <Column Name="ENT4" Type="System.Int32" CanBeNull="false" /> 
     <Column Name="ENT5" Type="System.Int32" CanBeNull="false" /> 
    </Type> 
    </Table> 
    <Function Name="dbo.sp_proc_name" Method="sp_proc_name"> 
    <Parameter Name="start_dt" Type="System.DateTime" DbType="DateTime" /> 
    <Parameter Name="end_dt" Type="System.DateTime" DbType="DateTime" /> 
    <ElementType Name="sp_proc_nameResult"> 
     <Column Name="date" Type="System.String" DbType="VarChar(30)" CanBeNull="true" /> 
     <Column Name="Visits" Type="System.Int32" DbType="Int" CanBeNull="true" /> 
     <Column Name="ENT1" Type="System.Int32" DbType="Int" CanBeNull="true" /> 
     <Column Name="ENT2" Type="System.Int32" DbType="Int" CanBeNull="true" /> 
     <Column Name="ENT3" Type="System.Int32" DbType="Int" CanBeNull="true" /> 
     <Column Name="ENT4" Type="System.Int32" DbType="Int" CanBeNull="true" /> 
     <Column Name="ENT5" Type="System.Int32" DbType="Int" CanBeNull="true" /> 
    </ElementType> 
    </Function> 
</Database> 

UPDATE 2 При запуске хранимой процедуры в Visual Studio вывод представляет собой набор строк, а затем:

No rows affected. 
(129 row(s) returned) 
@RETURN_VALUE = 0 

Я предполагаю, что это, вероятно, последняя строка, которая является виновником.

+0

Я также заметил, что возвращенная «дата» функции, созданной импортом SP, установлена ​​в строку - я исправлю это (когда я смогу понять, как), но я не думаю, что это исправит основную вопрос о возврате int. – Mikalee

ответ

4

Никакой закон не устанавливает, что необходимо использовать Linq2Sql или EF или nHibernate или SubSonic или что-то еще с MVC. Так почему бы просто не написать небольшую статическую функцию для вызова proc и получить результаты назад как простой граф объектов, а не суетиться с целым ORM для довольно прямого сценария RPC.

+0

Как я уже сказал, я новичок в .Net MVC и пытался разобраться в лучших практиках, когда я иду. Единственный вопрос, который у меня есть, - это то, что вы подразумеваете под «простым графом объектов»? Предлагаете ли вы создать модель представления для представления значений, заполняемых функцией, или чего-то еще, например, прямой привязки? Спасибо. – Mikalee

+0

Yup, просто создайте функцию, которая выполняет процедуру и возвращает значения, завернутые в объект. Затем вы можете делать все, что можно сделать с указанными данными в .NET. –

+0

Спасибо, я попробую. – Mikalee

0

Случайные догадка ...

Я считаю SET FMTONLY OFF; препятствует правильному анализу хранимой процедуры. Я не могу точно вспомнить, почему, но я знаю, что некоторые клиенты имеют проблемы с ним (например, Reporting Services и временные таблицы)

И я никогда не использовал его в течение многих лет из SQL кода monkeying ...

Редактировать : Почему нет SET NOCOUNT ON?

Это возвращается как 2-й набор записей (ну, крошечный), который может вызвать его. Пожалуйста, see my question об этом тоже .. он может испортить nHibernate, например.

+0

Спасибо, но это была одна из «исправлений», о которых я прочитал и опробовал - помочь Visual Studio угадать правильный вывод SP. Проблема там с или без нее. – Mikalee

Смежные вопросы