4

我在 sql server 2008 中创建了一个存储过程,它为我提供了对表所做的更改。我正在使用 Linq to 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 server 中运行良好。但是,当我在 C# 中使用 linq 运行此语句时

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

我收到这个错误

错误 1 ​​foreach 语句无法对“int”类型的变量进行操作,因为“int”不包含“GetEnumerator”的公共定义

4

5 回答 5

7

ExecuteCommand返回一个int.. 不是你的结果。

请参阅此处的 MSDN:http: //msdn.microsoft.com/en-us/library/system.data.linq.datacontext.executecommand.aspx

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

我想你在追求ExecuteQuery

于 2013-06-25T05:37:34.193 回答
4

ExecuteCommand方法返回Int32,您不能使用foreach简单的整数来使用神奇的循环。

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

我对类不太熟悉,DataContext但您可以使用DataContext.ExecuteQuerywhich 返回IEnumerable<TResult>,也可以使用foreach循环。

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

查询返回的对象集合。

于 2013-06-25T05:39:28.107 回答
1

我不知道你为什么使用foreach-statement,但是方法'ExecuteCommand'返回int值,而foreach循环需要实现IEnumerable的对象

于 2013-06-25T05:39:21.140 回答
1

我可能假设太多,但是如果您使用最新版本的 Visual Studio 执行 C#,而不是直接指定 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 */
}

相同的技术可用于调用用户定义的函数。

这样做将减少输入并提供智能感知来帮助调用存储过程和 SQL 函数。

于 2014-01-07T20:44:30.680 回答
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

于 2015-03-30T16:22:40.150 回答