मेरे आवेदन में मुझे विभिन्न संग्रहीत प्रक्रियाओं द्वारा रिकॉर्ड किए गए रिकॉर्ड की एक सूची प्रदर्शित करने की आवश्यकता है। प्रत्येक स्टोर प्रक्रिया विभिन्न प्रकार के रिकॉर्ड लौटाती है (यानी कॉलम की संख्या और कॉलम प्रकार अलग हैं)।सी # फ़ंक्शन सामान्य वस्तुओं/इकाइयों को वापस करने के लिए
मेरा मूल विचार प्रत्येक प्रकार के रिकॉर्ड के लिए एक वर्ग बनाना था और एक ऐसा फ़ंक्शन बनाना था जो संबंधित संग्रहीत प्रक्रिया को निष्पादित करेगा और सूची < MyCustomClass> वापस कर देगा। कुछ इस तरह:
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;
}
यह ठीक काम करता है, लेकिन जैसा कि मैं अपने ग्राहक कोड में उन रिकॉर्ड में हेरफेर करने की जरूरत नहीं है (मैं सिर्फ उन्हें अपने आवेदन परत में एक चित्रमय नियंत्रण करने के लिए बाध्य करने की जरूरत है) यह वास्तव में नहीं है ऐसा करने के लिए समझदारी करें क्योंकि मैं बहुत से कस्टम वर्गों के साथ समाप्त होता हूं जिसका मैं वास्तव में उपयोग नहीं करता।
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;
}
यह एक DataTable जो मैं जो कुछ भी नियंत्रण मैं अपने अनुप्रयोग परत में उपयोग करने के लिए बाध्य कर सकते हैं देता है: मैं इस जो करता है चाल पाया। मैं सोच रहा हूं कि डेटाटेबल का उपयोग करना वास्तव में जरूरी है।
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;
}
किसी भी अन्य विचार:
मैं वस्तुओं की एक सूची गुमनाम वर्गों का उपयोग कर बनाया नहीं लौट सकते हैं? असल में मैं सिर्फ फ़ंक्शन को 'कुछ' वापस करने के लिए चाहता हूं जिसे मैं एक ग्राफिकल नियंत्रण से जोड़ सकता हूं और मैं कस्टम कक्षाएं बनाना नहीं चाहता क्योंकि वे वास्तव में उपयोग नहीं किए जाएंगे। सबसे अच्छा तरीका क्या होगा?
बीटीडब्ल्यू, एसक्लडाटा रीडर के लिए सबसे अच्छा अभ्यास उपयोग की अगली शैली है: (var rdr = cmd.ExecuteReader() {जबकि (rdr.Read() {..}} - तो यह स्वचालित रूप से बंद हो जाएगा (डिस्प्ले) – abatishchev
अच्छी तरह से देखा गया। – Anthony