1

次のメソッドとストアド プロシージャがあります。

私の質問は、メソッドで使用するストアド プロシージャから文字列値を返すaddStaffName方法ですか?

public string addStaffName()
{
        string staffName = string.Empty;
        string sConnectionString = ConfigurationManager.ConnectionStrings["LGDB"].ToString();
        SqlConnection SqlCOn = new SqlConnection(sConnectionString);
        SqlCommand SqlCmd = new SqlCommand();

        SqlCOn.Open();
        SqlCmd.Connection = SqlCOn;
        SqlCmd.CommandType = CommandType.StoredProcedure;
        SqlCmd.CommandText = "FetchStaffName";
        SqlCmd.Parameters.AddWithValue("email", email);
        //???
        return staffName;
    }

create procedure fetchStaffName
    @email varchar(100)
AS 
begin 
    select (employeeName) 
    from employee 
    where email = @email
end
4

2 に答える 2

2

結果セットとして1行、1列しか得られないことが確実な場合は、次のように使用でき.ExecuteScalar()ます。SqlCommand

string staffName = string.Empty;

string sConnectionString = ConfigurationManager.ConnectionStrings["LGDB"].ToString();

using (SqlConnection sqlCon = new SqlConnection(sConnectionString))
using (SqlCommand sqlCmd = new SqlCommand("FetchStaffName", sqlCon)
{
    sqlCmd.CommandType = CommandType.StoredProcedure;
    sqlCmd.Parameters.AddWithValue("@email", email);

    sqlCon.Open();

    staffName = sqlCmd.ExecuteScalar().ToString();

    sqlCon.Close();

    return staffName;
}

また、使用後のオブジェクトの適切な破棄を確実にするために派生するものすべてに推奨されるベスト プラクティスであるブロックの使用法をブロックに入れSqlConnectionますSqlCommandusing() { ... }IDisposable

于 2013-07-14T15:56:50.613 に答える
1

fetchStaffNameストアド プロシージャではなく、スカラー関数を作成することを検討してください。定義上、ストアド プロシージャは、データを使用して一連のアクションを実行する必要があります。スカラー関数は、一連の入力値に対して正確に 1 つの出力値が存在することを保証します。

CREATE FUNCTION fetchStaffName (
 @email VARCHAR(100)
)
RETURNS VARCHAR(?) --Place the length of employeeName field instead of ? symbol.
BEGIN
    RETURN (SELECT employeeName FROM employee WHERE email = @email)
END

そして、.NET コードは次のように変換されます。

using (SqlConnection SqlCOn = new SqlConnection(sConnectionString))
{
    SqlCommand SqlCmd = new SqlCommand("SELECT fetchStaffName(@email)", SqlCOn);
    SqlCmd.CommandType = CommandType.Text;
    SqlCmd.Parameters.AddWithValue("@email", email);

    SqlCOn.Open();
    staffName = (string)SqlCmd.ExecuteScalar();
}

ご覧のとおり、 からにCommandType変更されました。また、SqlConnection オブジェクトでの作業を構造にラップして、そのリソースを破棄し、自動的に閉じます。StoredProcedureTextusing

于 2013-07-14T16:25:31.017 に答える