2016-08-08 6 views
0

ログイン時にセッション状態にユーザーデータを返すためにselectステートメントを実行するストアドプロシージャがあります。これまでのところ、ストアドプロシージャは、ログインボタンをクリックして呼び出すと空の値しか返しませんでした。私は、Sql Mgmt Studioのストアドプロシージャを、入力ユーザー名をハードコードした後に実行してテストし、目的の結果を得ました。私はVisual Studioでブレークポイントを配置し、ユーザー名が入力されたテキストボックスから正しく送信されている間に、すべてのパラメータが空に ""戻されていることがわかりました。これは、問題が入力パラメータの書式設定で何かであると信じていますが、それが何であるか把握できません。どんな助けもありがとうございます。ここで ストアドプロシージャが空の値を返す

は、私のC#のメソッドです:

ここ
public static User GetUser(int? id, string username) 
{ 
string SelectById = "spSelectUserById"; 
string SelectByUsername = "spSelectUserByUsername"; 
User u = new User();    
string connstring = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
using (SqlConnection conn = new SqlConnection(connstring)) 
{ 
    SqlCommand cmd = new SqlCommand(); 
    cmd.CommandType = System.Data.CommandType.StoredProcedure; 
    if (string.IsNullOrEmpty(id.ToString())) 
    { 
    cmd = new SqlCommand(SelectByUsername, conn); 
    cmd.Parameters.Add("@UserNameIn", SqlDbType.VarChar).Value = username.ToString(); 
    } 
    else if (string.IsNullOrEmpty(username)) 
    { 
    cmd = new SqlCommand(SelectById, conn); 
    cmd.Parameters.Add("@UserId", SqlDbType.Int).Value = id; 
    } 
    SqlParameter UserName = new SqlParameter(); 
    SqlParameter Password = new SqlParameter(); 
    SqlParameter FirstName = new SqlParameter(); 
    SqlParameter MiddleInitial = new SqlParameter(); 
    SqlParameter LastName = new SqlParameter(); 
    SqlParameter UserStar = new SqlParameter(); 
    SqlParameter UserRank = new SqlParameter(); 
    SqlParameter UserRankCode = new SqlParameter(); 
    SqlParameter Assignment = new SqlParameter(); 
    SqlParameter Shift = new SqlParameter(); 
    SqlParameter ContactPhone = new SqlParameter(); 
    SqlParameter PhoneType = new SqlParameter(); 
    SqlParameter Email = new SqlParameter(); 
    SqlParameter AssignmentId = new SqlParameter(); 
    SqlParameter ShiftId = new SqlParameter(); 
    UserName.ParameterName = "@UserName"; 
    Password.ParameterName = "@Password"; 
    FirstName.ParameterName = "@FirstName"; 
    MiddleInitial.ParameterName = "@MiddleInitial"; 
    LastName.ParameterName = "@LastName"; 
    UserStar.ParameterName = "@UserStar"; 
    UserRank.ParameterName = "@UserRank"; 
    UserRankCode.ParameterName = "@UserRankCode"; 
    Assignment.ParameterName = "@Assignment"; 
    Shift.ParameterName = "@Shift"; 
    ContactPhone.ParameterName = "@ContactPhone"; 
    PhoneType.ParameterName = "@PhoneType"; 
    Email.ParameterName = "@Email"; 
    AssignmentId.ParameterName = "AssignmentId"; 
    ShiftId.ParameterName = "ShiftId"; 
    UserName.SqlDbType = System.Data.SqlDbType.VarChar; 
    Password.SqlDbType = System.Data.SqlDbType.VarChar; 
    FirstName.SqlDbType = System.Data.SqlDbType.VarChar; 
    MiddleInitial.SqlDbType = System.Data.SqlDbType.VarChar; 
    LastName.SqlDbType = System.Data.SqlDbType.VarChar; 
    UserStar.SqlDbType = System.Data.SqlDbType.Int; 
    UserRank.SqlDbType = System.Data.SqlDbType.VarChar; 
    UserRankCode.SqlDbType = System.Data.SqlDbType.VarChar; 
    Assignment.SqlDbType = System.Data.SqlDbType.VarChar; 
    Shift.SqlDbType = System.Data.SqlDbType.VarChar; 
    ContactPhone.SqlDbType = System.Data.SqlDbType.VarChar; 
    PhoneType.SqlDbType = System.Data.SqlDbType.VarChar; 
    Email.SqlDbType = System.Data.SqlDbType.VarChar; 
    AssignmentId.SqlDbType = System.Data.SqlDbType.Int; 
    ShiftId.SqlDbType = System.Data.SqlDbType.Int; 
    UserName.Size = 200; 
    Password.Size = 200; 
    FirstName.Size = 200; 
    MiddleInitial.Size = 200; 
    LastName.Size = 200; 
    UserStar.Size = 200; 
    UserRank.Size = 200; 
    UserRankCode.Size = 200; 
    UserRankId.Size = 200; 
    Assignment.Size = 200; 
    Shift.Size = 200; 
    ContactPhone.Size = 200; 
    PhoneType.Size = 200; 
    Email.Size = 200; 
    AssignmentId.Size = 200; 
    ShiftId.Size = 200; 
    UserName.Direction = System.Data.ParameterDirection.Output; 
    Password.Direction = System.Data.ParameterDirection.Output; 
    FirstName.Direction = System.Data.ParameterDirection.Output; 
    MiddleInitial.Direction = System.Data.ParameterDirection.Output; 
    LastName.Direction = System.Data.ParameterDirection.Output; 
    UserStar.Direction = System.Data.ParameterDirection.Output; 
    UserRank.Direction = System.Data.ParameterDirection.Output; 
    UserRankCode.Direction = System.Data.ParameterDirection.Output; 
    Assignment.Direction = System.Data.ParameterDirection.Output; 
    Shift.Direction = System.Data.ParameterDirection.Output; 
    ContactPhone.Direction = System.Data.ParameterDirection.Output; 
    PhoneType.Direction = System.Data.ParameterDirection.Output; 
    Email.Direction = System.Data.ParameterDirection.Output; 
    AssignmentId.Direction = System.Data.ParameterDirection.Output; 
    ShiftId.Direction = System.Data.ParameterDirection.Output; 
    cmd.Parameters.Add(UserName); 
    cmd.Parameters.Add(Password); 
    cmd.Parameters.Add(FirstName); 
    cmd.Parameters.Add(MiddleInitial); 
    cmd.Parameters.Add(LastName); 
    cmd.Parameters.Add(UserStar); 
    cmd.Parameters.Add(UserRank); 
    cmd.Parameters.Add(UserRankCode); 
    cmd.Parameters.Add(Assignment); 
    cmd.Parameters.Add(Shift); 
    cmd.Parameters.Add(ContactPhone); 
    cmd.Parameters.Add(PhoneType); 
    cmd.Parameters.Add(Email); 
    cmd.Parameters.Add(AssignmentId); 
    cmd.Parameters.Add(ShiftId); 
    conn.Open(); 
    cmd.ExecuteNonQuery(); 
    u.UserName = UserName.Value.ToString(); 
    u.Password = Password.Value.ToString(); 
    u.FirstName = FirstName.Value.ToString(); 
    u.MiddleInitial = MiddleInitial.Value.ToString(); 
    u.LastName = LastName.Value.ToString(); 
    u.UserStar = Convert.ToInt16(UserStar.Value); 
    u.UserRank = UserRank.Value.ToString(); 
    u.UserRankCode = UserRankCode.Value.ToString(); 
    u.Assignment = Assignment.Value.ToString(); 
    u.AssignmentId = Convert.ToInt16(AssignmentId.Value); 
    u.Shift = Shift.Value.ToString(); 
    u.ShiftId = Convert.ToInt16(ShiftId.Value.ToString()); 
    u.ContactPhone = ContactPhone.Value.ToString(); 
    u.PhoneType = PhoneType.Value.ToString(); 
    u.Email = Email.Value.ToString(); 
    return u; 
    } 
} 

