0

重複の可能性:
SQL Serverと.netは、paramの名前を指定せずにparamの値を使用してストアドプロシージャを呼び出すことをサポートしていますか?

ストアドプロシージャタイプのcommand.ExecuteReader()を呼び出したいのですが、渡すパラメーター名をSPのパラメーター名と同じにしたくありません。以下は私がやろうとしていることのサンプルです

SP:

ALTER PROCEDURE SPName
@Id nvarchar(50)
AS
BEGIN
    SET NOCOUNT ON;
SELECT * FROM TableName
WHERE ColumnName = @Id 
END
GO

コード:

using (SqlCommand command = new SqlCommand(spName, connection) { CommandType = CommandType.StoredProcedure })
{
    command.parameters.Add(new SqlParameter(*paramaeter name*, sqlDbType.nvarchar){ Value = "SomeValue"};
}
4

4 に答える 4

2

余分なラウンドトリップを必要とせずに一般的なスタイルの関数が必要で、リフレクションを使用して満足している場合は、次のようなものを使用できます。

// Return an array of SqlParameter's by using reflection on ParamObject
private static SqlParameter[] GetParametersFromObject( object ParamObject )
{

    var Params = new List<SqlParameter>();

    foreach( var PropInfo in ParamObject.GetType().GetProperties() )
    {
        Params.Add( new SqlParameter( PropInfo.Name, PropInfo.GetValue( ParamObject, null ) ) );
    }

    return Params.ToArray();

}

public static void ExecuteSP( SqlConnection Connection, string SPName, object ParamObject )
{

    using( var Command = new SqlCommand() )
    {

        Command.Connection = Connection;
        Command.CommandType = CommandType.StoredProcedure;
        Command.CommandText = SPName;

        Command.Parameters.AddRange( GetParametersFromObject( ParamObject ) );

        // Command.ExecuteReader()...

    }

}

これは、リフレクションを使用して、匿名オブジェクトからプロパティ名と値を取得し、SqlCommandに入力します。これはそのまま使用できます。

ExecuteSP( Conn, "GetStuff", new { Id = 7, Name = "Test" } );

このように、ExecuteSPは「generic」であり、ExecuteSPを呼び出すときにパラメーター名と値を選択します。

于 2012-09-12T10:26:09.607 に答える
1

単純な事実-SQLサーバーはパラメーターを名前でバインドするため、最終的にはストアドプロシージャを呼び出すときに正しいパラメーター名を使用する必要があります(名前付きパラメーターを使用せずにEXECを使用してSPを呼び出す場合でも、パーサーは名前でパラメーターを左から右にバインドします) 。

SqlCommandしたがって、別の名前を使用する場合は、SPとターゲットSPの間に中間層を導入する必要があります。

しかし、名前を気にせずに自動的に検出したい場合は、SQLServerと.netのサポートで受け入れられた回答でConradFrixが言及した手法を使用して、paramの名前を指定せずにparamの値を使用してストアドプロシージャを呼び出すことができますか?-理由が異なっていても、最終的にはあなたがやりたいことなので、私が重複としてマークしたのはそのためです。

于 2012-09-12T09:55:41.377 に答える
1

SqlServerの場合、コマンドオブジェクトを受け取り、要求されたストアドプロシージャのパラメーター(名前とタイプ)をデータベースに照会するDeriveParametersメソッドがあります。

次に、それらを繰り返し処理して値を指定できます。

注:これはデータベースへの余分な移動を意味するため、これが頻繁に必要な場合は、結果をキャッシュすることをお勧めします。

于 2012-09-12T09:55:46.900 に答える
0

以下のメソッドを使用すると、ストアドプロシージャを呼び出すための汎用コードを記述できますが、さまざまなストアドプロシージャごとに特定のアクションを実行する柔軟性も得られます。

public delegate void SqlCOmmandDelegate(SqlCommand command);

public class Dal
{
    public void ExecuteStoredProcedure(string procedureName, 
        SqlCommandDelgate commandDelegate)
    {
        using (SqlConnection connection = new SqlConnection())
        {
            connection.ConnectionString = GetConnectionString();
            using (SqlCommand command = connection.CreateCommand())
            {
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = procedureName;
                connection.Open();
                commandDelegate(command);
            }
        }
    }
}

class UsesDal
{
    public CallFirstProcedure(int value)
    {
        string userName;

        ExecuteStoredProcedure("FIRST_PROCEDURE",
            delegate(SqlCommand command)
            {
                command.Parameters.Add("UserID", value);
                command.ExecuteReader();

                //Do stuff with results e.g.
                username = command.Parameters.Parameters["UserName"].ToString();
            }
    }

    public CallOtherProcedure(string value)
    {
        int id;
        ExecuteStoredProcedure("OTHER_PROCEDURE",
            delegate(SqlCommand command)
            {
                command.Parameters.Add("ParameterName", value);
                id = command.ExecuteScalar();
            }
    }
}
于 2012-09-12T10:09:24.293 に答える