문제

나는 다음을 사용하여 로컬 보고서를 구축하기 위해 데이터 가능을 채우려고 노력하고 있습니다.

MySqlCommand cmd = new MySqlCommand();
cmd.Connection = new MySqlConnection(Properties.Settings.Default.dbConnectionString);
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT ... LEFT JOIN ... WHERE ..."; /* query snipped */

// prepare data
dataTable.Clear();
cn.Open();
// fill datatable
dt.Load(cmd.ExecuteReader());
// fill report
rds = new ReportDataSource("InvoicesDataSet_InvoiceTable",dt);
reportViewerLocal.LocalReport.DataSources.Clear();
reportViewerLocal.LocalReport.DataSources.Add(rds);

어느 시점에서 나는 보고서가 불완전하고 한 레코드가 없다는 것을 알았습니다. 쿼리가 정확히 두 행을 반환 할 수 있도록 몇 가지 조건을 변경했습니다. 놀라다: 보고서는 2 개 대신 단 하나의 행만을 보여줍니다. 문제가 어디에 있는지 찾기 위해 디버깅을하려고했는데

 dt.Load(cmd.ExecuteReader());

내가 알았을 때 DataReader 두 개의 레코드를 포함합니다 DataTable 하나만 포함합니다. 우연히, 나는 추가했다 ORDER BY 쿼리에 대한 조항과 이번에는 보고서가 올바르게 나타 났음을 알았습니다.

분명히, DataReader에는 두 개의 행이 포함되어 있지만 SQL 쿼리 문자열에 ORDER BY (그렇지 않으면 마지막을 읽습니다). 누구든지 왜 이런 일이 일어나고 있는지, 어떻게 해결 될 수 있는지 설명 할 수 있습니까?

편집하다:질문을 처음 게시했을 때, 나는 그것이 첫 번째 줄을 건너 뛰고 있다고 말했다. 나중에 나는 그것이 실제로 마지막 행 만 읽고 그에 따라 텍스트를 편집했다는 것을 깨달았습니다 (그 당시 모든 레코드는 두 행으로 그룹화되었으며 실제로 마지막으로 표시 될 때 첫 번째를 건너 뛰는 것으로 보입니다). 이것은 MySQL이 반환 한 행을 구별 할 수있는 고유 식별자가 없기 때문에 ORDER BY 명령문으로 인해 각 행에 고유 식별자가 생성되었습니다.
이것은 단지 이론 일 뿐이며 그것을 뒷받침 할 것이 없지만 모든 시험이 같은 결과로 이어지는 것 같습니다.

도움이 되었습니까?

해결책

나는 같은 문제가 있었다. 나는 귀하의 블로그에서 힌트를 가져 와서 쿼리에 의해 반환 된 모든 레코드에 대한 고유 한 키를 함께 형성 할 수 있도록 쿼리에있는 절을 통해 쿼리에 주문을 설정했습니다. 문제를 해결했습니다. 좀 이상해.

다른 팁

질문은 몇 년이되었지만 위에서 언급 한 해결 방법 외에는 괜찮은 답을 찾지 못했습니다.

약간의 희미한 후에는 DataTable.Load 메소드가 기본 데이터에서 기본 키 열을 기대한다는 것을 알았습니다. 문서를주의 깊게 읽으면 매우 명시 적으로 언급되어 있지는 않지만 이것은 분명해집니다.

"ID"라는 열이 있다면 그것을 사용하는 것 같습니다 (나를 위해 고정). 그렇지 않으면 독창적이든 아니든 첫 번째 열을 사용하는 것처럼 보이며 읽는 것과 동일한 값의 행을 덮어 씁니다. "ID"라는 열이없고 첫 번째 열이 고유하지 않은 경우, 데이터 레인더를로드하기 전에 데이터 테이블의 기본 키 열을 명시 적으로 설정하는 것이 좋습니다.

누군가가 암과 비슷한 문제를 겪는 경우를 대비하여 DataReader.Read ... 대신 DataReader.HasRows 전화하기 전에 존재를 확인합니다 dt.load(DataReader) 도!

