2011-08-08 45 views
1

我正在使用vs 2008在asp.net c#中執行項目。我希望在3層體系結構中執行我的項目。我可以將值插入到表使用3tier.But無法登錄到頁面只有註冊是可能的。在運行它顯示錯誤爲「程序或功能'登錄'期望參數'@iusername',這是沒有提供。」使用3層體系結構在asp.net中無法登錄到頁面c#

我的代碼是下面

表示層

protected void submit_Click(object sender, EventArgs e) 
    { 

    String xusername = uname.Text; 

    String xpwd = pwd.Text; 

    try 
    { 
     bool match = oBAL.checking(xusername, xpwd); 

     if (match == true) 
     { 
      Session["Username"] = xusername; 
      Response.Redirect("page.aspx"); 
     } 

     else 
     { 
      ClientScript.RegisterStartupScript(GetType(), "alert", "alert('Invalid UserName or Password');", true); 
     } 
    } 
    catch (Exception ee) 
    { 
     Label1.Text = ee.Message.ToString(); 

    } 
    finally 
    { 
     oBAL = null; 
    } 

} 

BusinessLayer給出

public bool checking(string susername, string spwd) 
{ 
    ownerDAL oDAL = new ownerDAL(); 
    bool match = false; 


    DataSet ds = oDAL.Logincheck(); 


    try 
    { 
     int noofrows = ds.Tables["Userstable"].Rows.Count; 
     for (int i = 0; i < noofrows; i++) 
     { 
      if ((ds.Tables["Userstable"].Rows[i]["username"].ToString() == susername) && (ds.Tables["Userstable"].Rows[i]["pwd"].ToString() == spwd)) 
      { 
       match = true; 
      } 
     } 
     return match; 


    } 
    catch 
    { 
     throw; 
    } 
    finally 
    { 
     oDAL = null; 
    } 
    } 
    } 

數據層

 public DataSet Logincheck() 
{ 
    SqlConnection con = new SqlConnection(str); 
    con.Open(); 
    SqlCommand cmd = new SqlCommand("login", con); 
    cmd.CommandType = CommandType.StoredProcedure; 
    SqlDataAdapter da=new SqlDataAdapter(cmd); 
    DataSet ds=new DataSet(); 
    try 
    { 

     da.Fill(ds, "Userstable"); 
     return ds; 
    } 
    catch 
    { 
     throw; 
    } 

    finally 
    { 
     cmd.Dispose(); 
     con.Close(); 
     con.Dispose(); 
    } 

} 

StoredProcedure的

   ALTER PROCEDURE dbo.login 

(
@iusername varchar(50), 
@ipwd varchar(50) 


) 

AS 
    BEGIN 


SELECT  username, pwd 
    FROM   register 
    WHERE  (username = @iusername) AND (pwd = @ipwd) 

END

表名:寄存器 字段: 用戶名(的PrimaryKey) PWD

我認爲這是一個簡單的錯誤。但作爲初學者我找不到它。請提出一個好的解決方案。

回答

0

你的程序接受兩個參數username和password,但你沒有提供它。 將您的DAL功能Logincheck()更改爲接受兩個參數,就像您在業務層的bool checking(string susername, string spwd)中那樣。

然後修改Logincheck()傳遞參數爲StoredProcedure .. 而且你不需要一遍額外的檢查,對BAL(用戶名和密碼),你已經在做它在你的SP.your Logincheck()在DAL可以很好地返回true /假基於

2

要檢查的比賽在業務內容層 所以你需要有完整的用戶列表 一個DataSet,以便改變procedue這樣

ALTER PROCEDURE dbo.login  

AS 
    BEGIN  

SELECT  username, pwd 
    FROM   register 

或者你也可以傳遞參數給親憑據(來自DataLayer)

cmd.Parameters.Add(UserName); 
cmd.Parameters.Add(Password); 
+0

感謝您的建議。我做了您的建議。但仍顯示錯誤爲「程序或函數'登錄'期望參數'@iusername',它沒有提供。 – user793987

+0

你修改了哪一個 - 更改程序或傳遞參數? – Shebin

+0

我改變了程序。在給出斷點時,它會嘗試使用dll,然後嘗試使用dl.fill(ds,「Userstable」); return ds; }執行da.Fill(ds,「usertable」);然後退出try。不返回 – user793987

0

您的存儲過程需要兩個參數來驗證登錄並且您沒有提供它。將用戶名和密碼傳遞給您的Sp或將您更改爲以下,它將在您檢查bl中的用戶名和密碼時起作用。

ALTER PROCEDURE dbo.login 
AS 
    BEGIN 
    SELECT  username, pwd FROM   register 
    WHERE  (username = @iusername) AND (pwd = @ipwd) 
    end