如何获取sql结果并在header中填充标签?
本文关键字:header 填充 标签 结果 何获取 获取 sql | 更新日期: 2023-09-27 18:09:43
我正在尝试更改我的代码。我在学习的过程中,我的代码和c#/ASP的许多部分。Net应用程序使用LINQ到SQL,许多部分使用命令直接访问SQL数据库。我觉得我应该标准化这些,所以我改变了LINQ到SQL代码。我有一部分代码,它根据会话变量找到一条记录,然后用sql查询结果填充标题中的标签。下面是代码:
protected void Page_Load(object sender, EventArgs e)
{
var pinNum = MySession.Current.focusParcel;
if (pinNum != 0)
{
String sql = ConfigurationManager.ConnectionStrings["Recorder"].ConnectionString;
SqlConnection connection = new SqlConnection(sql);
connection.Open();
SqlCommand command = new SqlCommand("Select PARCEL, PIN_TXT, Owner, Address1, Address2, CSZ, ACRES, LEGAL, Active FROM[ParcelView] WHERE PARCEL = " + pinNum, connection);
SqlDataReader selectedParcel = command.ExecuteReader();
if (selectedParcel != null)
{
lblPIN_Num.Text = selectedParcel["PARCEL"].ToString();
lblPIN_TXT.Text = selectedParcel["PIN_TXT"].ToString();
lblDateTime.Text = DateTime.Now.ToString("MMMM dd, yyyy");
lblOwner.Text = selectedParcel["Owner"].ToString();
lblAddress1.Text = selectedParcel["Address1"].ToString();
lblAddress2.Text = selectedParcel["Address2"].ToString();
lblCSZ.Text = selectedParcel["CSZ"].ToString();
lblAcres.Text = string.Format("{0} Acres", selectedParcel["ACRES"]);
lblLegal.Text = selectedParcel["LEGAL"].ToString();
if (selectedParcel["Active"].ToString() == "A")
{
lblInactive.Text = " (ACTIVE)";
}
else
{
lblInactive.Text = " (INACTIVE)";
lnkAddDocument.Visible = false;
}
}
lblCurrentUser.Text = Page.User.Identity.Name;
connection.Close();
}
else
Response.Redirect("./ParcelSearch.aspx");
}
我收到以下错误:
在没有数据的情况下尝试读取无效。
我知道使用的SQL语句将返回一个记录,当它被直接用于数据库的SQL查询。
提前感谢您的任何建议。我是否应该担心在整个应用程序中访问数据时缺乏一致性?如果是这样,我应该将所有内容转换为LINQ吗?或者从LINQ转换所有东西?我知道MVC的存在,我知道我应该学习和使用它,但我太遥远的路径尝试转换那里现在。
变化
if (selectedParcel != null)
if (selectedParcel.Read())
在开始提取数据之前,必须在数据读取器中读取一条记录。它是一个只能向前的游标,开始时不指向记录。Read()
方法将读取器向前移动1,如果成功则返回true/false。
注意,如果使用上面的代码,则不需要调用HasRows
。if块只在有行时才会被输入,如果没有,则Read返回false,块不被输入。
编辑
你的代码中有很多不好的做法。
- 使用参数化sql!!这是你能带走的最重要的东西!
- 将连接封装在using block中,以确保连接始终关闭。
Sql代码变化
String sql = ConfigurationManager.ConnectionStrings["Recorder"].ConnectionString;
using(SqlConnection connection = new SqlConnection(sql))
using(SqlCommand command = new SqlCommand("Select PARCEL, PIN_TXT, Owner, Address1, Address2, CSZ, ACRES, LEGAL, Active FROM [ParcelView] WHERE PARCEL = @pinNum", connection))
{
command.Parameters.Add(new SqlParameter("@pinNum", SqlDbType.VarChar){Value = pinNum});
connection.Open();
using(SqlDataReader selectedParcel = command.ExecuteReader())
{
if (selectedParcel.Read())
{
/*code unchanged*/
}
}
/* 1 line code unchanged*/
}
执行命令后,需要实际读取数据:
SqlDataReader selectedParcel = command.ExecuteReader();
if (selectedParcel.HasRows)
{
selectedParcel.Read();
....
....
我建议您将这种格式用于sqlDatareader,因为它将解析是否检索了结果,并在异常时自动处理自己:
using(SqlDataReader selectedParcel = command.ExecuteReader())
{
while (selectedParcel .Read())
{
//Assign label text to results
}
}
你应该Read()
SqlDataReader
protected void Page_Load(object sender, EventArgs e)
{
var pinNum = MySession.Current.focusParcel;
if (pinNum == 0)
Response.Redirect("./ParcelSearch.aspx");
String sql = ConfigurationManager.ConnectionStrings["Recorder"].ConnectionString;
using(SqlConnection connection = new SqlConnection(sql))
{
connection.Open();
SqlCommand command = new SqlCommand("Select PARCEL, PIN_TXT, Owner, Address1, Address2, CSZ, ACRES, LEGAL, Active FROM[ParcelView] WHERE PARCEL =@PinNum ", connection);
//protect from sql injection
command.Parameters.AddWithValue(@PinNum, pinNum);
using(SqlDataReader selectedParcel = command.ExecuteReader())
{
if(!selectedParcel.HasRows)
return;
SetLabels(selectedParcel);
}
}
}
private void SetLabels(SqlDataReader selectedParcel)
{
lblPIN_Num.Text = selectedParcel["PARCEL"].ToString();
lblPIN_TXT.Text = selectedParcel["PIN_TXT"].ToString();
lblDateTime.Text = DateTime.Now.ToString("MMMM dd, yyyy");
lblOwner.Text = selectedParcel["Owner"].ToString();
lblAddress1.Text = selectedParcel["Address1"].ToString();
lblAddress2.Text = selectedParcel["Address2"].ToString();
lblCSZ.Text = selectedParcel["CSZ"].ToString();
lblAcres.Text = string.Format("{0} Acres", selectedParcel["ACRES"]);
lblLegal.Text = selectedParcel["LEGAL"].ToString();
if (selectedParcel["Active"].ToString() == "A")
{
lblInactive.Text = " (ACTIVE)";
}
else
{
lblInactive.Text = " (INACTIVE)";
lnkAddDocument.Visible = false;
}
lblCurrentUser.Text = Page.User.Identity.Name;
}
我重构了你的代码,看起来有点。你有不同的问题,没有关闭阅读器。如果您对sql注入是开放的,那么您应该在单独的类中将连接转移到Db。