ASP.Net C#使用读者的第一行

问题描述

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非常新!     

解决方法

        如果返回的结果集很小,则可以使用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]无效,因为它必须是一个列表。替换为ѭ2have(如果您有LINQ)或3ѭ。 否则,您将需要从阅读器的第一行获取所有值,并将它们转储到可以绑定到Cartridges控件的对象中:
var firstRow = new { Name = reader[0],Value = reader[1],Blah = reader[2],... };
Cartridges.DataSource = firstRow;
Cartridges.DataBind();
另外,如果使用DetailsView之类的控件代替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;
}