Ich habe eine gespeicherte Prozedur, die eine SELECT-Anweisung ausführt, um Benutzerdaten bei der Anmeldung in den Sitzungsstatus zurückzugeben. Bisher hat die gespeicherte Prozedur nur leere Werte zurückgegeben, wenn sie durch Klicken auf die Schaltfläche "Anmelden" aufgerufen wurde. Ich habe die gespeicherte Prozedur in Sql Mgmt Studio getestet, indem ich sie ausgeführt habe, nachdem ich einen Eingabe-Benutzernamen hart codiert hatte und die gewünschten Ergebnisse erzielt habe. Ich habe Haltepunkte in Visual Studio platziert und festgestellt, dass während der Benutzername korrekt aus dem Textfeld, in dem eingegeben wurde, gesendet wird, alle Parameter leer wie "" zurückgegeben werden. Das führt mich zu der Annahme, dass das Problem etwas mit der Formatierung des Eingabeparameters ist, aber ich kann nicht herausfinden, was es ist. Jede Hilfe wird geschätzt.Gespeicherte Prozedur gibt leere Werte zurück
Hier ist meine C# Methode:
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;
}
}
Hier ist meine gespeicherten Prozedur:
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
Ich muss wirklich fragen. Warum verwendest du keinen normalen SqlDataReader oder DataAdapter.Fill? – Steve
Dies scheint komplizierter als nur eine Standard - SELECT - Anweisung in Ihrer gespeicherten Prozedur und die Bearbeitung der Ausgabe, aber Sie sollten beachten, dass Sie die gespeicherte Prozedur ausführen müssen, indem Sie OUTPUT für die Ausgabeparameter (redundant, aber notwendig). (z. B. 'EXEC myProc @ output1 = @ myVar1 OUTPUT') – ZLK
@Steve - habe keine wirklich gute Antwort darauf. Ich bin definitiv immer noch ein Anfänger Programmierer, so viele meiner Sachen sind wahrscheinlich viel weniger effizient als es sein könnte. Ich habe eine Menge Arbeit geleistet SqlDataReaders und SqlDataAdapters obwohl und jetzt, wo Sie es erwähnen, das wäre wahrscheinlich viel einfacher als die Verwendung von Ausgabeparametern. – StateofDK