高分,大量数据怎样使用<%= XXX %>的方式绑定到SqlDataReader数据源?

SqlClient 2003-08-23 11:40:05
问题是这样,我希望显示一个HTML表,后台数据源是SqlDataReader,仅有一条记录,但是此记录的字段非常多,大概有50个。
HTML表格代码我已经写好,现在剩下的工作就是把DataReader中的内容绑定到网页上。我用了很多种方法,使用Repeater等控件没有必要,因为仅仅就是一条记录,没有必要使用多行绑定,使用asp:Label控件太麻烦。
我想使用类似于asp方式的<% *** %>这样的网页直接绑定方法,直接在aspx中显示数据,然后用Page.DataBind()方法显示内容。不知道是否可行。
我用了这种方法,总是显示错误,请哪位高手给个代码例子。

注:后台代码中的DataReader已经测试成功,测试我绑定了DataGrid控件,成功显示出内容,后台的DataReader对象我命名为protected data,可以在aspx中使用,请给出例子,谢谢!!
...全文
89 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
caoit 2003-08-24
  • 打赏
  • 举报
回复
DataRow dr;
DataRow CreateDataRow()
{
SqlConnection myConnection = new SqlConnection("...");
SqlDataAdapter myCommand = new SqlDataAdapter("..",myConnection);
DataSet ds = new DataSet();
myCommand.Fill(ds, "table");
dr=ds.Tables["table"].Rows[0];
return dr;

}

<%=dr["colName"] %>
LevinForum 2003-08-24
  • 打赏
  • 举报
回复
.....

这里有一个简单的例子:


<%@ Page Language=C# %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="server">

//这些都可以在后台的cs中定义

protected SqlConnection conn;
protected SqlDataReader Reader;
protected void PrepareReader()
{
conn=new SqlConnection("server=(local);uid=sa;pwd=;database=northwind");
SqlCommand cmd=new SqlCommand("SELECT TOP 1 * From Customers",conn);
conn.Open();
Reader=cmd.ExecuteReader();
Reader.Read();
}
protected void CloseReader()
{
Reader.Close();
conn.Close();
}

override protected void OnLoad(EventArgs e)
{
base.OnLoad(e);
PrepareReader();

DataBind();
}
override protected void OnUnload(EventArgs e)
{
base.OnUnload(e);
CloseReader();
}

</script>
<html>
<title>直接输出<%=Reader.GetValue(Reader.GetOrdinal("CustomerID"))%></title>
<body>
<table border="1" cellpadding="4">
<colgroup>
<col bgcolor="darkgray"></col>
<col bgcolor=""></col>
<col bgcolor="darkgray"></col>
<col bgcolor=""></col>
</colgroup>
<tr>
<td>绑定</td>
<td>绑定</td>
<td>输出</td>
<td>输出</td>
</tr>
<tr>
<td>CustomerID</td>
<td>
<%#Reader.GetValue(Reader.GetOrdinal("CustomerID"))%>
</td>
<td>Name</td>
<td>
<%=Reader.GetValue(Reader.GetOrdinal("CompanyName"))%>
</td>
</tr>
<tr>
<td>ContactName</td>
<td>
<%#Reader.GetValue(Reader.GetOrdinal("ContactName"))%>
</td>
<td>ContactTitle</td>
<td>
<%=Reader.GetValue(Reader.GetOrdinal("ContactTitle"))%>
</td>
</tr>
<tr>
<td>Address</td>
<td colspan=3>
<%#Reader.GetValue(Reader.GetOrdinal("Address"))%>
</td>
</tr>
</table>
</body>
</html>
SunMiddle 2003-08-24
  • 打赏
  • 举报
回复
C#

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>

<html>
<head>

<link rel="stylesheet"href="intro.css">
</head>

<script language="C#" runat=server>

void SubmitBtn_Click(Object sender, EventArgs e) {

SqlConnection myConnection = new SqlConnection("initial catalog=pubs;data source=127.0.0.1;user id=sa");
SqlDataAdapter myCommand = new SqlDataAdapter("select * from Titles where type='" + Category.SelectedItem.Value + "'", myConnection);

DataSet ds = new DataSet();
myCommand.Fill(ds, "Titles");

MyList.DataSource = ds.Tables["Titles"].DefaultView;
MyList.DataBind();
}

</script>

<body>

<center>

<form action="intro9.aspx" method="post" runat="server">

<asp:adrotator AdvertisementFile="ads.xml" BorderColor="black" BorderWidth=1 runat="server"/>

<h3> 姓名:<asp:textbox id="Name" runat="server"/>

类别:<asp:dropdownlist id="Category" runat=server>
<asp:listitem >psychology</asp:listitem>
<asp:listitem >business</asp:listitem>
<asp:listitem >popular_comp</asp:listitem>
</asp:dropdownlist>

</h3>

