2010-06-07 17 views
7

Sto sviluppando un'applicazione per sito Web C# VS2008/SQL Server e sono nuovo alla classe Dizionario. Potete consigliare il metodo migliore per farlo? Ecco un frammento di codice:Come posso accedere agli elementi del dizionario?

SqlConnection conn2 = new SqlConnection(connString); 
SqlCommand cmd = conn2.CreateCommand(); 
cmd.CommandText = "dbo.AppendDataCT"; 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Connection = conn2; 
SqlParameter p1, p2, p3; 
foreach (string s in dt.Rows[1].ItemArray) 
{ 
    DataRow dr = dt.Rows[1]; // second row 
    p1 = cmd.Parameters.AddWithValue((string)dic[0], (string)dr[0]); 
    p1.SqlDbType = SqlDbType.VarChar; 
    p2 = cmd.Parameters.AddWithValue((string)dic[1], (string)dr[1]); 
    p2.SqlDbType = SqlDbType.VarChar; 
    p3 = cmd.Parameters.AddWithValue((string)dic[2], (string)dr[2]); 
    p3.SqlDbType = SqlDbType.VarChar; 
} 

ma questo mi sta dando errore del compilatore:

The best overloaded method match for 'System.Collections.Generic.Dictionary<string,string>.this[string]' has some invalid arguments 

voglio solo per accedere a ogni valore da "dic" e caricare in questi parametri SQL. Come faccio a fare questo? Devo inserire la chiave? Le chiavi sono denominate "col1", "col2", ecc., Quindi non sono le più user-friendly. Qualche altro consiglio? Grazie!

+0

questo è un duplicato, l'hai chiesto due volte. –

+0

possibile duplicato di [Come passare una variabile Dictionary ad un'altra procedura] (http://stackoverflow.com/questions/2987142/how-to-pass-a-dictionary-variable-to-another-procedure) –

risposta

5

Sembra che tu stia cercando di accedere a un Dictionary<string, string> per indice intero. Non puoi farlo - devi cercare il valore con la chiave, che è una stringa.

Se non si desidera utilizzare i tasti di stringa, perché si utilizza uno Dictionary<string, string> per iniziare? Potresti utilizzare uno List<string> o uno Dictionary<int, string>?

Si noti che una volta che si è con riuscito a utilizzare l'indicizzatore in modo appropriato, non sarà necessario eseguire il cast sulla stringa.

0

Sì, è necessario accedere ai valori tramite il tasto.

6

A Dictionary esegue il mapping di oggetti di un tipo in oggetti di un altro tipo. Nel tuo caso hai un Dictionary<string, string>. Quindi, se avete avuto inizializzato in questo modo:

Dictionary<string, string> dic = new Dictionary<string, string>() 
{ 
    { "key1", "value1" }, 
    { "key2", "value2" }, 
    { "key3", "value3" } 
}; 

Si otterrebbe il valore per key2 facendo

dic["key2"]; // gives "value2" 

Il Dictionary è fortemente tipizzato, quindi non c'è bisogno di alcun casting. Come dice Jon Skeet, potresti stare meglio con uno List<string> qui. È possibile accedervi tramite l'indice intero.

1

Se le tue chiavi sono "col1", "col2", ecc. Allora usando 0, 1, ecc. Causerai l'errore che stai ricevendo. Prova questo:

p1 = cmd.Parameters.AddWithValue(dic["col1"], dr[0]); 
p1.SqlDbType = SqlDbType.VarChar; 
p2 = cmd.Parameters.AddWithValue(dic["col2"], dr[1]); 
p2.SqlDbType = SqlDbType.VarChar; 
p3 = cmd.Parameters.AddWithValue(dic["col3"], dr[2]); 
p3.SqlDbType = SqlDbType.VarChar; 

Inoltre, non c'è bisogno di gettare al string come oggetto dizionario tornerà già stringhe.

0

Non riesco a capire cosa davvero stiate cercando, quindi ecco il mio piccolo consiglio. C'è un modo per sfogliare il dizionario non richiedendo gli elementi per chiave. È un'opzione foreach.

foreach (KeyValuePair<string,string> pair in dic) 
{ 
    p. = cmd.Parameters.AddWithValue(dic.Value /*or dic.Key*/, (string)dr[0]); 
    p.SqlDbType = SqlDbType.VarChar; 
    // further processing of this parameter 
} 
1

Ecco un pezzo di codice che farà quello che stai dopo, penso .. Si dovrà aggiungere in una dichiarazione d'altro, ma dovrebbe iniziare.

public void AttachParam(ref DbCommand command, Dictionary<string, string> parameters) 
{ 
    try 
    { 
    if (parameters.Count > 0) 
    { 
     foreach (KeyValuePair<string, string> kvp in parameters) 
     { 
      command.Parameters.AddWithValue(kvp.Key, kvp.Value); 
     } 
    } 
    } 
    catch (Exception ex) 
    { 
    throw; 
    } 
} 
Problemi correlati