2012-04-02 6 views
3

Ich schreibe eine C# -Anwendung für SQL Server und Oracle-Datenbanken, die in meiner Anwendungskonfigurationsdatei definiert ist. Wenn ich den Code in der SQL Server-Umgebung ausführen, funktioniert es einwandfrei. Ich bekomme die richtigen Ergebnisse.OracleDataAdapter füllt DataTable nicht aus Abfrage

Der Arbeits SQL Server-Code ist hier:

sqlConn.Open(); 
stmt = "SELECT ACTION_ID, ACTION FROM DB.ACTIONS WHERE ACTION_DATE < GETDATE() AND STATUS = 'Pending'"; 
SqlDataAdapter sqlAdapt = new SqlDataAdapter(stmt, sqlConn); 
sqlAdapt.Fill(dt); 
sqlConn.Close(); 

Der Oracle-Code, der folgt nicht funktioniert als:

oraConn.Open(); 
stmt = "SELECT ACTION_ID, ACTION FROM DB.ACTIONS WHERE ACTION_DATE < SYSDATE AND STATUS = 'Pending'"; 
OracleDataAdapter oraAdapt = new OracleDataAdapter(stmt, oraConn); 
oraAdapt.Fill(dt); 
oraConn.Close(); 

Ich versuche, das Datatable dt mit den Ergebnissen zu füllen. Ich habe versucht, zuerst ein DataSet zu verwenden und die DataTable mit dem DataSet zu füllen, aber das hat in Oracle nicht funktioniert, als es in SQL Server getan hat. Es scheint, als würde etwas ganz einfach fehlen.

Ich bekomme keine Fehler, ich bekomme nur eine 0-Ergebnismenge von Oracle, obwohl ich weiß, dass dort Daten zu ziehen sind.

+0

Welche Version von Oracle verwenden Sie, und verwenden Sie eine Schemabenennung in Oracle? – Turbot

+0

Ich benutze 10.2. Das Schema ist in diesem Beispiel "DB", obwohl es wirklich etwas anderes ist. Ich bin in der Lage, die Abfrage in SQL Developer und ich bekomme 2 Ergebnisse. – Matthew

+0

Oracle Database 10g Express Edition Version 10.2.0.1.0 - Produkt PL/SQL Release 10.2.0.1.0 - Produktion CORE \t 10.2.0.1.0 \t Produktion TNS für 32-Bit-Windows: Version 10.2.0.1.0 - Produktion NLSRTL Version 10.2.0.1.0 - Produktion – Matthew

Antwort

3

Das Problem war das DBO-Konto, das ich in der Datenbank anmeldete, hatte keine Berechtigungen für die Tabelle. Ich lief ein einfaches Stipendium und es hat super funktioniert.

GRANT SELECT ON DB.ACTIONS TO USER; 
0

Abfrage direkt in der Datenbank ausführen (zum Beispiel mit sqlplus, TOAD, SQLDEveloper etc.). Gibt es etwas zurück? Wenn nicht:

a) In SQL Server Textvergleich (STATUS = 'Pending') ist Groß-und Kleinschreibung in Oracle unterscheidet Groß-und Kleinschreibung. Vielleicht haben Sie Daten in der Statusspalte wie zum Beispiel 'PENDING'?

b) Ist ACTION_DATE ein Datums-Datentyp? Wenn es varchar ist, wird es nicht funktionieren.

Ich hoffe, es hilft.

+0

Die Abfrage läuft in SQLDeveloper einwandfrei. Die Feldtypen sind korrekt. Oracle: ACTION_DATE ist DATE und der Feldwert für den Status ist Pending – Matthew

+0

Andere mögliche Gründe: 1) Vielleicht ist es zu offensichtlich, haben Sie Testdaten mit SQLDeveloper eingefügt? Wenn ja, haben Sie die Transaktion durchgeführt? 2) Verwenden Sie den gleichen Benutzernamen, um eine Verbindung zu db in SQLDeveloper und in Ihrer C# -App herzustellen? Ich bezweifle, dass dies der Fall ist, aber es ist möglich, in Oracle eine Richtlinie zu erstellen, die einem Benutzer einige Datensätze anzeigt, die sie vor den anderen Benutzern verbergen (Sicherheit auf Zeilenebene, in Oracle VPD genannt). – arturro

+0

Es war ein Berechtigungsproblem auf dem Tisch. Ich musste GRANT SELECT ON DB.ACTIONS TO ROLE; Der OracleDataAdapter kannte die Tabellenspalten, aber würde mir nicht sagen, ob ich die Berechtigung hätte, auf die Tabelle zuzugreifen, obwohl ich mich als DBO angemeldet habe. Danke euch allen. – Matthew

0

Mein Vorschlag ist, Ihren Code zu ändern, um die Diagnoseebene zu trennen.

1) ersetzen Sie die Aussage mit einfachem "select sysdate from dual;" um zu sehen, ob Zeilen zurückgegeben werden.

2) Wenn nichts zurückkommt, könnte es sich um Ihr Verbindungsproblem handeln. Zeigen Sie Ihre Verbindungseigenschaft an.

3) Wenn etwas zurückkommt, aber nicht zum Dataset gefüllt wird, versuchen Sie, Orakel-Leser zu verwenden, um die Ausgabe zu werfen und tatsächlich das Ergebnis zu sehen.

Hoffe, das wird Ihnen helfen.

+0

Wenn ich den Code für den Orakel-Abschnitt zu stmt = "SELECT 1 AS ACTION_ID, 'TEST' ALS ACTION FROM SYS.DUAL" ändern, bekomme ich ein Ergebnis in meiner DataTable – Matthew

+0

Es war ein Berechtigungsproblem in der Tabelle. Ich musste GRANT SELECT ON DB.ACTIONS TO ROLE; Der OracleDataAdapter kannte die Tabellenspalten, aber würde mir nicht sagen, ob ich die Berechtigung hätte, auf die Tabelle zuzugreifen, obwohl ich mich als DBO angemeldet habe. Danke euch allen. – Matthew