Uygulamamda, farklı saklı yordamlar tarafından döndürülen kayıtların bir listesini görüntülemem gerekiyor. Her bir mağaza prosedürü farklı kayıt türleri döndürür (yani sütun sayısı ve sütun tipi farklıdır).C# işlevi, genel nesneler/varlıklar döndürecek işlev
Orijinal düşüncem, her kayıt türü için bir sınıf oluşturmak ve karşılık gelen saklı yordamı yürütün ve List < MyCustomClass> öğesini döndüren bir işlev oluşturmaktı. Böyle bir şey:
public class MyCustomClass1
{
public int Col1 { get; set; } //In reality the columns are NOT called Col1 and Col1 but have proper names
public int Col2 { get; set; }
}
public static List<MyCustomClass1> GetDataForReport1(int Param1)
{
List<MyCustomClass1> output = new List<MyCustomClass1>();
using (SqlConnection cn = new SqlConnection("MyConnectionString"))
using (SqlCommand cmd = new SqlCommand("MyProcNameForReport1", cn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Param1", SqlDbType.Int).Value = Param1;
SqlDataReader rdr=cmd.ExecuteReader();
int Col1_Ordinal = rdr.GetOrdinal("Col1");
int Col2_Ordinal = rdr.GetOrdinal("Col2");
while (rdr.Read())
{
output.Add(new MyCustomClass1
{
Col1 = rdr.GetSqlInt32(Col1_Ordinal).Value,
Col2 = rdr.GetSqlInt32(Col2_Ordinal).Value
});
}
rdr.Close();
}
return output;
}
Bu çalışıyor ancak müvekkilimin kodunda bu kayıtların işlemek gerekmez olarak (sadece benim uygulama katmanında bir grafik kontrol etmelerini bağlamak gerekir) gerçekten değil Bunu gerçekten kullanamayacağım özel sınıflarla dolduracağım gibi yapmak için mantıklı ol.
public static DataTable GetDataForReport1(int Param1)
{
DataTable output = new DataTable();
using (SqlConnection cn = new SqlConnection("MyConnectionString"))
using (SqlCommand cmd = new SqlCommand("MyProcNameForReport1", cn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Param1", SqlDbType.Int).Value = Param1;
output.Load(cmd.ExecuteReader());
}
return output;
}
Bu benim uygulama katmanında kullanılacak olursa olsun kontrol bağlanabilen bir DataTable döndürür: Bunu yapan hile buldum. DataTable kullanmanın gerçekten gerekli olup olmadığını merak ediyorum.
public static List<object> GetDataForReport1(int Param1)
{
List<object> output = new List<object>();
using (SqlConnection cn = new SqlConnection("MyConnectionString"))
using (SqlCommand cmd = new SqlCommand("MyProcNameForReport1", cn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Param1", SqlDbType.Int).Value = Param1;
SqlDataReader rdr=cmd.ExecuteReader();
int Col1_Ordinal = rdr.GetOrdinal("Col1");
int Col2_Ordinal = rdr.GetOrdinal("Col2");
while (rdr.Read())
{
output.Add(new
{
Col1 = rdr.GetSqlInt32(Col1_Ordinal).Value,
Col2 = rdr.GetSqlInt32(Col2_Ordinal).Value
});
}
rdr.Close();
}
return output;
}
Diğer fikirler:
Ben nesnelerin bir listesi anonim sınıfları kullanılarak oluşturulmuş dönmek olmaz mı? Temel olarak, sadece bir grafik kontrolüne bağlanabileceğim 'bir şey' döndürme işlevini istiyorum ve gerçekten kullanılamadıkları için özel sınıflar oluşturmak zorunda kalmamayı tercih ediyorum. En iyi yaklaşım ne olurdu?
btw, SqlDataReader için en iyi uygulama sonraki kullanım şeklidir: using (var rdr = cmd.ExecuteReader() {while (rdr.Read() {..}} - böylece otomatik olarak kapatılacak (atılacak) – abatishchev
Kuyu lekeli .. – Anthony