2011-06-15 78 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; 
}