私のストアドプロシージャです:あなたの次のような手順、およびは、データテーブルに結果を得るために、SqlDataAdapterオブジェクトを使用し

CREATE PROCEDURE spSelectUserByUsername 
@UserNameIn   VARCHAR(MAX) = NULL    , 
@UserId    INT    = NULL  OUTPUT , 
@FirstName   VARCHAR(MAX) = NULL  OUTPUT , 
@MiddleInitial  VARCHAR(MAX) = NULL  OUTPUT , 
@LastName   VARCHAR(MAX) = NULL  OUTPUT , 
@UserStar   INT    = NULL  OUTPUT , 
@UserRank   VARCHAR(MAX) = NULL  OUTPUT , 
@UserRankCode  VARCHAR(MAX) = NULL  OUTPUT , 
@UserRankId   INT    = NULL  OUTPUT , 
@Assignment   VARCHAR(MAX) = NULL  OUTPUT , 
@AssignmentId  INT    = NULL  OUTPUT , 
@Shift    VARCHAR(MAX) = NULL  OUTPUT , 
@ShiftId   INT    = NULL  OUTPUT , 
@ContactPhone  VARCHAR(MAX) = NULL  OUTPUT , 
@PhoneType   VARCHAR(MAX) = NULL  OUTPUT , 
@Email    VARCHAR(MAX) = NULL  OUTPUT 
AS 
BEGIN 

