Проблема с хранимой процедурой в LINQ-to-SQL - PullRequest
3 голосов
/ 27 июля 2010

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

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 to SQL, который имеет свойство для каждого из возвращенных столбцов (Date, Visits, ENT1, ENT2 ... ENT5).

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

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

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

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

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

ОБНОВЛЕНИЕ, вот сгенерированный 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>

ОБНОВЛЕНИЕ 2 Когда я запускаю хранимую процедуру в Visual Studio, вывод представляет собой набор строк, за которыми следуют:

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

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

Ответы [ 2 ]

4 голосов
/ 28 июля 2010

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

0 голосов
/ 27 июля 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...