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
请帮助纠正此错误。
提前谢谢你。
答案 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)
<强>错误强>
SqlDataReader
,您期待String
,即电子邮件。string email = reader["EMPLOYEE.Email"].ToString();
中的电子邮件声明位于while loop
内。因此,email
成为while loop
的本地。它不会在循环外识别。reader' an instance of
SqlDataReader ,but you were expecting a
String`。String
变量,例如。 email
并将功能分配给它(或者您可以直接将其分配给lblEmail
文字属性。<强> 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