SQL数据读取器到标签 - 值不显示

时间:2016-08-01 21:31:24

标签: sql asp.net oop sqldatareader

  

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

请帮助纠正此错误。

提前谢谢你。

5 个答案:

答案 0 :(得分:1)

这里有一些问题:

1)您正在将string 电子邮件设置为阅读器的值。因为你在读者中声明它,所以永远不会被使用。你将立即失去范围。

2)你这样做:

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

这是将标签设置为阅读器的名称(实例),而不是阅读器生成的值。也没理由束缚。

更好的方法是

lblEmail.Text = email;

确保在阅读器外声明电子邮件变量

答案 1 :(得分:1)

所以有很多问题在发生,我决定把这个评论写成适当解决方案的开头。

首先,您的方法称为getEmail - 不应该返回电子邮件(换句话说,改为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语句。

答案 2 :(得分:0)

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

而且,你错了。当前代码不起作用,因为您正在返回已经关闭的读取器,因此您无法从中读取。相反,您应该更改您的方法以返回电子邮件并像

一样使用它
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;
          }

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

        string email = newCmd.ExecuteScalar() as string;

现在您可以在来电者中分配

lblEmail.Text = dba.getEmail(pname);

答案 3 :(得分:0)

<强>错误

  1. 函数 getEmail 的返回类型为SqlDataReader,您期待String,即电子邮件。
  2. string email = reader["EMPLOYEE.Email"].ToString();中的电子邮件声明位于while loop内。因此,email成为while loop的本地。它不会在循环外识别。
  3. 您将返回reader' an instance of SqlDataReader ,but you were expecting a String`。
  4. 在你的第二个代码块中,你所做的事情没有错(它不会给出错误),但这不是你期望得到的。你应该声明一个String变量,例如。 email并将功能分配给它(或者您可以直接将其分配给lblEmail文字属性。
  5. <强> SUGGESTION

    您在ConnectionState中查看if(conn.State.ToString() == "Closed")的方式可能会为您提供所需的结果,但不建议这样做。相反,你应该像if (conn.State == ConnectionState.Closed)一样检查。

    现在最等待的部分:即兴代码:lol!

    <强>更新

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

答案 4 :(得分:0)

字符串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