2011-10-20 21 views
14

döndü sadece tek bir satırı uygula?benim kodunda bu oldukça çok yazmak gibi DataReader

+3

sorgu üzerinde kontrole sahip Belki, bunun bir 'TOP 1' yapabilirsiniz .. Eğer veritabanınızın bütünlüğünü kontrol etmek isterseniz, bunu yapmak yerine '' WHERE' '' tablonuzun sütunlarına '' UNIQUE INDEX '' koymalısınız. –

+1

SQL-sorgunuza TOP 1'i eklemenin yolu nedir? – Stecya

+4

ÜST 1 istemiyorum, bir istisna istiyorum. Onlar aynı şey değiller. – fearofawhackplanet

cevap

15

Bilmiyorum, ama bu kod bir uzantısı yöntem haline yetki verilebilen:

public static R Single<R>(this DataReader reader, Func<DataReader,R> selector) { 
    R result = default(R); 
    if (reader.Read()) 
     result = selector(reader); 
    if (reader.Read()) 
     throw new DataException("multiple rows returned from query"); 
    return result; 
} 

böyle kullanılacak:

using (var reader = cmd.ExecuteReader()) 
{ 
    User u = reader.Single(r => new User((int)r["UserId"], r["UserName"].ToString())) 
} 

kod tekrarına sizi kaydediliyor.

+0

'SqlCommand' için bir uzantı yöntemi oluşturarak daha da çoğaltılmış kodlardan kaçınabildik. 'Kullanıcı u = cmd.Single (...);' –

+0

Elbette, bu düşük seviyeli API üzerinde, bir çift uzantı yöntemleri ile oldukça kullanışlı şeyler için şekillendirebilirsiniz :) – flq

+0

Uzatma sevmiyorum 'SqlCommand' çok fazla çünkü herhangi bir kullanışlı arayüz uygulamıyor. – fearofawhackplanet

1

Verilerinizi almak için bir sql kullanıyorsanız, bu, bir veri okuyucusu kullanmanız gereken her durumda bu tür kodlamaları kaldırmanıza izin vererek yardımcı olabilir.

SELECT TOP ([Number of rows you want to be selected]) 
FROM [Table Name] 
WHERE [Condition] 

Ex:

SELECT TOP (1) 
FROM tblUsers 
WHERE Username = 'Allan Chua' 

Başka uç kullanımı saklı prosedürler, SQL sorgusu ve gereksiz kodlama tekrarını en aza indirmek kullanılması.

8

Hedefinizin ne olduğuna bağlı olarak bu yardımcı olabilir veya olmayabilir. Uygun bir istisna atmak için birden fazla satırın döndüğünü saptamanız gerekiyorsa, bu yardımcı olmaz.

Yalnızca bir sonucun döndüğünden emin olmak istiyorsanız, bu yöntemi kullanarak potansiyel olarak bir performans düşüşü alabilirsiniz. Anladığım kadarıyla, veri sağlayıcıları, tek bir satır sonucunun beklentisiyle sorgulamayı optimize etmek için bunu kullanabilirler.

Her durumda, veri okuyucunuzu oluşturmak için SqlCommand.ExecuteReader komutunu kullanın, ancak CommandBehavior sayımından (özellikle CommandBehavior.SingleRow) bir argüman iletin. ExecuteReader bunu kabul etmek için aşırı yüklenmiştir.

SqlCommand.ExecuteReader overload

CommandBehavior enum

Yani kod aşağıdaki gibi görünebilir:

using (var reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) 
{ 
    if (reader.Read()) 
    { 
     result = new User((int)reader["UserId"], reader["UserName"].ToString()); 
    } 
} 
İlgili konular