programing

데이터 리더의 다중 테이블

closeapi 2023. 9. 13. 22:38
반응형

데이터 리더의 다중 테이블

제가 평소에.DataSet매우 유연하기 때문입니다.최근에 코드 최적화 작업을 할당 받았습니다. 데이터베이스에 대한 히트를 줄이기 위해 절차에 따라 두 개의 쿼리를 변경합니다.one Query는 다음을 반환합니다.count그리고 다른 하나는 그것을 돌려줍니다.actual data. 즉, 나의stored procedure테이블 두 개를 반환합니다.이제, 저는 두 표를 어떻게 읽는지 압니다.DataSets, 하지만 나는 두 테이블 모두를 사용해서 읽어야 합니다.DataReader. 그것을 찾아 나는 이것을 찾았습니다.

저는 기사를 따라 제 코드를 이렇게 적었습니다.

dr = cmd.ExecuteReader();
while (dr.Read())
{


}
if (dr.NextResult()) // this line throws exception
{
   while (dr.Read())
{

하지만 저는 dt에서 예외를 받고 있습니다.다음 결과.예외는 다음과 같습니다.

Invalid attempt to call NextResult when reader is closed.

위의 오류도 구글에서 검색했지만 여전히 문제를 해결할 수 없습니다.어떤 도움이라도 주시면 감사하겠습니다.여러 개의 테이블을 읽어야 합니다.datareader, 이것이 가능합니까?

작업이 끝나면 연결, 데이터 판독기 및 명령이 닫히므로 데이터 판독기 근접 예외가 발생하지 않습니다.

또한 이렇게 체크해보세요.if(reader.NextResult())다음 결과가 있는지 확인하기 위해,

using (SqlConnection connection = new SqlConnection("connection string here"))
{
    using (SqlCommand command = new SqlCommand
           ("SELECT Column1 FROM Table1; SELECT Column2 FROM Table2", connection))
    {
        connection.Open(); 
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                MessageBox.Show(reader.GetString(0), "Table1.Column1");
            }

            if(reader.NextResult())
            {
               while (reader.Read())
              {
                MessageBox.Show(reader.GetString(0), "Table2.Column2");
              }
            }
        }
    }
}

이 문제를 재현하려고 시도했습니다(또한 한 판독기에서 여러 개의 테이블을 사용해 본 적이 없기 때문입니다.하지만 예상대로 작동하니 관련 코드를 누락하신 것 같습니다.

여기 제 테스트 코드가 있습니다.

using (var con = new SqlConnection(Properties.Settings.Default.ConnectionString))
{
    using (var cmd = new SqlCommand("SELECT TOP 10 * FROM tabData; SELECT TOP 10 * FROM tabDataDetail;", con))
    {
        int rowCount = 0;
        con.Open();
        using (IDataReader rdr = cmd.ExecuteReader())
        {
            while (rdr.Read())
            {
                String object1 = String.Format("Object 1 in Row {0}: '{1}'", ++rowCount, rdr[0]);
            }
            if (rdr.NextResult())
            {
                rowCount = 0;
                while (rdr.Read())
                {
                    String object1 = String.Format("Object 1 in Row {0}: '{1}'", ++rowCount, rdr[0]);
                }
            }
        }
    }
}

저는 프라네 라나의 답변을 최대한 작게 유지하는 것을 좋아하기 때문에 이를 토대로 만들었습니다.

string rslt = "";
using (SqlDataReader dr = cmd.ExecuteReader())
{
    do
    {
        while (dr.Read())
        {
            rslt += $"ReqID: {dr["REQ_NR"]}, Shpr: {dr["SHPR_NR"]}, MultiLoc: {dr["MULTI_LOC"]}\r\n";
        }
    } while (dr.NextResult());
}

문제가 오래되었지만 정답이 틀렸다는 것을 알게 되었습니다.다음은 제가 하는 방법입니다.

        List<DataTable> dataTables = new();
        using IDataReader dataReader = command.ExecuteReader();
        do
        {
            DataTable dataTable = new();
            dataTable.Load(dataReader);
            dataTables.Add(dataTable);
        }
        while (!dataReader.IsClosed);

언급URL : https://stackoverflow.com/questions/12969318/multiples-table-in-datareader

반응형