从数据库ASP.NET/C#返回特定值

时间:2012-04-05 04:37:33

标签: sql asp.net

我的问题涉及从数据库中的表中返回特定值。我希望在您登录后的位置显示用户名和姓的名称。

表格如下所示。

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";
        }
    } 
}

6 个答案:

答案 0 :(得分:1)

首先,我重构一下你的逻辑,以保持UI VS数据库调用有点分离。然后重构代码以检索使用连接字符串,用户名,密码和输出名字和姓氏的代码的名字和姓氏。

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 uname=@uname and upass=@upass";
        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;
            }
        }
    }
}

答案 1 :(得分:1)

我会做三件事:

  • 将您的UI逻辑与数据库逻辑分开 - 不要直接在button_Click事件处理程序中间访问您的数据库......

  • 如果您只需要名字和姓氏,那么只选择表格中的这两列!

  • SqlConnection, SqlCommand, SqlDataReader等所有一次性物品放入using(...) {...}块中,以便在使用后妥善处理

所以我的代码看起来像这样:

UI图层

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;
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以通过以下方式阅读SqlDataReader的实例:

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.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";

    }
} 
}

答案 4 :(得分:0)

您的问题是如何从查询中返回您想要的数据,或者如何从datareader访问它?

听起来你可能想要ExecuteScalar(),你可以在查询中组合fname和lastname字段,这样你就可以得到一个结果:

string strCmd = "Select Fname + ' ' + LName 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();
    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 ...所以不要以为任何人都会看到它。可以将它添加到查询字符串并显示在member.aspx ...

答案 5 :(得分:-2)

您可以执行类似

的操作

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

如果内存服务,您可能还需要先调用objDR.Read();开始迭代datareader。