+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 5 su 5

[C#,Oracle] Attesa dopo ricevimento dati

  1. #1
    cldparisi non è in linea Novello
    Ho queste poche e banali righe:

    OracleConnection Connection;
    Connection = new OracleConnection();
    Connection.ConnectionString = "...";
    Connection.Open();

    OracleCommand Command;
    Command = new OracleCommand();
    Command.Connection = Connection;
    Command.CommandType = System.Data.CommandType.Text;
    Command.CommandText = sql;

    DataAdapter = new OracleDataAdapter(Command);
    Table = new DataTable("Table");
    DataAdapter.Fill(Table);


    Creo una connessione la apro, l'attribuisco ad un command e tramite un
    DataAdapter riempio una tabella.
    Successivamente per verificare se il problema fosse del dataadapter invece
    che riempire una tabella ho utilizzato un datareader:

    OracleDataReader dr = Command.ExecuteReader();

    Ho queste poche e banali righe:

    OracleConnection Connection;
    Connection = new OracleConnection();
    Connection.ConnectionString = "...";
    Connection.Open();

    OracleCommand Command;
    Command = new OracleCommand();
    Command.Connection = Connection;
    Command.CommandType = System.Data.CommandType.Text;
    Command.CommandText = sql;

    DataAdapter = new OracleDataAdapter(Command);
    Table = new DataTable("Table");
    DataAdapter.Fill(Table);


    Creo una connessione la apro, l'attribuisco ad un command e tramite un
    DataAdapter riempio una tabella.
    Successivamente per verificare se il problema fosse del dataadapter invece
    che riempire una tabella ho utilizzato un datareader:

    OracleDataReader dr = Command.ExecuteReader();

    Ho queste poche e banali righe:

    OracleConnection Connection;
    Connection = new OracleConnection();
    Connection.ConnectionString = "...";
    Connection.Open();

    OracleCommand Command;
    Command = new OracleCommand();
    Command.Connection = Connection;
    Command.CommandType = System.Data.CommandType.Text;
    Command.CommandText = sql;

    DataAdapter = new OracleDataAdapter(Command);
    Table = new DataTable("Table");
    DataAdapter.Fill(Table);


    Creo una connessione la apro, l'attribuisco ad un command e tramite un
    DataAdapter riempio una tabella.
    Successivamente per verificare se il problema fosse del dataadapter invece
    che riempire una tabella ho utilizzato un datareader:

    OracleDataReader dr = Command.ExecuteReader();

    Il problema è sempre lo stesso nel momento in cui eseguo il reader o faccio
    il fill con il dataadpter l'operazione è lunghissima.

    Alcune considerazioni:
    - la query è banale e fatta tramite sqldeveloper (o altro programma simile)
    è istantanea
    - tramite uno sniffer di rete abbiamo verificato che il server db
    restituisce subito il dato ma il programma "sta fermo" come se aspettasse un
    qualche timeout


    Aggiungo la connectionstring in caso possa dipendere da questo:

    "Data Source=(DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = server1)(PORT =1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = server2)(PORT =1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = server3)(PORT =1521))
    (LOAD_BALANCE = yes)
    (CONNECT_DATA =(SERVER = DEDICATED)
    (SERVICE_NAME = nomeservice))); User ID=user; Password=pwd;"

    Qualcuno ha qualche idea di cosa possa essere il problema?

    Grazie

    --
    Claudio P.

  2. #2
    L'avatar di bumm
    bumm non è in linea Topo di biblioteca Ultimo blog: [VB2010] ComboBox ed Enumeratori
    Per prima cosa provi a capire qual'e l'operazione che richiede il tempo. Per fare questo, puoi creare un StringBuilder e assegnare la riga con orario e nome del commando prima e dopo ogni istruzione eseguita. Es:
    StringBuilder sb = new StringBuilder();
    ...
    ...
    sb.AppendLine(String.Format(@"{0} : AproConnessione", DateTime.Now().ToString());
    Connection.Open();
    sb.AppendLine(String.Format(@"{0} : ConnessioneAperta", DateTime.Now().ToString());
    ...
    ...
    sb.AppendLine(String.Format(@"{0} : Inizio popolare dati", DateTime.Now().ToString());
    DataAdapter.Fill(Table);
    sb.AppendLine(String.Format(@"{0} :  Fine popolazione", DateTime.Now().ToString());
    ...
    ...
    MessageBox.Show(sb.ToString());
    ...
    //Scritto a mano - controlla la sintassi
    
    Una volta determinato il "colpevole" fammi sapere, vedremo di risolvere la cosa.

    P.S.

    Alcune domande: quante righe restituisce la query? Quantità delle colonne? Tipo Delle colonne?
    Hai qualche queryAnalyzer ?
    P.P.S.
    Puoi usare anche MsAccess e vedere i tempi effettivi di caricamento.
    ℹ️ Leggi di più su bumm ...

  3. #3
    cldparisi non è in linea Novello
    Una volta determinato il "colpevole" fammi sapere, vedremo di risolvere la cosa.
    Senza nemmeno loggare ti posso dire che il problema è in:
    DataAdapter.Fill(Table);
    e quando ho rpovato con il dtareader era nell'execute.
    Il problema me lo da anche quando torna una sola riga e su una query banale e succede solo "dal cleinte", mi hanno detto che con uno strumento di sniff hanno verificato che il db risponde subito e poi il programma "resta fermo" come in attesa di un qualcosa (timeout?).
    La stessa query lanciata da sqldeveloper è praticamente istantanea.
    Unica differenza è che i dati sono nel tnsname mentre io li scrivo direttamente in connectionstring

  4. #4
    L'avatar di bumm
    bumm non è in linea Topo di biblioteca Ultimo blog: [VB2010] ComboBox ed Enumeratori
    Beh, credo che il problema e nel adapter(visto che la query l'hai controllato ed e performante). Provi ad usare uno diverso:
    Ci sono 3 tipi disponibili:

    System.Data.Odbc;
    using System.Data.Odbc;
    ...
    OdbcConnection  oracleConn = new OdbcConnection();
    oracleConn.ConnectionString = "DSN=odbcName;UID=nome;PWD=password;
                                   DRIVER={Microsoft ODBC for Oracle};
                                   SERVER=oracleServerNameOr IPAddress;";
    oracleConn.Open();
    
    
    System.Data.OracleClient.dll - scaricabile dal sito di microsoft
    using System.Data.OracleClient;
    ...
    OracleConnection oracleConn = new OracleConnection();
    oracleConn.ConnectionString = "user id=nome;
                                   data source=oracleSN;
                                   password=passwodr";
    oracleConn.Open();
    
    
    Oracle.DataAccess.dll - provider scaricabile dal sito di oracle
    using Oracle.DataAccess.Client;
    ...
    OracleConnection oracleConn = new OracleConnection();
    oracleConn.ConnectionString = "User Id=user;Password=password;
                                   Data Source=oracleSN;";
    oracleConn.Open()
    
    ℹ️ Leggi di più su bumm ...

  5. #5
    cldparisi non è in linea Novello
    Quote Originariamente inviato da bumm Visualizza il messaggio
    Provi ad usare uno diverso:
    Ci sono 3 tipi disponibili:
    Alla fine ho cambiato Provider e ne ho usato un quarto OleDb ed effettivamente i tempi sono nettamente migliorati.

    Grazie

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. [Oracle]Migrazione Interbase to Oracle
    Da cosimo_cin nel forum Oracle
    Risposte: 1
    Ultimo Post: 11-11-2009, 16:20
  2. recupero dati da stored procedure oracle
    Da bariloche nel forum Visual Basic 6
    Risposte: 1
    Ultimo Post: 05-10-2009, 11:25
  3. Importo in Excel dati da Oracle
    Da Renoirway nel forum Microsoft Excel
    Risposte: 11
    Ultimo Post: 15-05-2009, 13:27
  4. Risposte: 1
    Ultimo Post: 27-05-2008, 15:02