2009-08-28 27 views
47

Tengo un DataTable que se completa desde una consulta SQL a una base de datos local, pero no sé cómo extraer datos de él. método Main (en el programa de prueba):¿Cómo extraigo datos de una DataTable?

static void Main(string[] args) 
{ 
    const string connectionString = "server=localhost\\SQLExpress;database=master;integrated Security=SSPI;"; 
    DataTable table = new DataTable("allPrograms"); 

    using (var conn = new SqlConnection(connectionString)) 
    { 
     Console.WriteLine("connection created successfuly"); 

     string command = "SELECT * FROM Programs"; 

     using (var cmd = new SqlCommand(command, conn)) 
     { 
      Console.WriteLine("command created successfuly"); 

      SqlDataAdapter adapt = new SqlDataAdapter(cmd); 

      conn.Open(); 
      Console.WriteLine("connection opened successfuly"); 
      adapt.Fill(table); 
      conn.Close(); 
      Console.WriteLine("connection closed successfuly"); 
     } 
    } 

    Console.Read(); 
} 

El comando utilicé para crear las tablas en mi base de datos:

create table programs 
(
    progid int primary key identity(1,1), 
    name nvarchar(255), 
    description nvarchar(500), 
    iconFile nvarchar(255), 
    installScript nvarchar(255) 
) 

¿Cómo puedo extraer los datos de la DataTable I en una forma significativa a usar?

Respuesta

115

El DataTable tiene una colección .Rows de elementos DataRow.

Cada DataRow corresponde a una fila en su base de datos y contiene una colección de columnas.

Con el fin de acceder a un solo valor, hacer algo como esto:

foreach(DataRow row in YourDataTable.Rows) 
{ 
    string name = row["name"].ToString(); 
    string description = row["description"].ToString(); 
    string icoFileName = row["iconFile"].ToString(); 
    string installScript = row["installScript"].ToString(); 
} 

Marc

+2

Sé que esto es una respuesta de edad, pero no se tiene que hacer un molde en el bucle foreach para permitir la indexación? No pude hacer algo como esto hasta que cambié el código para que se pareciera a lo siguiente: foreach (fila DataRow en YourDataTable.Rows.Cast ()) ... – awh112

+0

Comentario anterior, pero no es necesario para lanzar: 'foreach' funciona, porque' Filas' es una colección ('DataRowCollection'). Sin embargo, debe usar '.Cast ()' si desea usar algunos métodos Linq ('.Where()', para un ejemplo). –

+1

@marc_s Gracias –

16

Puede establecer la tabla de datos como fuente de datos para muchos elementos.

Por ejemplo

GridView

repetidor

lista de datos

, etc, etc

Si necesita extraer datos de cada fila a continuación, puede utilizar

table.rows[rowindex][columnindex] 

o

si se conoce el nombre de la columna

table.rows[rowindex][columnname] 

Si tiene que recorrer la tabla a continuación, se puede utilizar un bucle for o un bucle foreach como

for (int i = 0; i < table.rows.length; i ++) 
{ 
    string name = table.rows[i]["columnname"].ToString(); 
} 

foreach (DataRow dr in table.Rows) 
{ 
    string name = dr["columnname"].ToString(); 
} 
+0

foreach (DataRow dr en la tabla) table.Rows – StampedeXV

3

menos que tenga una razón específica para hacerlo ado.net prima que tendría un vistazo a utilizar un ORM (mapeador relacional de objetos) como nhibernate o Linq a Sql. De esta manera puede consultar la base de datos y recuperar objetos para trabajar con los que están fuertemente tipados y más fáciles de trabajar con mi humilde opinión.

Colin G

+1

Tengo un conocimiento básico de ADO.net antes de pasar a un ORM como sugiere http://stackoverflow.com/questions/1345508/how-do-i-connect-to-a- sql-database-from-c/1345531 # 1345531 – RCIX

4

Por favor, considere el uso de un código como éste:

SqlDataReader reader = command.ExecuteReader(); 
int numRows = 0; 
DataTable dt = new DataTable(); 

dt.Load(reader); 
numRows = dt.Rows.Count; 

string attended_type = ""; 

for (int index = 0; index < numRows; index++) 
{ 
    attended_type = dt.Rows[indice2]["columnname"].ToString(); 
} 

reader.Close(); 
0
var table = Tables[0]; //get first table from Dataset 
    foreach (DataRow row in table.Rows) 
    { 
     foreach (var item in row.ItemArray) 
     { 
      console.Write("Value:"+item); 
     } 
    } 
0

Por favor, tenga en cuenta que abrir y cerrar la conexión no es necesario cuando se utiliza DataAdapter.

por lo que sugiero por favor, actualice el código y quite la apertura y cierre de la conexión:

 SqlDataAdapter adapt = new SqlDataAdapter(cmd); 

conn.Open(); // esta línea de código es uncessessary

 Console.WriteLine("connection opened successfuly"); 
     adapt.Fill(table); 

conn.Close(); // esta línea de código es uncessessary

 Console.WriteLine("connection closed successfuly"); 

Reference Documentation

El código que se muestra en este ejemplo no explícitamente abierta y cerrar la conexión . El método Fill abre implícitamente la conexión que utiliza el adaptador de datos si detecta que la conexión no está abierta . Si Fill abrió la conexión, también cierra la conexión cuando finaliza el llenado. Esto puede simplificar su código cuando se trata de una sola operación, como un Relleno o una Actualización. Sin embargo, si es realizando múltiples operaciones que requieren una conexión abierta, puede mejorar el rendimiento de su aplicación llamando explícitamente al el método Abrir de la Conexión, realizando las operaciones contra el origen de datos, y luego llamando al método Cerrar de la conexión. Debe tratar de mantener abiertas las conexiones a la fuente de datos tan brevemente como para liberar recursos para el uso de otras aplicaciones cliente.

Cuestiones relacionadas