2012-04-05 11 views
2

私の質問には、データベースのテーブルから特定の値を返すことが含まれます。私はそれを持っていますログイン後、ユーザーの名字の名前が表示されます。データベースから特定の値を返すASP.NET/C#

表は次のようになります。

UID(PK), FName, LName, Uname, Upass 

にはどうすればいいので、私はラベルにそれを置くことができるだけでFnameLNameを返すのですか?

ここは私の現在のコードです。これはマスターページ用であることに注意してください。

string strConn = WebConfigurationManager.ConnectionStrings["cloud2"].ConnectionString; 

protected void btnlogin2_Click(object sender, EventArgs e) 
{ 
    string strCmd = "Select * From Person Where uname = @uname and upass = @upass"; 

    SqlConnection objConn = new SqlConnection(strConn); 

    SqlCommand objCmd = new SqlCommand(strCmd, objConn); 
    objCmd.Parameters.AddWithValue("@uname", txtusername.Text); 
    objCmd.Parameters.AddWithValue("@upass", txtpassword.Text); 

    using (objConn) 
    { 
     objConn.Open(); 
     SqlDataReader objDR = objCmd.ExecuteReader(); 

     if (objDR.HasRows) 
     { 
      btnlogin2.Visible = false; 
      txtusername.Visible = false; 
      txtpassword.Visible = false; 

      Response.Redirect("member.aspx"); 

      lblLogin.Text = "Logged in as: Test " ; //Display login name? 
     } 
     else 
     { 
      btnlogin2.Text = "Failed"; 
     } 
    } 
} 
+0

リンクでの例を見てhttp://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx –

答えて

-2

あなたはメモリが提供している場合、あなたはおそらく最初のDataReaderを反復処理を開始するobjDR.Read();を呼び出す必要が

lblLogin.Text = "Logged in as: " + objDR.GetString(dr.GetOrdinal("FName")) + " " + objDR.GetString(dr.GetOrdinal("LName"));

ような何かを行うことができます。

+0

興味があるだけ、しかし正確に何が間違っていますこのコード? – Tuan

0
string Name=objDR ["FName"].ToString() + ["LName"].ToString() 
lblLogin.Text = "Logged in as:"+Name 
+0

正確に何が必要なのですか!ありがとうございました!!!! – SQAHero

0

あなたは次のようにSqlDataReaderのインスタンスを読み取ることができます。

WebConfigurationManager.ConnectionStrings["cloud2"].ConnectionString; protected void btnlogin2_Click(object sender, EventArgs e) { 

string strCmd = "Select * From Person Where [email protected] and [email protected]"; 
SqlConnection objConn = new SqlConnection(strConn); 
SqlCommand objCmd = new SqlCommand(strCmd, objConn); 
objCmd.Parameters.AddWithValue("@uname", txtusername.Text); 
objCmd.Parameters.AddWithValue("@upass", txtpassword.Text); 


using (objConn) 
{ 
    objConn.Open(); 
    SqlDataReader objDR = objCmd.ExecuteReader(); 

    if (objDR.Read()) 
    { 

     string fName= (string)objDR["FName"]; 
     string lName= (string)objDR["LName"]; 
     btnlogin2.Visible = false; 
     txtusername.Visible = false; 
     txtpassword.Visible = false; 
     Response.Redirect("member.aspx"); 
     lblLogin.Text = "Logged in as: Test "+fName+" "+lName; //Display login name? 


    } 
    else 
    { 

     btnlogin2.Text = "Failed"; 

    } 
} 
} 
+0

ご返信ありがとうございました – SQAHero

1

まず私はUI VSデータベースは少し別の呼び出しを維持するためにあなたのロジックビットをリファクタリングと思います。次に、接続文字列、ユーザー名、パスワードにコードを使用する名字を取得するコードをリファクタリングし、firstnameとlastnameを出力します。

