데이터베이스에서 일부 정보를 검색하고 반환 값을 검색하려고했습니다. 저장 프로 시저가 올바르게 작동하는 것을 알고 있습니다.출력이 포함 된 저장 프로 시저 호출
내가 사용하는 코드는 사용자 등록에 사용되는 수정 된 부분입니다. 내 코드의 cmd.ExecuteReader 부분에서 잘못되었습니다. 난 그냥 단순히 cmd.ExecuteScalar();
를 사용하여 반환 값을 수신 할 때
protected void btn_login_Click(object sender, ImageClickEventArgs e)
{
//Actions after Submit button is clicked
Page.Validate(((ImageButton)sender).ValidationGroup);
if (Page.IsValid)
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DbConnectString"].ConnectionString))
{
SqlCommand cmd = new SqlCommand("usp_validateUsers", conn);
//Input Values
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("username", Uname.Text);
cmd.Parameters.AddWithValue("password", pwd.Text);
//Return Values
SqlParameter retParam = cmd.Parameters.Add("@RetVal", SqlDbType.Int);
retParam.Direction = ParameterDirection.ReturnValue;
SqlParameter acsParam = cmd.Parameters.Add("@ac_status", SqlDbType.Int);
acsParam.Direction = ParameterDirection.Output;
SqlParameter nikParam = cmd.Parameters.Add("@memb_name", SqlDbType.VarChar);
nikParam.Direction = ParameterDirection.Output;
try
{
// Open Connection and execute Stored Proc
conn.Open();
///////////SOMETHING GOES WRONG HERE///////////////
cmd.ExecuteReader();
//Retrieve Data
int retVal = (int)retParam.Value;
string nickname = nikParam.Value.ToString();
string ac_stats = acsParam.Value.ToString();
if (retVal != 0)
{
//Invalid Username or password
}
else
{
//Login User
}
}
catch (Exception Error)
{
lbl_login.Text = "An error occured, please try again later";
debug.Text = Error.Message;
}
finally
{
debug.Text = "\n Clossing Connection";
if (conn.State == System.Data.ConnectionState.Open)
{
conn.Close();
}
}
}
}
}
나는 내가 SQL 데이터베이스에 SQL 쿼리를 전달있을 때 데이터를 수신하는 방법을 알고 있지만, 저장 프로 시저를 사용하는 경우 다른 것 같다.
수정 아마이 코드를 더 향상시킬 수는 있지만 실제로해야 할 일을 수행합니다.
ALTER PROCEDURE dbo.usp_validateUsers
@username varchar(10),
@password varchar(10),
@ac_status char(1) OUTPUT,
@memb_name varchar(15) OUTPUT
AS
IF EXISTS(SELECT * FROM MEMB_INFO WHERE (memb___id = @username))
BEGIN
SELECT @ac_status = ac_status, @memb_name = memb_name
FROM MEMB_INFO
WHERE (memb___id = @username) AND (memb__pwd = @password)
RETURN 0
END
ELSE
BEGIN
return 1
END
나는 Visual Studio에서 가능한 예외를 잡기 위해 브레이크 포인트를 사용, 그것은 저를 제공합니다 문자열 [4] : 크기 속성은 당신은 SqlDataReader 개체를 만들 필요가 0
:
이 시도 대신 같은 라인을 가지는? – Jacob
문자열 [4]의 크기가 0입니다. – Raskaroth
문자열 매개 변수에 길이가 있어야합니다. –