2011-06-15 62 views
0
conn = new SqlConnection(connectionString); 
comm = new SqlCommand("Products.sl_Cartridges", conn); 
comm.CommandType = CommandType.StoredProcedure; 
comm.Parameters.Add(new SqlParameter("@PrinterID", SqlDbType.Int)); 
comm.Parameters["@PrinterID"].Value = varPrinterID;conn.Open(); 

reader = comm.ExecuteReader(); 
Cartridges.DataSource = reader; 
Cartridges.DataBind(); 
reader.Close(); 

有没有办法在上面添加一些代码来挑选出这个中继器的第一个数据行的值?这会让我省下一笔单独的SP,这似乎是一种浪费。对不起,.Net很新奇!ASP.Net C#使用第一行读取器

+0

为什么编写单独的SP看起来像是浪费?这需要1分钟的时间,这是一个非常好的习惯,这对服务器来说几乎是额外的努力,并且可以通过线路传输更少的数据。我已经完成了1000个存储过程处理所有不同数据量的项目。 – mellamokb 2011-06-15 16:17:14

回答

1

如果返回的结果集非常小,则可以使用SqlDataAdapter转储到DataTable并获取第一行。这是很简单,但效率很低,因为它浪费了一堆不必要的数据流量,如果结果大小大:

SqlDataAdapter adp = new SqlDataAdapter(comm); 
DataTable dt = new DataTable(); 
adp.Fill(dt); 

Cartridges.DataSource = new [] { dt.Rows[0] }; 
Cartridges.DataBind(); 

编辑:dt.Rows [0]是无效的,因为它必须是一个列表。替换为dt.Rows.Take(1)(如果您有LINQ)或new [] { dt.Rows[0] }

否则,您将需要从第一行抓住所有的值在读者和他们转储到可以绑定到墨盒控制的对象:

var firstRow = new { Name = reader[0], Value = reader[1], Blah = reader[2], ... }; 
Cartridges.DataSource = firstRow; 
Cartridges.DataBind(); 

另外,如果你使用一个控制如DetailsView而不是Repeater,它将一次只自动显示一行,并且可以将其过滤为单行。

+0

试过: conn.Open(); reader = comm.ExecuteReader(); var firstRow = new {cartPicThumb = reader [2],cartPriceFrom = reader [5]}; Cartridges.DataSource = firstRow; Cartridge.DataBind(); reader.Close(); 获取错误:无数据存在时尝试读取无效。 – ComfortablyNumb 2011-06-15 19:22:07

+0

@ComfortablyNumb:在抓取第一条记录之前,您可能必须调用'reader.Next()'一次。 – mellamokb 2011-06-15 19:37:53

+0

抱歉无法让它工作或使用SqlAdapter:一个无效的数据源正被用于墨盒。有效的数据源必须实现IListSource或IEnumerable。 – ComfortablyNumb 2011-06-16 12:42:45

0

不是一个很好的解决方案,但你可以添加一个处理Repeater的ItemDataBound事件,并设置每个项目的Visible属性(除了第一个)为false:

标记:

<asp:Repeater ID="repeater" runat="server" 
    OnItemDataBound="repeater_ItemDataBound"> 

代码隐藏:

private bool first = true; 
void repeater_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (!first) e.Item.Visible = false; 
    first = false; 
}