제 애플리케이션에서 다른 저장 프로 시저에서 반환 한 레코드 목록을 표시해야합니다. 각 상점 프로시 저는 여러 유형의 레코드를 리턴합니다 (즉, 컬럼 수와 컬럼 유형이 다름).C# 함수가 일반 객체/엔티티를 반환합니다.
내 원래의 생각은 각 레코드 유형에 대한 클래스를 만들고 해당 저장 프로 시저를 실행하고 List < 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을 반환 :이 수행하는 트릭을 발견했다. 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;
}
다른 아이디어 :
나는 개체의 목록이 익명 클래스를 사용하여 만든 반환 할 수 없습니다? 기본적으로 나는 함수가 그래픽 컨트롤에 바인딩 할 수있는 '무언가'를 반환하기를 원하며 사용자 정의 클래스를 만들 필요가 없으므로 실제로 사용하지 않을 것입니다. 최선의 접근 방법은 무엇입니까?
btw, SqlDataReader의 가장 좋은 방법은 다음 스타일입니다. using (var rdr = cmd.ExecuteReader() {while (rdr.Read() {..}} - 자동으로 닫힙니다. – abatishchev
잘 찾아 냈습니다 ... – Anthony