2010-11-28 24 views
5

Tengo una base de datos con dos tablas. Ambas tablas están relacionadas y tienen el mismo campo clave. Por ejemplo, ambos tienen filas de datos correspondientes a ISBN = 12345, pero las dos tablas tienen datos diferentes sobre ese ISBN.Necesito ayuda para trabajar con bases de datos en C#

Por lo tanto, estoy tratando de averiguar cómo mostrar los datos de ambas tablas en un dataGridView. He intentado con algunos comandos SQL que encontré en línea, pero parece que los comandos en C# pueden diferir de las consultas SQL normales.

Supongamos que la tabla 1 tiene estos campos: ISBN, color, tamaño y tabla2 tiene los campos ISBN, peso.

Necesito una forma de mostrar ISBN, color, tamaño, peso en mi vista de cuadrícula de datos. Creo que tendré que hacer esto de alguna manera con un adaptador. Puedo conectarme y hacer consultas en las tablas individualmente, y mostrar esos datos en mi vista de cuadrícula de datos, pero no puedo encontrar la manera de mezclar datos de dos tablas separadas.

Si tiene un buen recurso que pueda leer sobre esto, me encantaría tenerlo, mi google-fu me está fallando.

He aquí un ejemplo de algo que puedo hacer ahora con mi base de datos:

private void Form1_Load(object sender, EventArgs e) 
    { 
     // TODO: This line of code loads data into the 'database1DataSet.Book' table. You can move, or remove it, as needed. 
     this.bookTableAdapter.Fill(this.database1DataSet.Book); 
     string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + @"C:\Users\Geoff\Documents\cs 351\Database1.accdb" + ";Persist Security Info=False;"; 
     OleDbConnection conn = new OleDbConnection(connectionString); 
     string query = "select * from Book where ISBN = 12345"; 
     OleDbCommand com = conn.CreateCommand(); 
     com.CommandText = query; 
     OleDbDataAdapter adapter = new OleDbDataAdapter(com); 
     DataSet data = new DataSet(); 
     conn.Open(); 
     adapter.Fill(data); 

     conn.Close(); 
     dataGridView1.DataSource = data.Tables[0]; 
    } 

Así que, esencialmente, me gustaría hacer lo que he hecho antes, pero quiero incluir los datos de una mesa diferente también. La otra tabla también tiene un campo de clave ISBN, y contiene valores de ISBN que coinciden con la primera tabla.

+2

Hola @Jeff y bienvenidos a StackOverflow. Si bien nos gusta ayudar, también nos gusta ver lo que tienes hasta ahora. ¿Puede darnos un ejemplo de algunos datos y cómo existen actualmente? Presta atención para mostrar las partes problemáticas. Podríamos decir simplemente "haz una izquierda", pero eso no te ayuda. – jcolebrand

+0

De acuerdo, si está trabajando con bases de datos en C#, existe un universo completo de soluciones posibles, cada una con sus fortalezas y debilidades. Por ejemplo, podría investigar una solución LINQ to SQL o Entity Framework en lugar de ir por SQL sin procesar. Es posible que haya visto ejemplos de estas tecnologías, por lo que cree que "los comandos en C# pueden diferir de las consultas SQL normales". Tenga la seguridad de que C# admite SQL 'normal' a través de ADO.net, pero admite mucho más, incluidas las consultas como objetos de lenguaje de primera clase a través de LINQ. ¡Te estás embarcando en un viaje emocionante! :) –

+0

Además de mi ejemplo que acabo de publicar, definitivamente estoy de acuerdo con James. Hay muchas posibilidades, y debe investigar y probar para ver cuál es la mejor solución en su caso. – KBoek

Respuesta

3

Mira en el uso de JOIN para devolver los resultados de dos tablas JOIN ed juntos ON algún valor común

Véase también

No hay nada que limita esto a C# o OLEDB - es SQL básico.


Para los detalles de lo que está pidiendo una consulta podría tener el siguiente aspecto:

SELECT T1.ISBN, T1.color, T1.size, T2.weight 
FROM table1 T1 
    INNER JOIN table2 T2 
    ON T1.ISBN = T2.ISBN 
WHERE ISBN = '12345'; 

(No hay necesidad de alias tabla1 como T1 - que acabo de hacer eso como un ejemplo; en consultas más complicadas con los nombres de tablas más largas, puede que no desee repetir el nombre de la tabla todo el tiempo)

  • desde ISBN aparece en ambas tablas, debe ser calificado de manera explícita en su campo-selecciones; ya sea T1 o T2 se pueden usar, ya que son idénticos
  • ya que el color, el tamaño y el peso se presentan en una sola tabla, NO necesitan ser calificados, pero no duele.
+0

Estoy de acuerdo con este sentimiento, él tiene dos tablas 1: 1 – jcolebrand

1
var query  = "SELECT t1.isbn, t1.color, t1.size, t2.weight FROM table1 t1 JOIN table2 t2 ON t2.isbn = t1.isbn"; 
var connection = new System.Data.SqlClient.SqlConnection("your SQL connection string here"); 
var dataAdapter = new System.Data.SqlClient.SqlDataAdapter(query, connection); 
var dataSet  = new System.Data.DataSet(); 

dataAdapter.Fill(dataSet); 

yourGridView.DataSource = dataSet; 
yourGridView.DataBind();

Esta es una de muchas soluciones. Creo que el código podría ser más rápido si crea una DataTable en memoria y utiliza un SqlDataReader, pero el ejemplo anterior es más simple.

Al trabajar con bases de datos MSSQL, normalmente utiliza las clases System.Data.SqlClient. Si, por cualquier razón, use OleDb, elija los objetos correspondientes del espacio de nombres System.Data.OleDb.

+0

Esta sintaxis parece diferente. No estoy seguro de qué significa 't1.color'. ¿Es esto solo un identificador diferente para table1? ¿o? – jeff

0

Puede consultar los registros de ambas tablas usando UNION ALL

SELECT 'In table 1', book_author, book_title, book_isbn 
FROM books 
WHERE book_isbn = '67890' 
UNION ALL 
SELECT 'In table 2', othertable_author, othertable_title, othertable_isbn 
FROM othertable 
WHERE othertable_isbn = '67890' 

, por supuesto, tendrá que llenar el '67890' manualmente en ambos lugares utilizando cualquier método que es más conveniente en su situación.

+0

o podría unirse en el campo común con una única cláusula where – jcolebrand

+0

No estoy seguro de qué es 'En la tabla 1' en este comando. – jeff

+0

'en la tabla 1' - no hace nada excepto ayudarlo a identificar que los registros son de' table1' @jeff – Sathya

Cuestiones relacionadas