4

SQL Server 2008 でストアド プロシージャを作成しました。これにより、テーブルに加えられた変更が得られます。このテーブルを C# で使用するために、Linq to SQL を使用しています。私のストアドプロシージャは

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 サーバーで正常に実行されます。ただし、C#でlinqを使用してこのステートメントを実行すると

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

このエラーが発生します

エラー 1 'int' には 'GetEnumerator' のパブリック定義が含まれていないため、foreach ステートメントは 'int' 型の変数を操作できません

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.ExecuteQueryどの戻り値IEnumerable<TResult>を使用でき、foreachループを使用できます。

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

クエリによって返されるオブジェクトのコレクション。

于 2013-06-25T05:39:28.107 に答える
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 関数の呼び出しに役立つ IntelliSense が提供されます。

于 2014-01-07T20:44:30.680 に答える
1

なぜ foreach-statement を使用するのかわかりませんが、メソッド 'ExecuteCommand' は int 値を返し、foreach サイクルには IEnumerable を実装するオブジェクトが必要です

于 2013-06-25T05:39:21.140 に答える