<asp:button text="查找" OnClick="SubmitBtn_Click" runat="server"/>

<p>

<asp:datalist id="MyList" repeatcolumns="2" borderwidth="0" runat="server">

<ItemTemplate>

<table>
<tr>

<td>
<img src='<%# DataBinder.Eval(Container.DataItem, "title_id", "/quickstart/aspplus/images/title-{0}.gif") %>'>
</td>

<td width=250 valign=top>

<b><%# DataBinder.Eval(Container.DataItem, "title") %></b>

<br><br>

价格:<%# DataBinder.Eval(Container.DataItem, "price", "${0}") %>
</td>

</tr>
</table>

</ItemTemplate>

</asp:datalist>

</form>

</center>

</body>

</html>
SunMiddle 2003-08-24
  • 打赏
  • 举报
回复
为什么不用他呢?
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>

<html>
<head>

<link rel="stylesheet"href="intro.css">
</head>

<script language="VB" runat=server>

Sub SubmitBtn_Click(Sender As Object, E As EventArgs)

Dim DS As DataSet
Dim MyConnection As SqlConnection
Dim MyCommand As SqlDataAdapter

MyConnection = New SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes")
MyCommand = New SqlDataAdapter("select * from Titles where type='" + Category.SelectedItem.Value + "'", myConnection)

DS = new DataSet()
MyCommand.Fill(DS, "Titles")

MyList.DataSource = DS.Tables("Titles").DefaultView
MyList.DataBind()

End Sub

</script>

<body>

<center>

<form action="intro9.aspx" method="post" runat="server">

<asp:adrotator AdvertisementFile="ads.xml" BorderColor="black" BorderWidth=1 runat="server"/>

<h3> 姓名:<asp:textbox id="Name" runat="server"/>

类别:<asp:dropdownlist id="Category" runat=server>
<asp:listitem >psychology</asp:listitem>
<asp:listitem >business</asp:listitem>
<asp:listitem >popular_comp</asp:listitem>
</asp:dropdownlist>
</h3>

<asp:button text="查找" OnClick="SubmitBtn_Click" runat="server"/>

<p>

<asp:datalist id="MyList" repeatcolumns="2" borderwidth="0" runat="server">

<ItemTemplate>

<table>
<tr>

<td>
<img src='<%# DataBinder.Eval(Container.DataItem, "title_id", "/quickstart/aspplus/images/title-{0}.gif") %>'>
</td>

<td width=250 valign=top>

<b><%# DataBinder.Eval(Container.DataItem, "title") %></b>

<br><br>

价格:<%# DataBinder.Eval(Container.DataItem, "price", "${0}") %>
</td>

</tr>
</table>

</ItemTemplate>

</asp:datalist>

</form>

</center>

</body>

</html>

neodotnet 2003-08-24
  • 打赏
  • 举报
回复
<%= %>

我总感觉这种方法不是地道的ASP.NET,不知道他的效率是不是比绑定低些.

类似帖主的情况我都是用Repeater绑定,虽然只有一条记录


<asp:Repeater id="Repeater1" runat="server">
<ItemTemplate>
<table>
<tr height="25">
<td width="40%"><%# DataBinder.Eval(Container.DataItem, "字段名1")%></td>
<td width="60%"><%# DataBinder.Eval(Container.DataItem, "字段名2")%></td>
</tr>
</table>
</ItemTemplate>
</asp:Repeater>
neodotnet 2003-08-23
  • 打赏
  • 举报
回复
按思归老大的方法,用程序动态生成表格!!
saucer 2003-08-23
  • 打赏
  • 举报
回复
if you want to do that way, why use ASP.NET? it is a total waste
LevinForum 2003-08-23
  • 打赏
  • 举报
回复
直接:

<% PrepareReader(); %>

<%=Reader.GetValue(1)%>

<% CloseReader(); %>

-------------------------------
我的论坛基本就是直接用<%=%>的。
其实ASP.NET下用传统的<%=%>来写网页,条理仍然很清晰。

http://forum.lostinet.com/上面有论坛界面的代码
详细看:
http://forum.lostinet.com/Topic.Aspx?TopicID=3226196&_lastreply=371
saucer 2003-08-23
  • 打赏
  • 举报
回复
create html table on the fly, for example

if (DataReader.Read())
{
Table t = new Table();
for (int i=0; i < DataReader.FieldCount; i++)
{
TableRow tr = new TableRow();
TableCell tc = new TableCell();
tc.Text = DataReader.GetValue(i).ToString();
tr.Cells.Add(tc);
t.Rows.Add(tr);
}

this.Controls.Add(t);
}
saucer 2003-08-23
  • 打赏
  • 举报
回复
tables doesn't support databinding, take a look at the databoundtable example provided by the author of Developing Microsoft ASP.NET Server Controls and Components

http://www.nikhilk.net/Content/Presentations/TechEd2003_Code.zip

in your case, you need to do