SELECT 
@UserId   = users.user_id        , 
@FirstName  = users.first_name       , 
@LastName  = users.last_name        , 
@MiddleInitial = users.middle_initial      , 
@UserStar  = users.user_star        , 
@UserRank  = CONCAT(users.user_rank,' - ',ranks.title) , 
@UserRankCode = users.user_rank        , 
@UserRankId  = ranks.id         , 
@AssignmentId = users.assignment       , 
@Assignment  = assignment.AssignmentName     , 
@ShiftId  = users.regular_shift       , 
@Shift   = s.DisplayName        , 
@ContactPhone = users.contact_phone       , 
@PhoneType  = users.phone_type       , 
@Email   = users.email          
FROM 
dbo.users 
left JOIN 
[shift] s ON users.regular_shift  = s.shiftid 
left JOIN 
assignment ON users.assignment  = assignment.AssignmentId 
left JOIN 
ranks  ON users.user_rank   = ranks.code 
WHERE 
users.username       = @UserNameIn 
END 
+0

私は本当に尋ねなければなりません。なぜ、通常のSqlDataReaderまたはDataAdapter.Fillを使用しないのですか? – Steve

+2

これは、ストアドプロシージャで標準のSELECTステートメントを使用して出力を操作するよりも複雑に思えますが、ストアドプロシージャでOUTPUTパラメータを使用する場合は、ストアドプロシージャでOUTPUTを指定してストアドプロシージャを実行する必要があります。出力パラメタ(冗長ですが、必要です)。 (例: 'EXEC myProc @ output1 = @ myVar1 OUTPUT') – ZLK

+0

@Steve - あなたには本当に良い答えがありません。私は間違いなく初心者プログラマーなので、私のものの多くはおそらくそれよりもはるかに効率が悪いでしょう。私はかなりの量のSqlDataReadersとSqlDataAdapterを実行しましたが、今言及したように、出力パラメータを使うよりもずっと簡単です。 – StateofDK

答えて

0

変更:

は、
CREATE PROCEDURE spSelectUserByUsername 
@UserNameIn   VARCHAR(MAX) = NULL    , 

BEGIN 

SELECT 
    users.user_id, 
    users.first_name, 
    users.last_name, 
    users.middle_initial, 
    users.user_star, 
    CONCAT(users.user_rank,' - ',ranks.title), 
    users.user_rank, 
    ranks.id, 
    users.assignment, 
    assignment.AssignmentName, 
    users.regular_shift, 
    s.DisplayName, 
    users.contact_phone, 
    users.phone_type, 
    users.email          
FROM dbo.users 
left JOIN [shift] s ON users.regular_shift = s.shiftid 
left JOIN assignment ON users.assignment = assignment.AssignmentId 
left JOIN ranks ON users.user_rank = ranks.code 
WHERE users.username = @UserNameIn 
END 

このように、アダプタを使用して次のようなデータを取得できます。

string connstring = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
DataTable ResultTable = new DataTable(); 
using (SqlConnection conn = new SqlConnection(connstring)) 
{ 
    using (SqlCommand cmd = new SqlCommand()) 
    { 
     cmd.CommandType = System.Data.CommandType.StoredProcedure; 
     cmd.CommandText = ""; 
     cmd.Parameters.Add("@UserNameIn", SqlDbType.Int).Value = txtUserName.Text; // or what eve that supplay the username 
     SqlDataAdapter sqlAdapter = new SqlDataAdapter(cmd); 
     sqlAdapter.Fill(ResultTable); 
    } 

} 
関連する問題