2015-11-05 4 views
0

Мне нужно отобразить некоторые данные из представления в базе данных SQL Server на нескольких страницах моего веб-сайта. Я сделал это, используя SqlDataSource в своем web.config, а затем использовал элемент управления GridView на моей странице .aspx, чтобы отобразить данные.Лучшее решение для SqlDataSource?

Теперь это работает, но я прочитал в каком-то форуме, что использовать плохую практику SqlDataSource? Вероятно, мне понадобится возможность для администратора/пользователя фильтровать данные в будущем, поэтому я не уверен, как это будет работать с моей текущей реализацией.

Мой код до сих пор выглядит следующим образом:

В web.config файле:

<connectionStrings> 
    <add name="Test1.ConnectionString" 
     connectionString="Data Source=...." 
     providerName="System.Data.SqlClient" /> 
</connectionStrings> 
<system.web> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5" /> 
</system.web> 

И что-то вроде этого в моей ASPX

<body id="wrap" > 
    <form runat="server"> 
    <asp:GridView ID="GridView1" runat="server" AllowSorting="True" AutoGenerateColumns="False" 
     BackColor="White" BorderColor="#CCCCCC" 
     BorderStyle="None" BorderWidth="1px" CellPadding="3" 
     DataSourceID="SqlDataSource1" Height="500px" Width="408px"> 
     <Columns> 
      <asp:BoundField DataField="Title" HeaderText="Title" ReadOnly="True" SortExpression="Title"> 
       <ItemStyle Width="400px" HorizontalAlign="Center" Height="100px" BorderColor="#CCCCCC" BorderStyle="Solid" BorderWidth="1px" /> 
      </asp:BoundField> 
      <asp:BoundField DataField="Result" HeaderText="Result" ReadOnly="True" SortExpression="Result" > 
       <ItemStyle HorizontalAlign="Center" Height="100px" BorderColor="#CCCCCC" BorderStyle="Solid" BorderWidth="1px" /> 
      </asp:BoundField> 
     </Columns> 
     <FooterStyle BackColor="White" ForeColor="#002756" /> 
     <HeaderStyle BackColor="#003466" Font-Bold="True" ForeColor="White" /> 
     <PagerStyle BackColor="White" ForeColor="#002756" HorizontalAlign="Left" /> 
     <RowStyle ForeColor="#002756" /> 
    </asp:GridView> 
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
     ConnectionString="<%$ ConnectionStrings: Test1.ConnectionString %>" 
     SelectCommand="SELECT * FROM [Test1.ConnectionString]"> 
    </asp:SqlDataSource> 
    </form> 
</body> 

Так что мой вопрос есть лучше способ реализовать это, имея в виду, что мне, вероятно, понадобится функция для пользователя/администратора для фильтрации данных по определенным критериям?

+0

Любая конкретная причина, по которой вы не используете код для получения данных? – Izzy

+0

Я родом из php-фона и совершенно новичок в asp.net, так что все еще пытаюсь обнять эту голову. Но я думаю, это было бы лучшим решением? – MariaL

ответ

1

Как уже упоминалось в моем комментарии я бы порекомендовал вам использовать код позади, чтобы достичь этого, поскольку это гораздо проще вносить изменения в случае необходимости в будущем. Я предполагаю, что у вас есть таблица в вашей базе данных с именем Test1. Сначала мы создадим класс для представления этого в C# и добавим несколько свойств, которые мы будем использовать позже.

public class Test 
{ 
    public string Title { get; set; } 
    public int Result { get; set; } 
} 

Теперь давайте создадим метод, который возвращает коллекцию значений из вашей базы данных.

public List<Test> GetData() 
{ 
    List<Test> myList = new List<Test>(); 

    string sqlQuery = "Select Title, Result From Test"; 
    string connectionString = ConfigurationManager.ConnectionStrings["Test1.ConnectionString"].ConnectionString; //Read connection string from config file 

    using (var con = new SqlConnection(connectionString)) 
    { 
     using (var cmd = new SqlCommand(sqlQuery, con)) 
     { 
      //Add param here if required. 
      con.Open(); //Open connection 
      using (var reader = cmd.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        Test t = new Test(); 
        t.Title = reader["Title"].ToString(); 
        t.Result = Convert.ToInt32(reader["Result"]); 

        myList.Add(t); 
       } 
      } 
     } 
    } 
    return myList; 
} 

Наконец, вы хотите установить источник данных для GridView. Я собираюсь предположить, что у вас есть страница под названием MyGridPage.aspx открыть MyGridPage.asps.cs и в вашем Page_Load случае вы можете установить DataSource для сетки, как:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     Test t = new Test(); 
     GridView1.DataSource = t.GetData(); 
     GridView1.DataBind(); 
    } 
} 

Если вы хотите, чтобы отфильтровать Sql запрос, например, имя пользователя вы измените его как:

string sqlQuery = "Select Title, Result From Test Where username = @username"; 

Затем вы можете передать в параметре @username как:

cmd.Parameters.Add("@username", SqlDbType.NVarChar).Value = myUsername; 

myUsername может быть из тех, кто зашел в ваше приложение. Перед тем, как открыть соединение, вы передадите параметр (ы). Параметры передачи также будут препятствовать внедрению sql, которые я предлагаю вам прочитать, если вы не знаете.

Примечание: рекомендуется использовать блок using, чтобы убедиться, что объект соединения закрыт и расположен правильно.

+0

Спасибо! Я отдам это. – MariaL

+0

@MariaL Добро пожаловать, Удачи вам в вашем проекте – Izzy

+0

Просто быстрый вопрос: теперь я получаю эту ошибку: CS1518: Ожидаемый класс, делегат, перечисление, интерфейс или структура для публичного LIst GetData(). Любая идея, почему я получаю эту ошибку? – MariaL

3

Нельзя использовать плохую практику использования SqlDataSource ... но она имеет тенденцию смешивать ваш код доступа к данным с кодом презентации. Кроме того, вы можете часто делать лучше с ObjectDataSource, который обертывает ваше представление. Есть немного больше кода (вам нужно будет создать новый класс где-нибудь, чтобы выбрать из вашего представления), но вы получите методы, которые могут быть легко обновлены или заменены в будущем для обработки любых изменений, которые могут вам понадобиться.

0

Вы можете программно установить источник данных в виде сетки.

protected void Page_Load(object sender, EventArts e) 
    { 
     using(SqlConnection conn = new SqlConnection(connectionString)) 
     { 
      string query = "SELECT * FROM Test"; //your SQL query goes here 
      SqlCommand cmd = new SqlCommand(query, conn); 
      SqlDataAdapter da = new SqlDataAdapter(cmd); 
      DataTable table = new DataTable(); 
      da.Fill(table); 

      GridView1.DataSource = table; 
      GridView1.DataBind(); 

      cmd.Dispose(); 
      da.Dispose(); 
     } 
    } 
Смежные вопросы