我在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'
答案 0 :(得分:6)
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
之后。
答案 1 :(得分:3)
ExecuteCommand
方法返回Int32
,您无法使用简单的整数来使用神奇的foreach
循环。
Return Value
Type: System.Int32
The number of rows modified by the executed command.
我对DataContext
课程并不太熟悉,但您可以使用返回IEnumerable<TResult>
的{{3}},并可以使用foreach
循环。
Return Value
Type: System.Collections.Generic.IEnumerable<TResult>
查询返回的对象集合。
答案 2 :(得分:1)
我不知道你为什么使用foreach-statement,但方法'ExecuteCommand'返回int值,而foreach循环需要实现IEnumerable的对象
答案 3 :(得分: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 */
}
可以使用相同的技术来调用用户定义的函数。
执行此操作将减少键入并提供intellisense以帮助调用存储过程和SQL函数。
答案 4 :(得分:0)
您可以使用此库: https://github.com/mrmmins/C-StoreProcedureModelBinding
以List的形式返回值,您只需要创建一个包含名称和值类型的简单类,如:
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
等。