Pergunta

Eu estou tentando preencher um DataTable, para construir uma LocalReport, usando o seguinte:

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);

Em um ponto eu notei que o relatório estava incompleto e que estava faltando um registro. Eu mudei algumas condições para que a consulta retornaria exatamente duas linhas e ... surpresa : O relatório mostra apenas uma linha, em vez de dois. Eu tentei depurá-lo para descobrir onde está o problema e eu fiquei preso em

 dt.Load(cmd.ExecuteReader());

Quando eu notei que o DataReader contém dois discos, mas o DataTable contém apenas um. Por acidente, eu adicionei uma cláusula ORDER BY à consulta e percebeu que desta vez, o relatório mostrou corretamente.
Aparentemente, o DataReader contém duas linhas, mas o DataTable só lê ambos se a string de consulta SQL contém um ORDER BY (caso contrário ele só lê a última). Alguém pode explicar por que isso está acontecendo e como ele pode ser corrigido?

Editar: Quando eu postei primeira pergunta, eu disse que estava ignorando a primeira linha; mais tarde eu percebi que na verdade apenas ler a última linha e eu editei o texto em conformidade (naquele tempo todos os registros foram agrupados em duas fileiras e parecia pular a primeira quando ele realmente só mostrou o último). Isso pode ser causado pelo fato de que ele não tem um identificador único pelo qual a distinção entre as linhas retornadas pelo MySQL assim que adicionar a declaração ORDER BY causou-lo para criar um identificador único para cada linha.
Esta é apenas uma teoria e não tenho nada para apoiá-lo, mas todos os meus testes parecem conduzir ao mesmo resultado.

Foi útil?

Solução

Eu tive mesmo problema. Tomei dica do seu blog e colocar-se a cláusula ORDER BY na consulta para que pudessem formar juntos a chave única para todos os registros retornados pela consulta. Ele resolveu o problema. Meio estranho.

Outras dicas

a questão é de vários anos, mas eu não tinha encontrado uma resposta decente, que não seja a solução acima mencionada.

Depois de brincar um pouco, descobri que o método DataTable.Load espera uma coluna de chave primária nos dados subjacentes. Se você ler a documentação com cuidado, isso se torna óbvio, embora não seja afirmado de forma muito explícita.

Se você tem uma coluna chamada "id" parece usar isso (que fixa-lo para mim). Caso contrário, ele só parece usar a primeira coluna, quer este seja único ou não, e substitui linhas com o mesmo valor nessa coluna como eles estão sendo lidos. Se você não tem uma coluna chamada "id" e sua primeira coluna não é única, eu sugiro para tentar explicitamente definir a coluna de chave primária (s) da tabela de dados antes de carregar o datareader.

Apenas no caso de alguém está tendo um problema semelhante como canceriens, eu estava usando Se DataReader.Read ... em vez de se DataReader.HasRows para verificar existência antes de chamar dt.load(DataReader) Doh!

tive o mesmo problema. É porque a chave primária em todas as linhas é o mesmo. É provavelmente o que está sendo usado para introduzir os resultados e, portanto, é só substituir a mesma linha uma e outra vez.

Datatables.Load aponta para o método de preenchimento para entender como ele funciona. Esta página afirma que é chave primária conscientes. Desde chaves primárias só pode ocorrer uma vez e são usados ??como as chaves para a linha ...

"A operação Fill em seguida, adiciona as linhas para o destino DataTable objetos no DataSet, criando os objetos DataTable se eles já não existem. Ao criar objetos DataTable, a operação Fill normalmente cria metadados nome somente coluna. No entanto, se o MissingSchemaAction propriedade é definida como AddWithKey, chaves e restrições primárias adequadas também são criados." (Http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx)

Veio este problema hoje.

Nada neste segmento fixo, infelizmente, mas então eu envolvi minha consulta SQL em outra instrução SELECT e que funciona!

Por exemplo:

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

Estranho ....

Não use

dr.Read()

porque ele se move o cursor para a próxima linha. Remover esta esperança linha que vai funcionar.

Você pode pegar a consulta real que está executando a partir profiler do SQL e tente executá-lo? Pode não ser o que você esperava.

Você obter o mesmo resultado quando se utiliza um SqlDataAdapter.Fill (dataTable)?

Você já tentou diferentes comportamentos de comando sobre o leitor? MSDN Docs

Eu sei que isto é uma questão de idade, mas para mim a pensar que trabalhou enquanto consultando um banco de dados de acesso e perceber que estava faltando uma linha de consulta, era mudar o seguinte: -

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

    if(dataset.hasrows) - Missing row appears.

Não sei por que você está perdendo a linha na tabela de dados, é possível que você precisa para fechar o leitor? Em todo caso, aqui está como eu normalmente carregar relatórios e funciona cada vez ...

        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))

curioso para ver se ele ainda acontece.

No meu caso nem ORDER BY, nem dt.AcceptChanges () está funcionando. Eu não sei porque é que problema para. Estou tendo 50 registros no banco de dados, mas ele mostra apenas 49 na tabela de dados. pular primeira linha, e se houver apenas um registro no datareader mostra nada.

O que um bizzareeee .....

Você já tentou chamar dt.AcceptChanges() após a chamada dt.Load(cmd.ExecuteReader()) para ver se isso ajuda?

Eu sei que isto é uma questão de idade, mas eu estava experimentando o mesmo problema e nenhuma das soluções mencionadas aqui ajudou.

No meu caso, usando um alias no colum que é usado como o PrimaryKey resolveu o problema.

Assim, em vez de

SELECT a
     , b
FROM table

Eu costumava

SELECT a as gurgleurp
     , b
FROM table

e funcionou.

Eu tive o mesmo problema .. não usados ??dataReader.Read () em todos .. ele leva o ponteiro para a próxima linha. Em vez disso usar diretamente datatable.load (dataReader).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top