none
Query parametriche RRS feed

  • Domanda

  • Ciao a tutti
    voglio scrivere delle funzioni per interrogare il db passando dei parametri. L'idea è quella di scrivere una funzione generica che accede al db e restituisce il risultato e alla quale passo la query parametrica.

    Ho fatto così:

    SqlDataAdapter

    private static DataTable GetDataTable(string sql, SqlCommand cmd) { DataTable data = new DataTable(); try { using (SqlConnection cn = new SqlConnection(CONNECTION_STRING)) { cn.Open(); using (SqlDataAdapter adapter = new SqlDataAdapter()) { cmd = new SqlCommand(sql, cn); adapter.SelectCommand = cmd; try { adapter.Fill(data); cn.Close(); } catch (Exception ex) { cn.Close(); cn.Dispose(); } } //return data; } } catch (Exception ex) { } return data; }


    public static DataRow User(Guid UserId)
        {
            DataRow utente = null;
            DataTable T = null;
            string sql = "SELECT up.* " +
                            "FROM aspnet_UsersProfile up " +
                            "WHERE up.UserId=@UserId";
    
            SqlCommand cmd = new SqlCommand();
            cmd.Parameters.AddWithValue("@UserId", UserId);
    
            T = GetDataTable(sql, cmd);
    
            if (T != null && T.Rows.Count > 0)
            {
                utente = T.Rows[0];
            }
    
            return utente;
        }

    In GetDataTable ricevo questo errore:
    System.Data.SqlClient.SqlException (0x80131904): Dichiarare la variabile scalare "@UserId".

    Se voelssi fare la stessa cosa per INSERT e UPDATE, come dovrei fare?

    Grazie mille

    mercoledì 6 novembre 2013 10:10

Risposte

  • Ciao a tutti
    voglio scrivere delle funzioni per interrogare il db passando dei parametri. L'idea è quella di scrivere una funzione generica che accede al db e restituisce il risultato e alla quale passo la query parametrica.

    Ho fatto così:

    SqlDataAdapter

    private static DataTable GetDataTable(string sql, SqlCommand cmd) { DataTable data = new DataTable(); try { using (SqlConnection cn = new SqlConnection(CONNECTION_STRING)) { cn.Open(); using (SqlDataAdapter adapter = new SqlDataAdapter()) { cmd = new SqlCommand(sql, cn); adapter.SelectCommand = cmd; try { adapter.Fill(data); cn.Close(); } catch (Exception ex) { cn.Close(); cn.Dispose(); } } //return data; } } catch (Exception ex) { } return data; }


    public static DataRow User(Guid UserId)
        {
            DataRow utente = null;
            DataTable T = null;
            string sql = "SELECT up.* " +
                            "FROM aspnet_UsersProfile up " +
                            "WHERE up.UserId=@UserId";
    
            SqlCommand cmd = new SqlCommand();
            cmd.Parameters.AddWithValue("@UserId", UserId);
    
            T = GetDataTable(sql, cmd);
    
            if (T != null && T.Rows.Count > 0)
            {
                utente = T.Rows[0];
            }
    
            return utente;
        }

    In GetDataTable ricevo questo errore:
    System.Data.SqlClient.SqlException (0x80131904): Dichiarare la variabile scalare "@UserId".

    Se voelssi fare la stessa cosa per INSERT e UPDATE, come dovrei fare?

    Grazie mille

    Nel metodo User, crei un SqlCommand e lo passi al metodo GetDataTable, però in GetDataTable, sovrascrivi il command  "cmd = new SqlCommand(sql, cn);" e quindi il cmd che esegui, non è più lo stesso di quello che avevi parametrizzato (non c'è @UserId).

    Invece di ricreare il comando, potresti impostare connessione e query attraverso le proprietà "cmd.Connection" e "cmd.CommandText"

    • Contrassegnato come risposta SviPla mercoledì 6 novembre 2013 11:36
    mercoledì 6 novembre 2013 11:05

Tutte le risposte

  • Ciao a tutti
    voglio scrivere delle funzioni per interrogare il db passando dei parametri. L'idea è quella di scrivere una funzione generica che accede al db e restituisce il risultato e alla quale passo la query parametrica.

    Ho fatto così:

    SqlDataAdapter

    private static DataTable GetDataTable(string sql, SqlCommand cmd) { DataTable data = new DataTable(); try { using (SqlConnection cn = new SqlConnection(CONNECTION_STRING)) { cn.Open(); using (SqlDataAdapter adapter = new SqlDataAdapter()) { cmd = new SqlCommand(sql, cn); adapter.SelectCommand = cmd; try { adapter.Fill(data); cn.Close(); } catch (Exception ex) { cn.Close(); cn.Dispose(); } } //return data; } } catch (Exception ex) { } return data; }


    public static DataRow User(Guid UserId)
        {
            DataRow utente = null;
            DataTable T = null;
            string sql = "SELECT up.* " +
                            "FROM aspnet_UsersProfile up " +
                            "WHERE up.UserId=@UserId";
    
            SqlCommand cmd = new SqlCommand();
            cmd.Parameters.AddWithValue("@UserId", UserId);
    
            T = GetDataTable(sql, cmd);
    
            if (T != null && T.Rows.Count > 0)
            {
                utente = T.Rows[0];
            }
    
            return utente;
        }

    In GetDataTable ricevo questo errore:
    System.Data.SqlClient.SqlException (0x80131904): Dichiarare la variabile scalare "@UserId".

    Se voelssi fare la stessa cosa per INSERT e UPDATE, come dovrei fare?

    Grazie mille

    Nel metodo User, crei un SqlCommand e lo passi al metodo GetDataTable, però in GetDataTable, sovrascrivi il command  "cmd = new SqlCommand(sql, cn);" e quindi il cmd che esegui, non è più lo stesso di quello che avevi parametrizzato (non c'è @UserId).

    Invece di ricreare il comando, potresti impostare connessione e query attraverso le proprietà "cmd.Connection" e "cmd.CommandText"

    • Contrassegnato come risposta SviPla mercoledì 6 novembre 2013 11:36
    mercoledì 6 novembre 2013 11:05
  • Una domanda: se utilizzo i parametri, devo ancora preoccuparmi della presenza nella query di apici?
    Grazie
    mercoledì 6 novembre 2013 14:15
  • Le query parametriche hanno il pregio di demandare al framework la preparazione dei parametri, gestendo, tra le altre cose, tutti i caratteri speciali. Quindi è sufficiente passare i parametri così come sono (purché abbiano coerenza con il campo in questione, naturalmente).

    Emiliano Musso

    mercoledì 6 novembre 2013 14:32