Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1

    [4.0-C#] Problema apertura/chiusura connessione

    ho questa classe:
    codice:
        public class Decoder
        {
            private SqlConnection conn = new SqlConnection("Data Source=10.0.5.131;Initial Catalog=TELENEWS;Persist Security Info=True;User ID=sa;Password=sa");
    
            public DataSet ddlNetwork()
            {
                SqlDataAdapter adapter = new SqlDataAdapter("select_soluzioni", conn);
                try
                {
                    conn.Open();
                    DataSet ds = new DataSet();
                    adapter.Fill(ds);
                    return ds;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    conn.Close();
                }
            }
    
            public SqlDataReader ddlGruppi(int soluzione)
            {
                SqlDataReader reader = null;
                try
                {
                    SqlCommand cmd = new SqlCommand("select_gruppi_soluzione", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@soluzione#", soluzione);
                    cmd.Connection = conn;
                    conn.Open();
                    reader = cmd.ExecuteReader();
                    return reader;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    if (reader != null)
                    {
                        reader.Close();
                    }
                    conn.Close();
                }
            }
        }
    ottengo sempre questo errore:
    Invalid attempt to call FieldCount when reader is closed.

    ovviamente se levo il primo metodo nn lo ottengo.
    ma nn capisco il motivo.

  2. #2
    Utente di HTML.it L'avatar di GabbOne
    Registrato dal
    Mar 2006
    Messaggi
    577
    sei sicuro di non avere il problema sul metodo ddlGruppi?

  3. #3
    in origine era così:
    codice:
        public class Decoder
        {
            private SqlConnection conn = new SqlConnection("Data Source=10.0.5.131;Initial Catalog=TELENEWS;Persist Security Info=True;User ID=sa;Password=sa");
    
            public DataSet ddlNetwork()
            {
                SqlDataAdapter adapter = new SqlDataAdapter("select_soluzioni", conn);
                try
                {
                    DataSet ds = new DataSet();
                    adapter.Fill(ds);
                    return ds;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
    
    
            public DataSet ddlGruppi()
            {
                SqlDataAdapter adapter = new SqlDataAdapter("select_gruppi", conn);
                try
                {
                    DataSet ds = new DataSet();
                    adapter.Fill(ds);
                    return ds;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
    
        }
    così funziona, ma la SP di ddlGruppi dovrebbe essere un'altra, che richiede un parametro.
    ho cambiato DataSet in DataReader nel metodo dllGruppi proprio perchè quella SP richiede un parametro.
    cambiando come prima nn funziona più.

  4. #4
    mo funziona:
    codice:
            private SqlConnection conn = new SqlConnection("Data Source=10.0.5.131;Initial Catalog=TELENEWS;Persist Security Info=True;User ID=sa;Password=sa");
    
            public DataSet ddlNetwork()
            {
                SqlDataAdapter adapter = new SqlDataAdapter("select_soluzioni", conn);
                try
                {
                    DataSet ds = new DataSet();
                    adapter.Fill(ds);
                    return ds;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
    
            public SqlDataReader ddlGruppi(int soluzione)
            {
                SqlDataReader reader = null;
                SqlCommand cmd = null;
                try
                {
                    conn.Open();
                    cmd = new SqlCommand("select_gruppi");
                    cmd.Connection = conn;
                    cmd.Parameters.AddWithValue("@soluzione#", soluzione);
                    reader = cmd.ExecuteReader();
                    return reader;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
    nn capisco proprio......

  5. #5
    per la cronaca il problema è il finally commentato:
    codice:
            private SqlConnection conn = new SqlConnection("Data Source=10.0.5.131;Initial Catalog=TELENEWS;Persist Security Info=True;User ID=sa;Password=sa");
    
            public DataSet ddlNetwork()
            {
                SqlDataAdapter adapter = null;
                DataSet ds = null;
                try
                {
                    conn.Open();
                    adapter = new SqlDataAdapter("select_soluzioni", conn);
                    ds = new DataSet();
                    adapter.Fill(ds);
                    return ds;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    ds.Dispose();
                    adapter.Dispose();
                    conn.Close();
                }
            }
    
            public SqlDataReader ddlGruppi(int soluzione)
            {
                SqlDataReader reader = null;
                SqlCommand cmd = null;
                try
                {
                    conn.Open();
                    cmd = new SqlCommand("select_gruppi_soluzione", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@soluzione#", soluzione);
                    reader = cmd.ExecuteReader();
                    return reader;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                //finally
                //{
                //    conn.Close();
                //}
            }
    senza commento da errore.

  6. #6
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    NON funziona:
    codice:
         SqlCommand cmd = new SqlCommand("select_gruppi_soluzione", conn);
    Funziona:
    codice:
          cmd = new SqlCommand("select_gruppi");

    mi sembrano due stored diverse...non ho capito.

    PS: il Datareader non è un oggetto DISCONNESSO come il Dataset

  7. #7
    Originariamente inviato da djciko
    NON funziona:
    codice:
         SqlCommand cmd = new SqlCommand("select_gruppi_soluzione", conn);
    Funziona:
    codice:
          cmd = new SqlCommand("select_gruppi");

    mi sembrano due stored diverse...non ho capito.

    PS: il Datareader non è un oggetto DISCONNESSO come il Dataset
    entrambe funzionano se il finally è commentato.
    entrambe nn funzionano se il finally non è commentato.
    sono due SP diverse, ma simili quindi andrebbero bene entrambe.
    il problema è quel finally che volevo usare per chiudere la connessione.

  8. #8
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    secondo me non è il finally, ma la chiusura della connessione che c'e' dentro.
    Ti ripeto, l'SQLDataReader è un oggetto connesso, non in memoria come il Dataset

    Questo è il primo metodo che usavi, chiudevi sia il reader che la connessione.
    Il finally viene eseguito sempre, è un problema di flusso e logica, l'errore che ottenevi infatti te lo diceva: "Invalid attempt to call FieldCount when reader is closed".
    Inoltre non restituisci il reader nel punto giusto secondo me, andrebbe restituito alla fine...
    codice:
    public SqlDataReader ddlGruppi(int soluzione)
            {
                SqlDataReader reader = null;
                try
                {
                    SqlCommand cmd = new SqlCommand("select_gruppi_soluzione", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@soluzione#", soluzione);
                    cmd.Connection = conn;
                    conn.Open();
                    reader = cmd.ExecuteReader();
                    return reader;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    if (reader != null)
                    {
                        reader.Close();
                    }
                    conn.Close();
                }
            }

  9. #9
    ho provato più volte anche così ma da sempre lo stesso risultato.
    forse è dove restituisco il reader come dici te.

  10. #10
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    il metodo che ho scritto nel post precedente e' quello errato, l'ho riportato per evidenziare l'errore.

    ok, cmq hai risolto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.