Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Build Your Own ASP.NET 2.0 Web Site Using CSharp And VB (2006) [eng]-1.pdf
Скачиваний:
142
Добавлен:
16.08.2013
Размер:
15.69 Mб
Скачать

Displaying Lists in DetailsView

<asp:Parameter Name="HomePhone" Type="String" /> <asp:Parameter Name="Extension" Type="String" /> <asp:Parameter Name="MobilePhone" Type="String" /> <asp:Parameter Name="EmployeeID" Type="Int32" />

</UpdateParameters>

<SelectParameters>

<asp:ControlParameter ControlID="grid" Name="EmployeeID" PropertyName="SelectedValue" Type="Int32" />

</SelectParameters>

<InsertParameters>

<asp:Parameter Name="DepartmentID" Type="Int32" /> <asp:Parameter Name="Name" Type="String" /> <asp:Parameter Name="Username" Type="String" /> <asp:Parameter Name="Password" Type="String" /> <asp:Parameter Name="Address" Type="String" /> <asp:Parameter Name="City" Type="String" /> <asp:Parameter Name="State" Type="String" /> <asp:Parameter Name="Zip" Type="String" /> <asp:Parameter Name="HomePhone" Type="String" /> <asp:Parameter Name="Extension" Type="String" /> <asp:Parameter Name="MobilePhone" Type="String" />

</InsertParameters>

</asp:SqlDataSource>

As you can see, the SqlDataSource contains the UPDATE, DELETE, and INSERT queries it needs to execute when the user performs these actions on the DetailsView. These are parameterized queries, and a data type is specified for each of the parameters, which, as you already know, is good programming practice. You might also notice that the names of the fields and tables are surrounded by square brackets ([ and ]). These square brackets allow us to include spaces and other special characters in table names. Since none of our field or table names contain spaces, we haven’t had to worry about this issue so far, but facilitating the inclusion of spaces is a good idea.

The SqlDataSource is the perfect tool when you need to create fully featured forms such as the address book quickly and easily for smaller projects like the Dorknozzle intranet. As the DetailsView and GridView controls are tightly integrated with the data source controls, they allow us to implement a lot of functionality without writing any code.

Displaying Lists in DetailsView

We want to improve on our DetailsView by making it show a list of departments instead of department IDs. This makes sense, as it’s much easier for users to select

489

Chapter 12: Advanced Data Access

the name of a department than a department ID when they’re updating or inserting the details of an employee. Figure 12.16 shows how the page will look once we’ve created this functionality.

Figure 12.16. Viewing the Department drop-down list in DetailsView

Start by adding a new SqlDataSource control beside the two existing data source controls in AddressBook.aspx. Name the control departmentsDataSource, click its smart tag, and select Configure Data Source. In the first screen, select the Dorknozzle connection, then click Next. Specify the Departments table and select both of its columns, as shown in Figure 12.17.

Click Next, then Finish to save the data source configuration. The definition of your new data source control will look like this:

File: AddressBook.aspx (excerpt)

<asp:SqlDataSource id="departmentsDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:Dorknozzle %>"

490

Displaying Lists in DetailsView

Figure 12.17. Specifying the Departments data source

SelectCommand="SELECT [DepartmentID], [Department] FROM [Departments]" />

Now, with AddressBook.aspx open in Design View, click the DetailsView control’s smart tag, select Edit Fields, and transform the Department ID BoundField into a TemplateField—you learned how to do this back in Chapter 11. Now, switch to Source View, and locate the Department ID TemplateField that you just generated. It should look something like this:

File: AddressBook.aspx (excerpt)

<asp:TemplateField HeaderText="DepartmentID" SortExpression="DepartmentID">

<EditItemTemplate>

<asp:TextBox ID="TextBox1" runat="server"

Text='<%# Bind("DepartmentID") %>'></asp:TextBox> </EditItemTemplate>

<InsertItemTemplate>

