如何获取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的存在,我知道我应该学习和使用它,但我太遥远的路径尝试转换那里现在。

如何获取sql结果并在header中填充标签?

变化

if (selectedParcel != null)

if (selectedParcel.Read())

在开始提取数据之前,必须在数据读取器中读取一条记录。它是一个只能向前的游标,开始时不指向记录。Read()方法将读取器向前移动1,如果成功则返回true/false。

注意,如果使用上面的代码,则不需要调用HasRows。if块只在有行时才会被输入,如果没有,则Read返回false,块不被输入。


编辑

你的代码中有很多不好的做法。

    使用参数化sql!!这是你能带走的最重要的东西!
  1. 将连接封装在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。