2013-06-25 3 views
3

Я сделал хранимую процедуру в SQL Server 2008, которая дает мне изменения, внесенные в таблицу. Я использую Linq для SQL, чтобы использовать эту таблицу в C#. моя хранимая процедураВыполнение хранимой процедуры с использованием linq в C#

CREATE PROCEDURE dbo.getlog 
    -- Add the parameters for the stored procedure here 
@p1 int = 0, 
@p2 int = 0 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

    -- Insert statements for procedure here 
DECLARE @from_lsn binary(10), @to_lsn binary(10) 
SET @from_lsn = 
sys.fn_cdc_get_min_lsn('dbo_User_Info') 
SET @to_lsn = sys.fn_cdc_get_max_lsn() 
SELECT ID_number, Name, Age FROM cdc.fn_cdc_get_all_changes_dbo_User_Info 
(@from_lsn, @to_lsn, N'all'); 
END 
GO 

выше процедура работает отлично в SQL Server. Однако, когда я запускаю это утверждение с помощью LINQ в C#

 mytestDataContext obj = new mytestDataContext(); 
     var test=obj.ExecuteCommand("dbo.getlog"); 
     foreach(var abc in test) 
     {} 

Я получаю эту ошибку

Ошибка 1 Еогеасп оператор не может работать с переменными типа «ИНТ» , потому что «ИНТ» не содержит общедоступную определение 'GetEnumerator'

ответ

3

ExecuteCommand метод возвращает Int32 и вы не можете использовать магический foreach цикл с использованием простого целого числа.

Return Value 
Type: System.Int32 
The number of rows modified by the executed command. 

Я не слишком знакомы с DataContext класса, но вы можете использовать DataContext.ExecuteQuery, который возвращает IEnumerable<TResult> и вы можете использовать foreach цикл с ним.

Return Value 
Type: System.Collections.Generic.IEnumerable<TResult> 

Коллекция объектов, возвращенных запросом.

1

Я не знаю, почему вы используете Еогеасп-заявление, но метод возвращает ExecuteCommand 'INT значение и Еогеасп цикл требуется объект, который реализует IEnumerable

0

Возможно, я принимаю слишком много, но если вы делаете C# с недавней версией Visual Studio, достаточно прямо указывая вызов T-SQL для запуска хранимой процедуры как строки литерала, вы можете перетащить и отбросить хранимую процедуру в окно моделирования LINQ to SQL. Это добавит его в контекст данных LINQ to SQL.

int param1 = 1; 
int param2 = 2; 

mytestDataContext obj = new mytestDataContext(); 
var test=obj.getlog(param1, param2); 
foreach(var abc in test) 
{ 
    /* code inside loop */ 
} 

Такая же техника может использоваться для вызова пользовательских функций.

Выполнение этого приведет к сокращению набора текста и предоставлению intellisense для помощи при вызове хранимых процедур и функций SQL.

0

Вы можете использовать эту библиотеку: https://github.com/mrmmins/C-StoreProcedureModelBinding

Возвращает значения в списке, вам нужно только создать простой класс с именами и значениями типов, например:

var productos = DataReaderT.ReadStoredProceadures<MyCustomModel>(myDbEntityInstance, "dbo.MySPName", _generic); 

и MyCumtomModel класс что-то вроде:

public int id {get; set;} 
public int salary {get; set;} 
public string name {get; set;} 
public string school {get; set;} 

и родового, как:

List<Generic> _generic = = new List<Generic> 
          { 
           new Generic 
            { 
             Key = "@phase", Type = SqlDbType.Int, Value = "207" 
            } 
          } 
         }; 

И теперь, ваш products имеет параметры, как: products.First(), products.Count(), foreach и т.д.

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