<asp:TextBox ID="TextBox1" runat="server"

Text='<%# Bind("DepartmentID") %>'></asp:TextBox> </InsertItemTemplate>

<ItemTemplate>

<asp:Label ID="Label1" runat="server"

491

Chapter 12: Advanced Data Access

Text='<%# Bind("DepartmentID") %>'></asp:Label> </ItemTemplate>

</asp:TemplateField>

Modify this generated template as highlighted below:

File: AddressBook.aspx (excerpt)

<asp:TemplateField HeaderText="Department" SortExpression="DepartmentID">

<EditItemTemplate>

<asp:DropDownList id="didDdl" runat="server" DataSourceID="departmentsDataSource" DataTextField="Department" DataValueField="DepartmentID" SelectedValue='<%# Bind("DepartmentID") %>' />

</EditItemTemplate>

<InsertItemTemplate>

<asp:DropDownList ID="didDdl" runat="server" DataSourceID="departmentsDataSource" DataTextField="Department" DataValueField="DepartmentID" SelectedValue='<%# Bind("DepartmentID") %>' />

</InsertItemTemplate>

<ItemTemplate>

<asp:DropDownList ID="didDdl" runat="server" DataSourceID="departmentsDataSource" DataTextField="Department" DataValueField="DepartmentID" SelectedValue='<%# Bind("DepartmentID") %>' Enabled="False" />

</ItemTemplate>

</asp:TemplateField>

When you reload your address book now, you’ll see that the departments are displayed in a drop-down list. You can use that list when you’re inserting and editing employee data—a feature that the intranet’s users are sure to find very helpful!

More on SqlDataSource

The SqlDataSource object can make programming easier when it’s used correctly and responsibly. However, the simplicity of the SqlDataSource control comes at the cost of flexibility and maintainability, and introduces the potential for performance problems.

492

More on SqlDataSource

The main advantage of your new AddressBook.aspx file is that it’s incredibly easy and quick to implement, especially if you’re using Visual Web Developer.

However, embedding SQL queries right into your .aspx files does have a major disadvantage if you intend to grow your web site: in more complex applications containing many forms that perform many data-related tasks, storing all of your SQL queries inside different SqlDataSource controls can degenerate very quickly into a system that’s very difficult to maintain. When you’re writing real-world applications, you’ll want to have all the data access logic centralized in specialized classes. This way, a change to the database design would mean that you’d need to change only the data access code; if your application was written using SqlDataSource controls, you’d need to check each web form and update it manually.

Another disadvantage of using the SqlDataSource is that its sorting and paging features usually aren’t as fast and efficient as they could be if you used a custom SQL query that returned the data already paged and/or sorted from the database. When we use the GridView’s paging feature, for example, the SqlDataSource control doesn’t limit the number of records we read from the database. Even if only a small subset of data needs to be shown, unless customizations are implemented, the entire table will be read from the database, and a subset of the data displayed. Even if only three records need to be displayed, all of the records in the table will be returned.

An interesting property of SqlDataSource that’s worth noting is DataSourceMode, whose possible values are DataSet or SqlDataReader. The DataSet mode is the default mode, and implies that the SqlDataSource will use a DataSet object to retrieve its data. We’ll analyze the DataSet class next. The other mode is

SqlDataReader, which makes the SqlDataSource use your old friend, the SqlDataReader, behind the scenes.

So, what is this DataSet? The .NET Framework has, since version 1.0, come with a number of objects—DataSet, DataTable, DataView, SqlDataAdapter, and others—that provide disconnected data access. So, instead of having the database return the exact data you need for a certain task in the exact order in which you need it, you can use these objects to delegate some of the responsibility of filtering and ordering the data to your C# or VB code.

Both the DataSet and SqlDataReader settings of DataSourceMode have advantages and disadvantages, and the optimum approach for any task will depend on the task itself. There are circumstances in which it makes sense to store the data

493