Показать данные базы данных в представлении - PullRequest
0 голосов
/ 16 марта 2019

Мне нужно получить данные из базы данных и показать на странице aspx.

Ниже мой код, но он не работает. Что с ними не так? Я пытался решить эту проблему, ссылаясь на все в Интернете. Я знаком с PHP, но не с ASP.net. Поэтому сложно найти правильное решение, так как я новичок в этом.

Mydefault.aspx

<%@ Page Language="C#" AutoEventWireup="true" Debug="true" CodeFile="Mydefault.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body bgcolor="#ccccff">
    <form id="form1" runat="server">
    <h4 style="color: #800080"> Test Page</h4>
     <div>
        <table class="style1">
            <tr>
                <td class="style3" style="color: #800000; font-size: large;">
                Search</td>
                <td class="style2">
                 <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                 </td>
                <td>
                    <asp:Button ID="Button1" runat="server" Text="Go" onclick="Button1_Click" />
                </td>
            </tr>

        </table>
        <p> 
            <asp:Label ID="Label1" runat="server" Text="Label" ForeColor="Maroon"></asp:Label>
        </p>
    </div>
    <div>
     <asp:GridView ID="GridView1" runat="server"  BackColor="#DEBA84" BorderColor="#DEBA84" BorderStyle="None" BorderWidth="1px" 
        CellPadding="3" CellSpacing="2" Height="90px" Width="260px">
        <RowStyle BackColor="#FFF7E7" ForeColor="#8C4510" />
        <FooterStyle BackColor="#F7DFB5" ForeColor="#8C4510" />
        <PagerStyle ForeColor="#8C4510" HorizontalAlign="Center" />
        <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="White" />
        <HeaderStyle BackColor="#A55129" Font-Bold="True" ForeColor="White" /> 
      </asp:GridView>
    </div>
    </form>
</body>
</html>

Mydefault.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page
{
    public SqlConnection con;
    public string constr;

    public void connection()
    { 
        constr = ConfigurationManager.ConnectionStrings["locations"].ToString();
        con = new SqlConnection(constr);

        con.Open();
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Visible = false;
    }

    private void rep_bind()
    {
        connection();

        string query = "select * from locations where Name like'" + TextBox1.Text + "%'";

        SqlDataAdapter da = new SqlDataAdapter(query, con);
        DataSet ds = new DataSet();
        da.Fill(ds);

        GridView1.DataSource = ds;
        GridView1.DataBind();
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        connection();
        string query = "select Name  from locations where Name like'" + TextBox1.Text + "%'";
        SqlCommand com = new SqlCommand(query, con);

        SqlDataReader dr;
        dr = com.ExecuteReader();

        if (dr.HasRows)
        {
            dr.Read();

            rep_bind();
            GridView1.Visible = true;

            TextBox1.Text = "";
            Label1.Text = "";
        }
        else
        {
            GridView1.Visible = false;        
            Label1.Visible = true;
            Label1.Text = "The search Term " + TextBox1.Text + " &nbsp;Is Not Available in the Records"; ;
        }
    }
}

Web.config

<?xml version="1.0"?>
<configuration>
    <system.web>
         <compilation debug="true" targetFramework="4.0"/>
    </system.web>
    <connectionStrings>
        <add name="locations" 
             connectionString="server=localhost;database=mylocations;uid=myuser;password=Mypass;" 
             providerName="System.Data.SqlClient" />
    </connectionStrings>
    <system.web>
        <customErrors mode="Off"/>
    </system.web>
</configuration>

1 Ответ

0 голосов
/ 16 марта 2019

Вы выполняете один и тот же запрос два раза (rep_bind и button_click) и никогда не закрываете соединение с базой данных.Это создаст много путей к ошибочным условиям.Например, когда соединение обслуживает DataReader, вы не можете использовать его для других задач.И держу пари, что именно в этой точке ваша программа выдает первую ошибку.
Не следует оставлять соединение открытым в течение большего времени, чем необходимо для извлечения ваших данных.

И, конечно, как уже отмечалось в комментариях, вы должны использовать параметры для запроса к базе данных и никогда не объединять пользовательский ввод с вашими командами sql.

Итак, первое, что нужно изменить, это connection method

public SqlConnection connection()
{ 
    string constr = ConfigurationManager.ConnectionStrings["locations"].ToString();
    SqlConnection con = new SqlConnection(constr);
    con.Open();
    return con;
}

Теперь мы вернем соединение из этого метода.Зачем?Потому что мы можем использовать возвращенный объект в используя оператор , который предоставит нашему коду функциональность, необходимую для закрытия соединения при каждом его использовании.И в качестве еще одного бонуса нам больше не нужны две глобальные переменные.
В методе rep_bind мы могли бы написать

private bool rep_bind()
{
    using(SqlConnection con = connection())
    {
        string query = "select * from locations where Name like @name";
        SqlDataAdapter da = new SqlDataAdapter(query, con);
        da.SelectCommand.Parameters.Add("@name", SqlDbType.NVarChar).Value =  TextBox1.Text + "%";
        DataSet ds = new DataSet();
        da.Fill(ds);
        bool hasRows = ds.Tables[0].Rows.Count > 0;
        GridView1.DataSource = ds;
        GridView1.DataBind();
        return hasRows;
   }
}

Теперь в конце блока использования соединение будетбыть закрытым и уничтоженным, и переменная, сообщающая нам, есть ли у нас строки или нет, возвращается вызывающему коду.
Обработчик события button_click заботится о координации всего бэкэнда и интерфейса пользовательского интерфейса

protected void Button1_Click(object sender, EventArgs e)
{
    if(rep_bind())
    {
        GridView1.Visible = true;
        TextBox1.Text = "";
        Label1.Text = "";
    }
    else
    {
        GridView1.Visible = false;        
        Label1.Visible = true;
        Label1.Text = "The search Term " + TextBox1.Text + " &nbsp;Is Not Available in the Records"; ;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...