로그인 할 때 세션 상태로 사용자 데이터를 반환하기 위해 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
정말 부탁드립니다. 일반 SqlDataReader 또는 DataAdapter.Fill을 사용하지 않는 이유는 무엇입니까? – Steve
이것은 저장 프로 시저에서 표준 SELECT 문을 사용하고 출력을 조작하는 것보다 복잡해 보입니다.하지만 저장 프로 시저에서 OUTPUT 매개 변수를 사용하면 해당 저장 프로 시저에 대해 OUTPUT을 지정하여 저장 프로 시저를 실행해야합니다. 출력 매개 변수 (중복되지만 필수). (예 :'EXEC myProc @ output1 = @ myVar1 OUTPUT') – ZLK
@ 스티브 (Steve) - 당신에게 좋은 대답이 없습니다. 나는 아직 시작 프로그래머이기 때문에 많은 것들이 아마도 그렇게 효율적이지 않을 것이다. SqlDataReaders 및 SqlDataAdapters 작업량을 상당히 줄였습니다. 이제 출력 매개 변수를 사용하는 것보다 훨씬 쉬울 것입니다. – StateofDK