2014-10-03 3 views
0

이전 webforms 애플리케이션의 일부를 다시 쓰고 있습니다. select 쿼리를 수행하는 함수를 만들고 싶습니다. SQL 쿼리와 매개 변수를 제공하고 나머지는 수행합니다.MySqlDataReader를 변수에 저장하십시오.

지금까지 나는이있다 :

MySqlDataReader DoRead(string query, params MySqlParameter[] pms) 
{ 
    MySqlCommand myCommand; 

    if (!myConnection) 
     myConnection = new MySqlConnection(sCon); 

    if (myConnection.State != ConnectionState.Open) 
    { 
     myConnection.Close(); 
     myConnection.Open(); 
    } 

    myCommand    = myConnection.CreateCommand(); 
    myCommand.CommandText = query; 
    foreach (MySqlParameter p in pms) 
    { 
     myCommand.Parameters.Add(p); 
    } 

    return myReader = myCommand.ExecuteReader(); 
} 

내 질문에 난 그냥 내가 바로 연결 및 독자를 닫을 수있는 변수에 myReader의 결과를 저장하는 대신 myReader의 같은 변수를 반환 할 수있다 이 함수 대신에 메인 코드에?

+1

물론 가능합니다. 결과 집합을 DataTable에 저장하고 대신 해당 DataTable을 반환 할 수 있습니다. 이와 함께 위의 게시 된 코드에서 논리적 인 실수는 거의 없습니다. – Rahul

+0

짧은 대답 : 예. 리더로부터 모든 데이터를'DataTable' 또는'List '로 읽어 들이고 연결을 닫고 그 데이터 테이블이나리스트를 반환하면됩니다. 그러나 노트 - 당신은 datareader 자체를 저장하지 말고, 데이터를 읽고 저장해야합니다. –

답변

2

물론. 그리고 당신이 정확히 이유로 일을해야하는지 정확히 당신이 주 :

그래서 난 기능

당신이 직면하고있는 문제에 즉시 연결 및 독자를 닫을 수는 사용하는 것입니다 판독기의 첫 번째 위치는 개방형 데이터 스트림에 연결됩니다. 따라서 코드 소비가 독자를 기다리고 있다면이를 수정하기 위해 변경해야 할 것입니다.

나중에이 응용 프로그램을 어떻게 사용합니까? 제네릭 함수를 만들려고한다면 결과도 꽤 일반 적이어야합니다. 따라서 코드를 사용하는 것이 모두 독자적인 작업을하는 경우 DataSet을 반환 할 수 있으며 소비 코드가이를 대신 할 수 있습니다. 이런 식으로 뭔가 :

var result = new DataSet(); 

using(var myConnection = new MySqlConnection(sCon)) 
{ 
    myConnection.Open(); 
    var myCommand = myConnection.CreateCommand(); 
    myCommand.CommandText = query; 
    foreach (var p in pms) 
     myCommand.Parameters.Add(p); 
    var myAdapter = new MySqlDataAdapter(myCommand); 

    myAdapter.Fill(result); 
} 

return result; 

(나뿐만 아니라 여기에 또 다른 변화를 한 것으로 참고 연결 객체가 메소드의 범위에 현지해야 공유 연결 개체는 잠재적 인 문제의 세계를 열어, 한.. 그 중에서도 연결 상태를 닫거나 열 수있는 조건을 완전히 수정하려고 시도 했으므로 문제가 완전히 해결되고 연결을 완료하면 처분됩니다.

관련 문제