2016-08-01 28 views
0

DB-Acess.csSQL数据读取器到标签 - 值不显示

这就是公共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

纠正这个错误,请帮忙。

预先感谢您。

回答

0

错误

  1. 返回类型的函数getEmailSqlDataReader和你期望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 Text属性。

SUGGESTION

不建议你检查if(conn.State.ToString() == "Closed")ConnectionState可以给你想要的结果,但该方法。相反,你应该检查这样if (conn.State == ConnectionState.Closed)

现在最等候的部分:即兴代码:笑

UPDATE

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

谢谢你的回答。我提示一个错误“已经有一个打开的DataReader与这个Command关联,必须先关闭它。”任何想法是什么导致这一点 – Omesh

+0

尝试配置SqlCommand&reader:'if(newCmd!= null){newCmd.Dispose();} if(reader!= null){reader。''或者你可以使用'using'语句 – jonju

+0

试试更新后的代码 – jonju

1

有一些事情出错的位置:

1)你是string电子邮件设置为读者的价值。这是因为你在读者中声明它,将永远无法使用。你会立即失去范围。

2)你正在做这件事:

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

这是设置标签,读写器(实例的名称),而不是读者产生值。没有理由约束,要么。

一个更好的办法来做到这一点是

lblEmail.Text = email; 

请务必申报读者之外的电子邮件变量

0

是的,这是因为你正在呼吁读者对象ToString(),因此它只是打印classname完全限定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); 
+0

感谢您的回答。我提示一个错误“已经有一个打开的DataReader与这个Command关联,必须先关闭它。” 任何想法是什么原因造成的? – Omesh

+0

@Omesh,在你的代码中的其他地方,你已经打开了另一个仍然打开的阅读器对象。核实。 – Rahul

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声明。

+0

谢谢你的回答。我提示一个错误“已经有一个打开的DataReader与这个Command关联,必须先关闭它。”任何想法是什么导致这一点 – Omesh

+0

@Omesh - 这意味着你的原始代码不工作,因为我没有改变。错误来自哪里?起初看,你应该在conn.Close()之前调用reader.Close()? – sgeddes