<table id="mytable" runat="server">
<tr height="25">
<td width="40%">XXX</td>
<td width="60%">YYY</td>
</tr>
</table>

in your code, do
mytable.Rows[0].Cells[0].InnerHtml = data("字段名1").ToString();
mytable.Rows[0].Cells[1].InnerHtml = data("字段名2").ToString();
///
  • 打赏
  • 举报
回复
思归你是在美国还是国内啊?什么时候搞张照片给大家看啊
SqlClient 2003-08-23
  • 打赏
  • 举报
回复
To eagle_hb(亚瑟)
你的方法也出错,根本不能用<%#DataBinder.EVAL(Container.DataItem,"你的字段名")%>
方法。只能用
<%= ... %>方法
这个方法是Response.Write()的简化形式,我查了MSDN。
SqlClient 2003-08-23
  • 打赏
  • 举报
回复
搞定了,出错的原因出来了
可以使用这样进行绑定
假设在后台代码中使用protected定义一个data变量,指向DataReader或者是DataSet对象,那么在html代码中可以这样使用
<%= data("字段名") %> //此时绑定DataReader
<%= data.Tables("表名").Rows(记录号).Item("字段名") %> //绑定DataSet

以上代码测试成功。

出错的原因找出来了,是我在后台代码中两次使用了DataReader读取数据库,每次使用后台数据库访问类都有一个SqlConnection.Open()方法,但是在第一次使用SqlDataReader的时候,数据库没有关闭,所以当第二次使用的时候,出现“数据库联接没有关闭stats="Open"”错误。
出错的原因是我为了节省资源,在一个aspx中使用datareader对象绑定两次。
我写的这个aspx有大概50个字段进行<%= XXX %>这样的绑定,下面还有一个DataGrid对象绑定另一个表的内容,我为了简单,这两个数据源都使用的是DataReader,当第一个dataReader进行Page.DataBind()的时候,我忘了这个方法是DataBind()的Page级方法,所以当DataGrid的DataBind()没有执行完毕的时候,第一个DataReader对象的数据库连接是无法关闭的,所以使用DataGrid的数据绑定的时候,第一个DataReader仍然保持连接,致使DataGrid的DataBind()方法出错。
最后我使用了一个DataSet保存所有的两个数据库内容,在base.Unload()方法内使用了DataSet的Dispose()方法,解决了问题。
eagle_hb 2003-08-23
  • 打赏
  • 举报
回复
<%#DataBinder.EVAL(Container.DataItem,"你的字段名")%>
SqlClient 2003-08-23
  • 打赏
  • 举报
回复
to : neodotnet(Neo.NET):
使用你的法子,没有定义DataSource,aspx怎么知道把data这个SqlDataReader当作数据源?
你的这个法子是使用DataGrid和DataList绑定数据的方法。没有用阿
SqlClient 2003-08-23
  • 打赏
  • 举报
回复
3q, neodotnet(Neo.NET),我试试看,谢谢。
neodotnet 2003-08-23
  • 打赏
  • 举报
回复
<table>
<tr height="25">
<td width="40%"><%# DataBinder.Eval(Container.DataItem, "字段名1") %></td>
<td width="60%"><%# DataBinder.Eval(Container.DataItem, "字段名2") %></td>
</tr>
</table>
SqlClient 2003-08-23
  • 打赏
  • 举报
回复
还是思归老大厉害,不过我的HTML表格已经写好,比如说
<table>
<tr height="25">
<td width="40%">XXX</td>
<td width="60%">YYY</td>
</tr>
</table>
我的要求是在XXX和YYY上面使用<% ... %>这样的方式绑定数据,
我用了这个法子:
首先在后台代码中定义
C#:
protected SqlDataReader data;
vb.net:
Protected data As SqlDataRrader
然后在Page_Load里面获得这个变量的引用(这个引用我在一个类库里面返回的),然后
C#:
private void Page_Load(Object sender,EventArgs e)
{
data = ......; //获得引用
if(data.Read())
{
Page.DataBind();
}
}
vb.Net
Private Sub Page_Load(sender As Object,e As EventArgs)Handles MyBase.Load
' 获得引用
data = ........
If data.Read() Then
Page.DataBind()
End If
End Sub

然后在html代码里面,在上面的table里面使用:
<table>
<tr height="25">
<td width="40%"><%= data("字段名1")</td>
<td width="60%"><%= data(字段名2")</td>
</tr>
</table>

不知道这样的思路是否正确?我没有试验,请大家指教。
sincere1314 2003-08-23
  • 打赏
  • 举报
回复
思归老大是每行显示一个字段,你也可以动态生成列td
fq_ln 2003-08-23
  • 打赏
  • 举报
回复
生成动态表格当然不错,但是,我就是不明白,为什么不使用DataGrid呢?
你把DataGrid的页眉去掉不就行了?那样就可以直接显示你的数据了。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