Виконання збереженої процедури за допомогою linq в c #

Я створив збережену процедуру в sql server 2008, яка дає мені зміни, внесені до таблиці. Я використовую Linq в SQL, щоб використовувати цю таблицю в 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. Однак, коли я запускаю це твердження за допомогою linq в C #

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

Я отримую цю помилку

Помилка 1 для кожного заяви не може працювати на змінних типу 'int'   тому що "int" не містить публічного визначення для   'GetEnumerator'

3

10 Відповіді

ExecuteCommand returns an int.. not your results.

See MSDN here: http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.executecommand.aspx

public int ExecuteCommand(
    string command,
    params Object[] parameters
)

Я думаю, ви після ExecuteQuery .

6
додано

ExecuteCommand method returns Int32 and you can't use magical foreach loop using a simple integer.

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

I'm not too much familiar with DataContext class but you can use DataContext.ExecuteQuery which returns IEnumerable<tresult> and you can use foreach loop with it.

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

Колекція об'єктів, які повертаються запитом.

3
додано

ExecuteCommand method returns Int32 and you can't use magical foreach loop using a simple integer.

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

I'm not too much familiar with DataContext class but you can use DataContext.ExecuteQuery which returns IEnumerable<tresult> and you can use foreach loop with it.

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

Колекція об'єктів, які повертаються запитом.

3
додано

Я не знаю, чому ви використовуєте foreach-statement, але метод ExecuteCommand повертає int значення, і для кожного циклу потрібен об'єкт, який реалізує IEnumerable

1
додано

Я не знаю, чому ви використовуєте foreach-statement, але метод ExecuteCommand повертає int значення, і для кожного циклу потрібен об'єкт, який реалізує IEnumerable

1
додано

Я можу вважати занадто багато, але якщо ви виконуєте C# з нещодавньою версією Visual Studio, а безпосередньо вказовуєте виклик T-SQL, щоб запустити збережену процедуру як рядок буквенного тексту, ви можете перетягувати збережену процедуру на Вікно моделювання LINQ to SQL. Це додасть його до контексту даних LINQ-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
додано

Я можу вважати занадто багато, але якщо ви виконуєте C# з нещодавньою версією Visual Studio, а безпосередньо вказовуєте виклик T-SQL, щоб запустити збережену процедуру як рядок буквенного тексту, ви можете перетягувати збережену процедуру на Вікно моделювання LINQ to SQL. Це додасть його до контексту даних LINQ-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
додано

You can use this library: https://github.com/mrmmins/C-StoreProcedureModelBinding

Повертає ці значення як список, потрібно лише створити простий клас з тими іменами та значеннями, як:

var productos = DataReaderT.ReadStoredProceadures(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 = = new List
                          {
                              new Generic
                                  {
                                      Key = "@phase", Type = SqlDbType.Int, Value = "207"
                                  }
                          }
                      };

І тепер ваші продукти мають такі параметри: products.First() , products.Count() , foreach і т. д.

0
додано

You can use this library: https://github.com/mrmmins/C-StoreProcedureModelBinding

Повертає ці значення як список, потрібно лише створити простий клас з тими іменами та значеннями, як:

var productos = DataReaderT.ReadStoredProceadures(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 = = new List
                          {
                              new Generic
                                  {
                                      Key = "@phase", Type = SqlDbType.Int, Value = "207"
                                  }
                          }
                      };

І тепер ваші продукти мають такі параметри: products.First() , products.Count() , foreach і т. д.

0
додано

You can use this library: https://github.com/mrmmins/C-StoreProcedureModelBinding

Повертає ці значення як список, потрібно лише створити простий клас з тими іменами та значеннями, як:

var productos = DataReaderT.ReadStoredProceadures(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 = = new List
                          {
                              new Generic
                                  {
                                      Key = "@phase", Type = SqlDbType.Int, Value = "207"
                                  }
                          }
                      };

І тепер ваші продукти мають такі параметри: products.First() , products.Count() , foreach і т. д.

0
додано
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug