SQL 数据 Reader 到标签中 - 值不显示

SQL Data Reader into Label - Value doesn't display

DB-Acess.cs

这是初始化 Public SqlDataReader getEmail 的地方。

public SqlDataReader getEmail(string UserName)
        {
            if (conn.State.ToString() == "Closed")
            {
                conn.Open();
            }
            //string noemail ="noemailsaved";
            SqlCommand newCmd = conn.CreateCommand();
            newCmd.Connection = conn;
            newCmd.CommandType = CommandType.Text;
            newCmd.CommandText = "Select Email from dbo.EMPLOYEE where Username ='" + UserName + "'";
            SqlDataReader reader = newCmd.ExecuteReader();
            while (reader.Read())
            {
                string email = reader["EMPLOYEE.Email"].ToString();

            }
            conn.Close();
            reader.Close();
            return reader;
          }

我正在使用 OOP 并调用 asp.net 页面中的函数,并希望在标签中显示值。下面是我用来调用函数的代码。

SqlDataReader reader = dba.getEmail(pname);
lblEmail.Text = reader.ToString();
lblEmail.DataBind();

我看到的不是员工的电子邮件地址,而是 System.Data.SqlClient.SqlDataReader

请帮助更正此错误。

提前谢谢你。

这里有一些问题:

1) 您正在将 string 电子邮件 设置为 reader 的值。因为您在 reader 中声明它,所以将永远无法使用。您将立即失去范围。

2) 你正在这样做:

lblEmail.Text = reader.ToString();
lblEmail.DataBind();

这是将标签设置为 reader(实例)的名称,而不是 reader 生成的值。也没有理由绑定。

更好的方法是

lblEmail.Text = email;

确保在 reader

之外声明电子邮件变量

是的,那是因为您在 reader 对象上调用 ToString(),因此它只打印完全限定的类名 reader.ToString()

而且,你看错了。当前代码不应该工作,因为您 returning reader 已经关闭,因此您无法从中读取。相反,您应该将方法更改为 return 电子邮件并像

一样使用它
public string getEmail(string UserName)
        {
            if (conn.State.ToString() == "Closed")
            {
                conn.Open();
            }
            //string noemail ="noemailsaved";
            SqlCommand newCmd = conn.CreateCommand();
            newCmd.Connection = conn;
            newCmd.CommandType = CommandType.Text;
           // Hopefully your query returns a single email record
            newCmd.CommandText = "Select Email from dbo.EMPLOYEE where Username ='" + UserName + "'";
            SqlDataReader reader = newCmd.ExecuteReader();
            string email = string.Empty;
            while (reader.Read())
            {
                email = reader["EMPLOYEE.Email"].ToString();

            }
            conn.Close();
            reader.Close();
            return email;
          }

此外,如果您的查询 return 是单个 email 值,则使用 ExecuteScalar() 而不是

        string email = newCmd.ExecuteScalar() as string;

现在可以在caller中赋值了

lblEmail.Text = dba.getEmail(pname);

所以有这么多问题在发生,我决定写这篇评论作为适当解决方案的开始。

首先,您的方法称为 getEmail——它不应该 return 电子邮件(换句话说,应该是 string)。

public string GetEmail(string UserName)
    {
        string email = string.Empty;
        if (conn.State.ToString() == "Closed")
        {
            conn.Open();
        }
        //string noemail ="noemailsaved";
        SqlCommand newCmd = conn.CreateCommand();
        newCmd.Connection = conn;
        newCmd.CommandType = CommandType.Text;
        newCmd.CommandText = "Select Email from dbo.EMPLOYEE where Username ='" + UserName + "'";
        SqlDataReader reader = newCmd.ExecuteReader();
        while (reader.Read())
        {
            email = reader["EMPLOYEE.Email"].ToString();

        }
        conn.Close();
        reader.Close();
        return email;
      }

那么你所要做的就是:

lblEmail.Text = db.GetEmail(pname);

这至少应该让你前进。您还应该考虑使用 parameterized queries 以及 using 语句。

  • Why do we always prefer using parameters in SQL statements?

错误

  1. Return 函数 getEmail 的类型是 SqlDataReader 并且您期望 String 即电子邮件。
  2. string email = reader["EMPLOYEE.Email"].ToString(); 中的电子邮件声明在 while loop 中。因此,email 成为 while loop 的局部变量。它不会在循环外识别。
  3. 并且您正在返回 reader' an instance ofSqlDataReader,but you were expecting aString`。
  4. 在你的第二个代码块中,你所做的并没有错(不会报错),但这不是你期望得到的。您应该声明一个 String 变量,例如。 email 并将函数赋值给它(或者你可以直接赋值给 lblEmail Text 属性.

建议

您在 if(conn.State.ToString() == "Closed") 中检查 ConnectionState 的方式可能会给您带来想要的结果,但不推荐这样做。相反,你应该像这样检查 if (conn.State == ConnectionState.Closed).

现在最期待的部分:即兴代码:哈哈!

更新

public string getEmail(string UserName){
    if (conn.State == ConnectionState.Closed){
        conn.Open();
    }
    //string noemail ="noemailsaved";
    string email="";
    using(SqlCommand newCmd = new SqlCommand()){
        newCmd.Connection = conn;
        newCmd.CommandType = CommandType.Text;
        newCmd.CommandText = "Select Email From dbo.EMPLOYEE Where Username = @uname";
        newCmd.Parameters.AddWithValue("@uname",UserName);
        using(SqlDataReader reader = newCmd.ExecuteReader()){
              while (reader.Read()){
                   email = reader["Email"].ToString();
              }
        }
    }
    conn.Close();
    //reader.Close();
    return email ;
}

用于设置Label文本

lblEmail.Text = dba.getEmail(pname);

字符串q,d; int ano=0;

    SqlConnection con = new SqlConnection("Data Source=SANDEESQLEXPRESS;Initial Catalog=agent demo;Integrated Security=True");
    con.Open();

    SqlCommand cmd = new SqlCommand("select * from po where agentno=@ano", con);
    cmd.Parameters.AddWithValue("ano",ano);

    SqlDataReader dr = cmd.ExecuteReader();

    if (dr.Read())
    {
        d = dr["date1"].ToString(); 
    }

    dr.Close();

    Label1.Text = d+ "";
   does not show value of date in lablel