SQL 数据 Reader 到标签中 - 值不显示
SQL Data Reader into Label - Value doesn't display
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
请帮助更正此错误。
提前谢谢你。
这里有一些问题:
1) 您正在将 string
电子邮件 设置为 reader 的值。因为您在 reader 中声明它,所以将永远无法使用。您将立即失去范围。
2) 你正在这样做:
lblEmail.Text = reader.ToString();
lblEmail.DataBind();
这是将标签设置为 reader(实例)的名称,而不是 reader 生成的值。也没有理由绑定。
更好的方法是
lblEmail.Text = email;
确保在 reader
之外声明电子邮件变量
是的,那是因为您在 reader 对象上调用 ToString()
,因此它只打印完全限定的类名 reader.ToString()
。
而且,你看错了。当前代码不应该工作,因为您 returning reader 已经关闭,因此您无法从中读取。相反,您应该将方法更改为 return 电子邮件并像
一样使用它
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;
}
此外,如果您的查询 return 是单个 email
值,则使用 ExecuteScalar()
而不是
string email = newCmd.ExecuteScalar() as string;
现在可以在caller中赋值了
lblEmail.Text = dba.getEmail(pname);
所以有这么多问题在发生,我决定写这篇评论作为适当解决方案的开始。
首先,您的方法称为 getEmail——它不应该 return 电子邮件(换句话说,应该是 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
语句。
- Why do we always prefer using parameters in SQL statements?
错误
- Return 函数 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`。
- 在你的第二个代码块中,你所做的并没有错(不会报错),但这不是你期望得到的。您应该声明一个
String
变量,例如。 email
并将函数赋值给它(或者你可以直接赋值给 lblEmail
Text 属性.
建议
您在 if(conn.State.ToString() == "Closed")
中检查 ConnectionState
的方式可能会给您带来想要的结果,但不推荐这样做。相反,你应该像这样检查 if (conn.State == ConnectionState.Closed)
.
现在最期待的部分:即兴代码:哈哈!
更新
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);
字符串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
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
请帮助更正此错误。
提前谢谢你。
这里有一些问题:
1) 您正在将 string
电子邮件 设置为 reader 的值。因为您在 reader 中声明它,所以将永远无法使用。您将立即失去范围。
2) 你正在这样做:
lblEmail.Text = reader.ToString();
lblEmail.DataBind();
这是将标签设置为 reader(实例)的名称,而不是 reader 生成的值。也没有理由绑定。
更好的方法是
lblEmail.Text = email;
确保在 reader
之外声明电子邮件变量是的,那是因为您在 reader 对象上调用 ToString()
,因此它只打印完全限定的类名 reader.ToString()
。
而且,你看错了。当前代码不应该工作,因为您 returning reader 已经关闭,因此您无法从中读取。相反,您应该将方法更改为 return 电子邮件并像
一样使用它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;
}
此外,如果您的查询 return 是单个 email
值,则使用 ExecuteScalar()
而不是
string email = newCmd.ExecuteScalar() as string;
现在可以在caller中赋值了
lblEmail.Text = dba.getEmail(pname);
所以有这么多问题在发生,我决定写这篇评论作为适当解决方案的开始。
首先,您的方法称为 getEmail——它不应该 return 电子邮件(换句话说,应该是 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
语句。
- Why do we always prefer using parameters in SQL statements?
错误
- Return 函数 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`。 - 在你的第二个代码块中,你所做的并没有错(不会报错),但这不是你期望得到的。您应该声明一个
String
变量,例如。email
并将函数赋值给它(或者你可以直接赋值给lblEmail
Text 属性.
建议
您在 if(conn.State.ToString() == "Closed")
中检查 ConnectionState
的方式可能会给您带来想要的结果,但不推荐这样做。相反,你应该像这样检查 if (conn.State == ConnectionState.Closed)
.
现在最期待的部分:即兴代码:哈哈!
更新
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);
字符串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