2011-09-09 6 views
6

enter image description hereQuery - righe vengono restituite quando query viene eseguita nel navigatore SQL, ma non nel mio c programma #

Aggiornamento:

Questa è la query dal debugger, che è stato recuperato da un costruttore di stringa:

{SELECT * FROM FCR.V_REPORT WHERE DATE BETWEEN to_date('14/09/2001' , 'dd/mm/yyyy') AND to_date('30/09/2011' , 'dd/mm/yyyy')} 

Se si rimuovono le parentesi graffe e post-it in Navigator, funziona.

originale:

Ho un problema quando si esegue il mio programma. La query in sql navigator restituisce 192 righe ma quando eseguo la query su C# (visual studio 2010) la query restituisce 0 righe. Qui di seguito è il mio codice C#:

public static DataTable GetReport(string date1, string date2) 
{ 
    DatabaseAdapter dba = DatabaseAdapter.GetInstance(); 
    string SqlQuery = 
    string.Format(@"SELECT * 
        FROM FCR.V_REPORT 
        WHERE DATE BETWEEN to_date('{0}' , 'dd/mm/yyyy') 
        AND to_date('{1}' , 'dd/mm/yyyy')", date1, date2); 
    OracleDataReader reader = dba.QueryDatabase(SqlQuery); 
    DataTable dt = new DataTable(); 
    dt.Load(reader); 
    int temp = dt.Rows.Count; 
    return dt; 
} 

Questa è la query che sto usando in SQL navigatore (che restituisce 192 righe):

SELECT * 
FROM FCR.V_REPORT 
WHERE DATE BETWEEN to_date('01/01/2001' , 'dd/mm/yyyy') 
AND to_date('30/09/2011' , 'dd/mm/yyyy') 
+1

puoi incollare il valore attuale di 'SqlQuery' (voglio dire, puoi superare il risultato della chiamata' string.Format')? –

+1

@Steve B ..ho appena modificato con i risultati – mikespiteri

+1

SqlQuery è null ... prendilo *** dopo *** la chiamata di string.Format, e per favore, pubblica il valore della variabile, non uno screenshot del debugger. –

risposta

2

Prova a far cadere la vista e creare nuovamente. Assicurati di aver corretto anche gli alias.

5

Scommetto che le date passate dal tuo c programma # sono diversi perché la tua istruzione sql è identica. Metti un punto di interruzione e verifica che le date siano esattamente le stesse. Verificare inoltre che data1 e data2 vengano inoltrati nell'ordine appropriato.

+2

Ho controllato e ricontrollato le date. Ecco perché ho postato qui perché è piuttosto strano. Ho fatto un breakpoint nel mio programma per verificare se il conteggio delle righe aumenta ma rimane 0 – mikespiteri

1

Quando si affronta questo tipo di problema, in genere è preferibile non formulare troppe ipotesi riguardo a dove l'errore proviene. Se si ha accesso alla casella, eseguo una traccia e mi assicuro che le istruzioni eseguite siano effettivamente identiche. Se sono identici, sai che hai un errore programmatico sul lato di ricezione o di elaborazione della tua applicazione.

È possibile modificare la propria istruzione per inserire i risultati in una tabella temporanea e verificare che le 192 righe previste siano presenti. Se stai eseguendo esattamente la stessa affermazione e la tabella temporanea mostra che stai ottenendo i risultati, ti aspetti che hai ulteriormente ridotto il problema e puoi iniziare a cercare gli errori dell'applicazione.

1

Supponendo che il codice C# invii la query corretta al database, ci sono diversi modi per Oracle di eseguire la stessa query in modo diverso a seconda della sessione. Potrebbe essere necessario ottenere un DBA coinvolto per capirlo (ad esempio, osservando l'effettiva dichiarazione eseguita in v $ sql), o almeno per escludere questi casi strani.

NLS_DATE_FORMAT

Se la colonna DATA viene memorizzato come una stringa, ci sarebbe una conversione implicita ad una data. Se SQL Navigator utilizza un diverso NLS_DATE_FORMAT di C#, la conversione potrebbe creare date diverse. Anche se fossero diversi, c'è una buona possibilità che tu riceva un errore, non solo 0 righe.

Virtual Private Database

VPD può aggiungere un predicato a ogni query, possibilmente utilizzando diverse informazioni di sessione. Ad esempio, se il programma che ha creato la sessione è come '% Navigator%', potrebbe aggiungere 'where 1 = 0' a ogni query. (So ​​che sembra pazzesco, ma ho visto qualcosa di molto simile.)

Advanced Query Rewrite

Questo è pensato per viste materializzate. Ma alcune persone lo usano per le correzioni delle prestazioni, un po 'come i contorni memorizzati. E alcuni malvagi lo usano per riscrivere la tua query in una query completamente diversa. Impostazioni di sessione diverse, come QUERY_REWRITE_INTEGRITY e CURSOR_SHARING, potrebbero spiegare perché la query funziona su una sessione ma non su un'altra. Parlando di CURSOR_SHARING, ciò potrebbe causare alcuni rari problemi se è impostato su SIMILAR o FORCE.

1

Ho incontrato la stessa situazione abbastanza spesso con altri strumenti di sviluppo e SQL Server. Nel mio caso ho scoperto che nello strumento di query avrei due output, i record in un datagrid e il messaggio "rows affected" in un riquadro dei risultati. Tuttavia, nel mio IDE di sviluppo non vedrei dati (a meno che non abbia controllato per set di dati aggiuntivi). Per qualche motivo restituirebbe le righe interessate come primo set di risultati. Quando ho disattivato l'opzione rowcount nella query stessa, i dati si sono presentati in entrambe le posizioni.

Si potrebbe anche usare un analizzatore di protocollo (ad esempio, Ethereal) e catturare il traffico TCP/IP per verificare che le richieste sono identiche sul filo. Anche questo mi ha aiutato in un pizzico.

Buona fortuna.

jl

1

mi chiedo è questo è lo stesso problema come la tua domanda here.

La tua chiamata string.Format non specifica il formato dei valori date1 e date2 nella stringa SQL stessa. Quindi utilizza il valore predefinito DateTime.ToString() di date1 e date2, che potrebbe essere qualcosa come '16/09/2011 12:23:34 'e quindi non corrisponde al formato specificato nell'istruzione to_date.

Prova questo:

string SqlQuery = string.Format(@"SELECT * FROM V_REPORT WHERE DATE BETWEEN 
            to_date('{0:dd/MM/yyyy}' , 'dd/mm/yyyy') 
            AND 
            to_date('{1:dd/MM/yyyy}' , 'dd/mm/yyyy')", 
            date1, 
            date2);  
+0

grazie a tutti per il vostro aiuto. Ho risolto il problema. Non sono sicuro di cosa non andasse, ma ho abbandonato il tavolo della vista e l'ho creato di nuovo e ha funzionato. Ancora non so cosa stava succedendo perché tutto sembrava a posto. Grazie ancora – mikespiteri

Problemi correlati