2016-08-08 2 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; 
    } 
} 

내 저장 프로 시저입니다 : 당신의 다음과 같은 절차 및 DataTable을로 결과를 얻기 위해 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 및 SqlDataAdapters 작업량을 상당히 줄였습니다. 이제 출력 매개 변수를 사용하는 것보다 훨씬 쉬울 것입니다. – 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); 
    } 

} 
관련 문제