将数据从SQLDataSource绑定到标签

ASP.NET中的标签控件没有智能标记,允许您选择一个数据源,所以乍一看,它不容易看到如何将从SQLDataSource或AccessDataSource控件绑定到标签的值。以下是如何以编程方式访问此类数据源返回的数据并将其应用于非拖动控件。

以编程方式访问SQLDataSource或AccessDataSource控件的内容,您需要显式调用其Select()方法。此方法接受DataSoursElectarguments的单个输入参数。此参数可以包含有关申请的过滤器的信息或按顺序的列。例如,在使用可排序的GridView时,排序列调用SELECT()方法,并通过其SortExpression属性在用户选择排序的列名中将其进行排序属性。如果您不希望DataSource进行排序或过滤,则会传入DataSoursElectArguments.empty。

根据DataSource控件的DataSourceMode,调用Select()方法时返回两个对象中的一个。如果将数据库可设置为 DataReader.,返回DataReader对象。返回的数据类型(SQLDATAREADER,OLEDBDATAREADER,ODBCDATAREADER等)完全取决于所用的提供程序类型 - 换句话说,无论您是使用OLEDB提供程序,SQLClient提供商等。它与之无关 类型 DataSource Control。下面的示例都是查询Access数据库,但是一个使用accessDataSource控件,另一个使用SQLDataSource控件。返回OLEDBDATAREADERS,因为它是用于连接的OLEDBPROVIDER库。

如果DataSourceMode被设置为数据集,或者未设置为DataSet(这意味着使用数据集的默认设置)返回的对象是DataView。 DataView就像类固醇上的Databable。它公开了允许您过滤和排序数据并绑定数据的方法。 DataView包含DataRowView对象的集合,它表示返回的结果中的每一行。

因此,使用DataReader,您将在DataReader.read()操作期间访问值,同样地与您使用的纯ADO.NET代码相同,而在与数据集中使用时,您需要创建一个对象适当的类型 - DataView,然后迭代DataRowView集合来访问值。在此,代码与使用普通ADO.NET直接从DataSet的表集的访问值相似。

下面的代码显示了ASPX文件的内容,其中包含两个标签控件和两个SQLDataSource控件。每个SQLDataSource控件都有其数据源模式设置为备用值 - DataSet和DataReader,两个都有一个定义的OnSelecting事件,其中分配了EmployEeD参数的值:

<asp:Label ID="Label1" runat="server" /> <asp:Label ID="Label2" runat="server" />

<asp:SqlDataSource 
	ID="SqlDataSource1" 
	runat="server" 
	ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
	ProviderName="<%$ ConnectionStrings:ConnectionString.ProviderName %>" 
	DatasourceMode="DataSet"
	SelectCommand="SELECT [LastName], [FirstName] FROM [Employees] WHERE ([EmployeeID] = ?)" 
	OnSelecting="SqlDataSource1_Selecting">
    <SelectParameters>
        <asp:Parameter Name="EmployeeID" Type="Int32" />
    </SelectParameters>
</asp:SqlDataSource>

<asp:SqlDataSource
	ID="SqlDataSource2" 
	runat="server"
	ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
	ProviderName="<%$ ConnectionStrings:ConnectionString.ProviderName %>" 
	DatasourceMode="DataReader."
	SelectCommand="SELECT [LastName], [FirstName] FROM [Employees] WHERE ([EmployeeID] = ?)" 
	OnSelecting="SqlDataSource2_Selecting">
    <SelectParameters>
        <asp:Parameter Name="EmployeeID" Type="Int32" />
    </SelectParameters>
</asp:SqlDataSource>

以下代码段显示ASPX.CS文件内容,其中参数值在选择事件处理程序中设置。在PAGE_LOAD方法中,访问每个SQL数据源控件返回的数据,并将值托运到标签。访问方法取决于DataSource模式,但对于SQLDataSource和AccessDataSource相同:

[C#]
protected void Page_Load(object sender, EventArgs e)
{

    DataView dvSql = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);
    foreach (DataRowView drvSql in dvSql)
    {
        Label1.Text = drvSql["FirstName"].ToString();
    }

    OLEDBDATAREADER. rdrSql = (OLEDBDATAREADER.)SqlDataSource2.Select(DataSourceSelectArguments.Empty);
    while (rdrSql.Read())
    {
        Label2.Text = rdrSql["LastName"].ToString();

    }
    rdrSql.Close();
}



protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
    e.Command.Parameters["EmployeeID"].Value = 2;
}

protected void SqlDataSource2_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
    e.Command.Parameters["EmployeeID"].Value = 2;
}
[VB]
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)

Dim dvSql As DataView = 
    DirectCast(SqlDataSource1.Select(DataSourceSelectArguments.Empty), DataView)
    For Each drvSql As DataRowView In dvSql
        Label1.Text = drvSql("FirstName").ToString()
    Next

Dim rdrSql As OLEDBDATAREADER. = 
    DirectCast(SqlDataSource2.Select(DataSourceSelectArguments.Empty), OleDbDataReader)
    While rdrSql.Read()

        Label2.Text = rdrSql("LastName").ToString()
    End While
    rdrSql.Close()
End Sub

Protected Sub SqlDataSource1_Selecting(ByVal sender As Object, 
    ByVal e As SqlDataSourceSelectingEventArgs)
    e.Command.Parameters("EmployeeID").Value = 2
End Sub

Protected Sub SqlDataSource2_Selecting(ByVal sender As Object, 
    ByVal e As SqlDataSourceSelectingEventArgs)
    e.Command.Parameters("EmployeeID").Value = 2
End Sub

使用SQL Server使用此技术 - 或者更具体地说是SQLClient提供程序,更改 OLEDBDATAREADER.sqldatareader. in the above code.