같은 문제가있었습니다. 모든 행의 기본 키는 동일하기 때문입니다. 결과를 키우는 데 사용되는 것일 수 있으므로 동일한 행을 반복해서 덮어 쓰는 것입니다.

DataTables.LOAD는 작동 방식을 이해하기 위해 채우기 메소드를 가리 킵니다. 이 페이지에서는 기본 키 인식이라는 것을 나타냅니다. 기본 키는 한 번만 발생할 수 있으며 행의 키로 사용되므로 ...

"채우기 작업은 데이터 세트의 대상 데이터 가능한 객체에 행을 추가하여 아직 존재하지 않는 경우 데이터 가능한 객체를 만듭니다. DataTable 객체를 작성할 때 채우기 작업은 일반적으로 열 이름 메타 데이터 만 생성합니다. AddwithKey를 위해 적절한 기본 키와 제약 조건도 생성됩니다. " (http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx)

오늘이 문제를 발견했습니다.

이 스레드의 어떤 것도 불행히도 고칠 수 없었지만, 다른 선정 된 문으로 SQL 쿼리를 래핑하면 작동합니다!

예 :

SELECT * FROM (
    SELECT ..... < YOUR NORMAL SQL STATEMENT HERE />
) allrecords

이상한....

사용하지 마십시오

dr.Read()

포인터를 다음 행으로 이동하기 때문입니다. 이 라인을 제거하십시오.

SQL Profiler에서 실행중인 실제 쿼리를 가져 와서 실행 해보겠습니까? 당신이 기대했던 것이 아닐 수도 있습니다.

sqldataadapter.fill (datatable)을 사용할 때 동일한 결과를 얻습니까?

독자에서 다른 명령 동작을 시도해 보셨습니까? MSDN 문서

나는 이것이 오래된 질문이라는 것을 알고 있지만, 나에게는 액세스 데이터베이스를 쿼리하고 쿼리에서 1 행이 누락되었음을 알면 다음을 변경하는 것이 었습니다.

    if(dataset.read())  - Misses a row.

    if(dataset.hasrows) - Missing row appears.

왜 데이터 가능에 행을 놓치고 있는지 잘 모르겠습니다. 독자를 닫아야 할 가능성이 있습니까? 어쨌든 여기에 보고서를 일반적으로로드하는 방법이 있으며 매번 작동합니다 ...

        Dim deals As New DealsProvider()
        Dim adapter As New ReportingDataTableAdapters.ReportDealsAdapter
        Dim report As ReportingData.ReportDealsDataTable = deals.GetActiveDealsReport()
        rptReports.LocalReport.DataSources.Add(New ReportDataSource("ActiveDeals_Data", report))

그것이 여전히 일어나는지 궁금합니다.

제 경우에는 주문이나 dt.acceptchanges ()가 작동하지 않습니다. 나는 왜 그 문제인지 모르겠다. 데이터베이스에 50 개의 레코드가 있지만 DataTable에는 49 만 표시됩니다. 첫 번째 행을 건너 뛰고 DataReader에 레코드가 하나만 있으면 전혀 표시되지 않습니다.

얼마나 bizzareee .....

당신은 전화를 시도 했습니까? dt.AcceptChanges()dt.Load(cmd.ExecuteReader()) 그것이 도움이되는지 확인하려면 전화합니까?

나는 이것이 오래된 질문이라는 것을 알고 있지만, 나는 같은 문제를 겪고 있었고 여기에 언급 된 해결 방법 중 어느 것도 도움이되지 않았습니다.

제 경우에는 PrimaryKey 문제를 해결했습니다.

그래서 대신

SELECT a
     , b
FROM table

나는 사용했다

SELECT a as gurgleurp
     , b
FROM table

그리고 그것은 효과가있었습니다.

나는 같은 문제가 있었다 .. DataReader.Read ()를 전혀 사용하지 마십시오. 다음 행으로 포인터를 가져갑니다. 대신 직접 DataTable.Load (DataReader)를 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top