#asp.net #sql-server
#asp.net #sql-сервер
Вопрос:
Мне нужно извлечь данные из базы данных и отобразить на странице 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 " amp;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. Предупреждение о внедрении SQL — вам не следует объединять ваши SQL-инструкции — вместо этого используйте параметризованные запросы , чтобы избежать внедрения SQL — проверьте таблицы Little Bobby
2. Можете ли вы объяснить, что означает «не работает»? Есть сообщение об ошибке, которым можно поделиться?
Ответ №1:
Вы выполняете один и тот же запрос два раза (rep_bind и button_click) и никогда не закрываете соединение с базой данных. Это создаст множество путей к возникновению ошибок. Например, пока соединение занято обслуживанием программы чтения данных, вы не можете использовать его для других задач. И я уверен, что это тот момент, когда ваша программа выдает первую ошибку.
Вы не должны оставлять соединение открытым на большее время, чем необходимо для получения ваших данных.
И, конечно, как уже говорилось в комментариях, вы должны использовать параметры для запроса базы данных и никогда не объединять пользовательские данные с вашими командами sql.
Итак, первое, что нужно изменить, это метод подключения
public SqlConnection connection()
{
string constr = ConfigurationManager.ConnectionStrings["locations"].ToString();
SqlConnection con = new SqlConnection(constr);
con.Open();
return con;
}
Теперь мы возвращаем соединение с помощью этого метода. Почему? Потому что мы можем использовать возвращаемый объект в операторе using, который предоставит нашему коду функциональность, необходимую для закрытия соединения каждый раз, когда мы его используем. И в качестве еще одного бонуса нам больше не нужны две глобальные переменные.
В методе 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;
}
}
Теперь в конце блока using соединение будет закрыто и уничтожено, а в вызывающий код будет возвращена переменная, сообщающая нам, есть ли у нас строки или нет.
Обработчик событий 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 " amp;nbsp;Is Not Available in the Records"; ;
}
}