string firstName, lastName; 
if(ValidateUser(txtusername.Text, txtpassword.Text, out firstName, out lastName) 
{ 
    //put your UI Logic and redirect in here 
    lblLogin.Text = "Welcome: " + firstName + " " + " lastName; 
} 
else 
{ 
    //login faild code 
} 

private bool ValidateUser(string strConn, string username, string password, out string firstName, out string lastName) 
{ 
    firstName = string.Empty; 
    lastName = string.Empty; 

    using (var con = new SqlConnection(strConn)) 
    using (var cmd = con.CreateCommand()) 
    { 
     cmd.CommandText = "Select * From Person Where [email protected] and [email protected]"; 
     cmd.Parameters.AddWithValue("@uname", username); 
     cmd.Parameters.AddWithValue("@upass", password); 

     con.Open(); 
     using (var r = cmd.ExecuteReader()) 
     { 
      if (r.Read()) 
      { 
       firstName = r["FName"].ToString(); 
       lastName = r["LName"].ToString(); 

       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
    } 
} 
+0

ご意見ありがとうございます。 – SQAHero

0

クエリーから必要なデータだけを返すにはどうすればよいのですか、またはデータレディアからアクセスするにはどうすればよいですか?あなたはは、ExecuteScalar(たい場合がありますようですね

)、そしてあなただけの1件の結果引っ張ることができるようにクエリでFNAMEとlastnameフィールドを組み合わせることができます。

string strCmd = "Select Fname + ' ' + LName From Person Where [email protected] and [email protected]"; 
SqlConnection objConn = new SqlConnection(strConn); 
SqlCommand objCmd = new SqlCommand(strCmd, objConn); 
objCmd.Parameters.AddWithValue("@uname", txtusername.Text); 
objCmd.Parameters.AddWithValue("@upass", txtpassword.Text); 


using (objConn) 
{ 
    objConn.Open(); 
    var username = objConn.ExecuteScalar() as string; 

    if (!string.IsNullOrEmpty()) 
    { 
     btnlogin2.Visible = false; 
     txtusername.Visible = false; 
     txtpassword.Visible = false; 
     Response.Redirect("member.aspx"); 
     lblLogin.Text = "Logged in as: " + username ; //Display login name? 
    } 

編集:ちょうど細部に気づきました。..あなたはリダイレクト後にlblLogin.Textを設定しています...だから、とにかく誰もがそれを見るつもりはないと思っています。私は3つのことを行うだろうけれどもクエリ文字列に追加し、member.aspxに表示...

1

でした:

  • は、データベース・ロジックからあなたのUIロジックを分離 - 直接データベースにアクセスしません。 button_Clickイベントハンドラの途中で......

  • あなただけの最初と最後の名前が必要な場合は、その後、のみテーブルからこれら2つの列を選択!

    UI層

    彼らは適切に使用

後に配置されるように

  • は、だから私のコードは次のようになりますusing(...) {...}ブロックにSqlConnection, SqlCommand, SqlDataReaderのようなすべての使い捨てのオブジェクトを置きます

    protected void btnlogin2_Click(object sender, EventArgs e) 
    { 
        // call the database layer to get the first and last name 
        FirstAndLastName data = GetFirstAndLastName(txtusername.Text, txtpassword.Text); 
    
        if (data != null) // something was returned - show it 
        { 
         lblLogin.Text = string.Format("You're logged in as {0} {1}", 
                 data.FirstName, data.LastName); 
        } 
        else 
        { 
         lblLogin.Text = "Not logged in...."; 
        } 
    } 
    

    データベース層

    string strConn = WebConfigurationManager.ConnectionStrings["cloud2"].ConnectionString; 
    
    internal class FirstAndLastName 
    { 
        public string FirstName { get; set; } 
        public string LastName { get; set; } 
    } 
    
    protected FirstAndLastName GetFirstAndLastName(string userName, string password) 
    { 
        FirstAndLastName result = null; 
    
        // if you only need FName und LName - then only select those two columns! 
        // don't just use SELECT * all the time because it's easy and because you're lazy 
        string strCmd = "SELECT FName, LName FROM dbo.Person WHERE uname = @uname AND upass = @upass"; 
    
        // wrap everything into using blocks 
        using(SqlConnection objConn = new SqlConnection(strConn)) 
        using(SqlCommand objCmd = new SqlCommand(strCmd, objConn)) 
        { 
         objCmd.Parameters.AddWithValue("@uname", userName); 
         objCmd.Parameters.AddWithValue("@upass", password); 
    
         objConn.Open(); 
    
         using(SqlDataReader objDR = objCmd.ExecuteReader()) 
         { 
          if (objDR.Read()) 
          { 
           result = new FirstAndLastName(); 
    
           result.FirstName = objDR.GetString(objDR.GetOrdinal("FName")); 
           result.LastName = objDR.GetString(objDR.GetOrdinal("LName")); 
          } 
         } 
        } 
    
        return result; 
    } 
    
  • +1

    データベースとUIの分離が優れたアイデアであり、提供したコードが美しいという解決策を見つけるのに非常に役立ちました。ありがとうございます – SQAHero

    関連する問題