2017-03-28 1 views
1

Ich habe ein plötzliches und seltsames Problem mit DataTable. Ich verwende C# mit MySQL-Datenbank, um ein System zu entwickeln, und ich versuche, benutzerdefinierte Berichte zu exportieren. Das Problem ist, dass mein DataTable irgendwie nur ein Ergebnis erhält (ich habe meine Abfrage auf MySQL getestet und sollte etwa 30 Ergebnisse in der xls-Datei und der DataTable sein). Seltsamerweise werden diese Funktionen in anderen Teilen des Systems verwendet, um andere Arten von Berichten zu exportieren und funktionieren perfekt. Dies ist die Auswahlfunktion, die ich verwende:C#: DataTable erhält nur eine Zeile des Suchergebnisses

public DataTable selectBD(String tabela, String colunas) { 
    var query = "SELECT " + colunas + " FROM " + tabela; 
    var dt = new DataTable(); 

    Console.WriteLine("\n\n" + query + "\n\n"); 

    try 
    { 
     using (var command = new MySqlCommand(query, bdConn)) { 
      MySqlDataReader reader = command.ExecuteReader(); 
      dt.Load(reader); 
      reader.Close(); 
     } 
    } 
    catch (MySqlException) { 
     return null; 
    } 
    bdConn.Close(); 

    return dt; 
} 

Und das ist meine Frage:

SELECT 
    cpf_cnpj, nomeCliente, agenciaContrato, contaContrato, 
    regionalContrato, carteiraContrato, contratoContrato, 
    gcpjContrato, avalistaContrato, enderecoContrato, 
    telefoneContrato, dataChegadaContrato, dataFatoGerContrato, 
    dataPrimeiraParcelaContrato, dataEmissaoContrato, valorPlanilhaDebitoContrato 
FROM 
    precadastro 
    INNER JOIN 
    contrato 
     ON precadastro.cpf_cnpj = contrato.FK_cpf_cnpj 
    LEFT JOIN faseprocessual 
     ON contrato.idContrato = faseprocessual.FK_idContrato 

Und das ist die result of the query on SQLyog

ich getestet habe und die DataTable durch die zurück Funktion erhalten nur die eine Zeile, und es ist nicht die erste Zeile der MySQL-Ergebnisse. Jemand hatte diese Art von Problem schon einmal?

+0

Was ist Ihre Verbindungszeichenfolge? –

+0

dies: "Persist Sicherheit Info = False; Server = localhost; DataBase = absadvocacia; Uid = root; Pwd = '' '';" Aber abgesehen davon funktioniert die Verbindung mit der Datenbank perfekt. Login, Einfügen, Aktualisieren, Löschen ... Eigentlich benutze ich sogar die gleichen Funktionen an anderer Stelle (um Benutzerüberwachungsbericht zu exportieren), und es funktioniert. –

+0

Haben Sie versucht, während (reader.Read()) {} –

Antwort

0

DataTable Load erwartet Primärschlüssel von Ihren Daten (DataReader) und versucht, es aus übergebenen Zeilen zu erraten. Da es keinen solchen Schlüssel gibt, rät Load Methode es ist die erste Spalte (cpf_cnpj). Die Werte in dieser Spalte sind jedoch nicht eindeutig, daher wird jede Zeile durch die nächste Zeile überschrieben, und das Ergebnis ist nur eine Zeile in Ihrer DataTable. Es ist das Problem, das seit Jahren besteht, und ich bin nicht sicher, es gibt eine Lösung, um sie alle zu beherrschen. :)

können Sie versuchen:

  • Änderung Abfrage, so dass einige eindeutige Werte in die erste Spalte bekommen (leider kann ich nicht etwas Einmaliges in Ihrem Screenshot sehen) oder verketten zwei oder mehr Werte eindeutig zu erhalten Wert.
  • Bereiten Sie DataTable selbst vor, indem Sie Spalten erstellen (diese Spiegelungsstruktur des Resultsets), und durchlaufen Sie dann DataReader, um Daten zu kopieren.
  • einige autoincrement-Wert in der Abfrage hinzufügen (oder temporäre Tabelle mit auto_increment Spalte machen dann diese Tabelle ausfüllen)

Last Vorschlag so etwas wie dies sein könnte (ich mit mySql nicht viel gearbeitet haben, so ist dies einige Vorschlag i gegoogelt haben :)):

SELECT 
    @i:[email protected]+1 AS id, 
    cpf_cnpj, nomeCliente, agenciaContrato, contaContrato, 
    regionalContrato, carteiraContrato, contratoContrato, 
    gcpjContrato, avalistaContrato, enderecoContrato, 
    telefoneContrato, dataChegadaContrato, dataFatoGerContrato, 
    dataPrimeiraParcelaContrato, dataEmissaoContrato, valorPlanilhaDebitoContrato 
FROM 
    precadastro 
    INNER JOIN 
    contrato 
     ON precadastro.cpf_cnpj = contrato.FK_cpf_cnpj 
    LEFT JOIN faseprocessual 
     ON contrato.idContrato = faseprocessual.FK_idContrato 
    CROSS JOIN (SELECT @i:= 0) AS i 

hier answer on SO die auto-Nummer in Abfrage verwendet.

+0

Vielen Dank für die Antwort, es hat mir sehr geholfen. Ich habe versucht, "@i: = @ i + 1 AS-ID" und "(SELECT @i: = 0) AS i" und es funktionierte auf MySQL-Konsole und SQLyog, aber nicht auf meine C# -Code und Visual Studio-Abfrage Editor. Ich habe ein wenig mehr suchen und herausfinden, dass es wahrscheinlich ist, weil es wirklich nicht getan werden kann - es scheint, dass es blockiert wird, um SQL-Injektion zu verhindern. Aber so habe ich nochmal auf meine Datenbank geschaut und ich hatte den Primärschlüssel meiner Tabelle "contrato" (was in diesem Fall immer eindeutig ist), also nehme ich ihn und ignoriere ihn beim Generieren der .xls-Datei und funktioniert einfach fein. Vielen Dank Mann. –