数据库访问.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 queries
和using
语句。
- 为什么我们总是喜欢在SQL语句中使用参数
这里出现了一些问题:
1) 您正在将string
电子邮件设置为读取器的值。因为你在读卡器内部声明它,所以永远无法使用。您将立即失去作用域。
2) 你正在这样做:
lblEmail.Text = reader.ToString();
lblEmail.DataBind();
这是将标签设置为读取器(实例)的名称,而不是读取器产生的值。也没有理由绑定。
更好的方法是
lblEmail.Text = email;
请确保在读取器外部声明电子邮件变量
错误
- 函数getEmail的返回类型为
SqlDataReader
,您期望的是String
,即电子邮件 string email = reader["EMPLOYEE.Email"].ToString();
中的电子邮件声明在while loop
中。因此,email
成为while loop
的本地。它将无法识别循环之外的内容- 您正在返回
reader' an instance of
SqlDataReader,but you were expecting a
字符串` - 在您的第二个代码块中,您所做的并没有错(不会出错),但这不是您所期望的。您应该声明一个
String
变量,例如email
,并将函数分配给它(或者您可以直接将它分配给lblEmail
Text属性)
建议
您在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