2010-06-07 28 views
7

Estoy desarrollando una aplicación de sitio web C# VS2008/SQL Server y soy nuevo en la clase Dictionary. ¿Puede por favor asesorar sobre el mejor método para lograr esto? Aquí es un fragmento de código:¿Cómo accedo a los elementos del diccionario?

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; 
} 

pero esto me está dando error del compilador:

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

sólo quiero acceder a cada valor de "DIC" y cargar en estos parámetros SQL. ¿Cómo hago esto? ¿Debo ingresar la clave? Las claves se llaman "col1", "col2", etc., por lo que no son las más fáciles de usar. ¿Algún otro consejo? ¡Gracias!

+0

este es un duplicado, lo solicitó dos veces. –

+0

posible duplicado de [Cómo pasar una variable de diccionario a otro procedimiento] (http://stackoverflow.com/questions/2987142/how-to-pass-a-dictionary-variable-to-another-procedure) –

Respuesta

5

Parece que está intentando acceder a Dictionary<string, string> por índice entero. No puede hacer eso; debe buscar el valor con la tecla, que es una cadena.

Si no desea utilizar claves de cadena, ¿para qué está utilizando un Dictionary<string, string> para empezar? ¿Podría usar un List<string> o un Dictionary<int, string>?

Tenga en cuenta que una vez que tiene logró utilizar el indexador de forma adecuada, no tendrá que convertir en cadena.

0

Sí, se debe acceder a los valores con la tecla.

6

A Dictionary asigna objetos de un tipo a objetos de otro tipo. En tu caso, tienes un Dictionary<string, string>. Así que si tenía que inicializado como esto:

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

Te obtener el valor de key2 haciendo

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

El Dictionary es de tipo fuerte, así que no hay necesidad de ningún casting. Como dice Jon Skeet, puede que estés mejor con un List<string> aquí. Puede acceder a ellos por el índice entero.

1

Si sus llaves son "col1", "col2", etc. entonces usar 0, 1, etc. causará el error que está recibiendo. Prueba esto:

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; 

Además, no hay necesidad de echar a string como el objeto de diccionario volverá cadenas ya.

0

No puedo entender lo que realmente estás buscando, así que este es mi pequeño consejo. Hay una forma de navegar por el diccionario al no solicitar elementos por clave. Es una opción 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

Aquí es una pieza de código que va a hacer lo que está buscando, creo .. Usted tendrá que añadir en un comunicado por lo demás, pero debería empezar.

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; 
    } 
} 
Cuestiones relacionadas