2

C#を使用してストアドプロシージャを呼び出したい。

プロシージャコールの省略形を作成したいと思います。

私はまだ接続を再定義してそれを開きたくありません。メソッドを作成するにはどうすればよいですか?データベースへの接続をまだ開いていませんか?

私は次のコードを使用します:

SqlConnection conn = null;
SqlDataReader rdr  = null;

conn = new SqlConnection("");
conn.Open();

SqlCommand cmd  = new SqlCommand("Procedure", conn);
cmd.CommandType = CommandType.StoredProcedure;

rdr = cmd.ExecuteReader();

while (rdr.Read())
{
}
4

5 に答える 5

5

あなたが何を求めているのか理解できるかどうかはわかりませんが、次のような意味ですか?

public static SqlReader executeProcedure(SqlConnection oConn, string commandName, Dictionary<string, object> params)
{
    SqlCommand comm = oConn.CreateCommand();
    comm.CommandType = CommandType.StoredProcedure;
    comm.CommandText = commandName;
    if (params != null)
        foreach(KeyValuePair<string, object> kvp in params)
            comm.Parameters.Add(new SqlParameter(kvp.Key, kvp.Value));
    return comm.ExecuteReader();
}

使用例は次のとおりです。

Dictionary<string, object> paras = new Dictionary<string, object>();
paras.Add("user_name", "Timmy");
paras.Add("date", DateTime.Now);
SqlReader results = executeProcedure(oConn, "sp_add_user", paras);
while (results.Read())
{
    //do something with the rows returned
}
results.Close();
于 2012-05-11T18:06:25.133 に答える
2

FlyingStreudelの答えは良いですが、ベストプラクティスを示すこのバージョンを作成するためにそのコードを適合させました(下部のリンク)。堅牢なデータアクセスクラスを提供するMicrosoftのエンタープライズライブラリを使用することもできます。

private string _connectionString = "yourconnectionstring"; // from web.config, or wherever you store it
public static SqlDataReader executeProcedure(string commandName, 
                                         Dictionary<string, object> params)
{
    SqlConnection conn = new SqlConnection(_connectionString);
    conn.Open();
    SqlCommand comm = conn.CreateCommand();
    comm.CommandType = CommandType.StoredProcedure;
    comm.CommandText = commandName;
    if (params != null)
    {
        foreach(KeyValuePair<string, object> kvp in params)
            comm.Parameters.Add(new SqlParameter(kvp.Key, kvp.Value));
    }
    return comm.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
}

使用される、そのように:

Dictionary<string, object> paras = new Dictionary<string, object>();
paras.Add("user_name", "Timmy");
paras.Add("date", DateTime.Now);
using(SqlDataReader results = executeProcedure("sp_add_user", paras))
{
    while (results.Read())
    {
        //do something with the rows returned
    }
}

参照:

MicrosoftがエンタープライズライブラリでConnectionsを使用する方法

SqlConnectionを開いたままにしておくのは「foobar」です

クラスからデータリーダーを返す

于 2012-05-11T20:33:53.303 に答える
0
using (SqlConnection sqlConnection1 = new SqlConnection("Your Connection String")) {
using (SqlCommand cmd = new SqlCommand()) {
  Int32 rowsAffected;

  cmd.CommandText = "StoredProcedureName";
  cmd.CommandType = CommandType.StoredProcedure;
  cmd.Connection = sqlConnection1;

  sqlConnection1.Open();

  rowsAffected = cmd.ExecuteNonQuery();

}}
于 2012-05-11T18:04:27.037 に答える
0

この種のコードの再利用を検討している場合、考えられる解決策の1つは、この種のメソッド(ストアドプロシージャを実行して結果を返すメソッド)をアプリケーションの汎用データアクセス層にラップすることです。考慮しなければならないバリエーションは、結果を返さない、またはパラメーターを期待するプロシージャ用です。

たとえば、このシェルコードを、データベースへの接続文字列を期待するExecuteProcedure()としてラップすることができます。

この種のタスクを実行する方法は他にも無数にあるため、特定の要件に適した最適なオプションを決定する必要があります。

于 2012-05-11T18:04:51.060 に答える
0

このコードをラップして、プロシージャをパラメータとして受け取ることができます。このようなもの:

public SqlCommand GetData(string procedure)
{
  var conn = new SqlConnection(connectionString);
  var cmd = new SqlCommand(procedure, conn);

  cmd.CommandType = CommandType.StoredProcedure;
  conn.Open();
  return cmd;
}

このメソッドの唯一の問題は、リソースを適切に破棄しておらず、呼び出し元に依存していることです。

于 2012-05-11T18:05:33.883 に答える