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
私は本当に尋ねなければなりません。なぜ、通常のSqlDataReaderまたはDataAdapter.Fillを使用しないのですか? – Steve
これは、ストアドプロシージャで標準のSELECTステートメントを使用して出力を操作するよりも複雑に思えますが、ストアドプロシージャでOUTPUTパラメータを使用する場合は、ストアドプロシージャでOUTPUTを指定してストアドプロシージャを実行する必要があります。出力パラメタ(冗長ですが、必要です)。 (例: 'EXEC myProc @ output1 = @ myVar1 OUTPUT') – ZLK
@Steve - あなたには本当に良い答えがありません。私は間違いなく初心者プログラマーなので、私のものの多くはおそらくそれよりもはるかに効率が悪いでしょう。私はかなりの量のSqlDataReadersとSqlDataAdapterを実行しましたが、今言及したように、出力パラメータを使うよりもずっと簡単です。 – StateofDK