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



数据库访问.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

请帮助更正此错误。

提前谢谢。

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

首先,您的方法被称为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 queriesusing语句。

  • 为什么我们总是喜欢在SQL语句中使用参数

这里出现了一些问题:

1) 您正在将string电子邮件设置为读取器的值。因为你在读卡器内部声明它,所以永远无法使用。您将立即失去作用域。

2) 你正在这样做:

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

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

更好的方法是

lblEmail.Text = email;

请确保在读取器外部声明电子邮件变量

错误

  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字符串`
  4. 在您的第二个代码块中,您所做的并没有错(不会出错),但这不是您所期望的。您应该声明一个String变量,例如email,并将函数分配给它(或者您可以直接将它分配给lblEmailText属性)

建议

您在if(conn.State.ToString() == "Closed")中检查ConnectionState的方式可能会给您所需的结果,但不推荐使用。相反,您应该像这样检查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);

是的,这是因为您在读取器对象上调用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);

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

相关内容

  • 没有找到相关文章

最新更新