2009-07-09 20 views
0

Ich verwende C# +. Net 3.5 + VSTS 2008 + ADO.Net + SQL Server 2008. Ich habe zwei verwandte Tabellen in SQL Server (Fremdschlüssel-Beziehung). Und ich möchte die zwei Tabellen als zwei Databases in einem Dataset laden. Irgendein Referenzcode, um dies zu tun?Wie kann DataSet zwei verwandte Tabellen zurückgeben?

Vielen Dank im Voraus, George

Antwort

2

Versuchen Sie, diese

Dim myAdapter as SqlDataAdapter = new SqlDataAdapter(
     “SELECT * FROM Customers; SELECT * FROM Orders“, connection) 

myAdapter.Fill(dsTables) 
dsTables.Tables(0).TableName = “Customers“) 
dsTables.Tables(1).TableName = “Orders“) 

http://pietschsoft.com/post/2004/08/22/Fill-DataSet-with-multiple-Tables-and-update-them-with-DataAdapter.aspx

+0

Wenn Tabelle Customers und Orders-Tabelle Fremdschlüsselbeziehungen hat, werden die Beziehungen in dsTables.Tables gehalten werden (0) und dsTables.Tables (2)? – George2

+0

BTW: Ich habe Ihre Probe gelesen, und die dsTables ist eine Art von was? Und wie kann ich die dsTables.Tables-Eigenschaft dsTables zuweisen? – George2

+0

dsTables ist Dataset, sorry für die Verwirrung :( – Anuraj

1

George,

Können Sie bitte Ihre Frage klären - ist es etwa mulitple Tabellen in Dataset füllen oder speziell reelle Tabellen.

Für mehrere Tabellen Laden betrifft Sie folgenden Code verweisen können (dieser Code ist bei MSDN http://msdn.microsoft.com/en-us/library/5fd1ahe2.aspx avialable):

static void Main() 
{ 
    DataSet dataSet = new DataSet(); 

    DataTable customerTable = new DataTable(); 
    DataTable productTable = new DataTable(); 

    // This information is cosmetic, only. 
    customerTable.TableName = "Customers"; 
    productTable.TableName = "Products"; 

    // Add the tables to the DataSet: 
    dataSet.Tables.Add(customerTable); 
    dataSet.Tables.Add(productTable); 

    // Load the data into the existing DataSet. 
    DataTableReader reader = GetReader(); 
    dataSet.Load(reader, LoadOption.OverwriteChanges, 
     customerTable, productTable); 

    // Print out the contents of each table: 
    foreach (DataTable table in dataSet.Tables) 
     { 
     PrintColumns(table); 
     } 

    Console.WriteLine("Press any key to continue."); 
    Console.ReadKey(); 
} 

private static DataTable GetCustomers() 
{ 
    // Create sample Customers table. 
    DataTable table = new DataTable(); 
    table.TableName = "Customers"; 

    // Create two columns, ID and Name. 
    DataColumn idColumn = table.Columns.Add("ID", typeof(int)); 
    table.Columns.Add("Name", typeof(string)); 

    // Set the ID column as the primary key column. 
    table.PrimaryKey = new DataColumn[] { idColumn }; 

    table.Rows.Add(new object[] { 0, "Mary" }); 
    table.Rows.Add(new object[] { 1, "Andy" }); 
    table.Rows.Add(new object[] { 2, "Peter" }); 
    table.AcceptChanges(); 
    return table; 
} 

private static DataTable GetProducts() 
{ 
    // Create sample Products table. 
    DataTable table = new DataTable(); 
    table.TableName = "Products"; 

    // Create two columns, ID and Name. 
    DataColumn idColumn = table.Columns.Add("ID", 
     typeof(int)); 
    table.Columns.Add("Name", typeof(string)); 

    // Set the ID column as the primary key column. 
     table.PrimaryKey = new DataColumn[] { idColumn }; 

    table.Rows.Add(new object[] { 0, "Wireless Network Card" }); 
    table.Rows.Add(new object[] { 1, "Hard Drive" }); 
    table.Rows.Add(new object[] { 2, "Monitor" }); 
    table.Rows.Add(new object[] { 3, "CPU" }); 
    table.AcceptChanges(); 
    return table; 
} 

private static void PrintColumns(DataTable table) 
{ 
    Console.WriteLine(); 
    Console.WriteLine(table.TableName); 
    Console.WriteLine("========================="); 
    // Loop through all the rows in the table: 
    foreach (DataRow row in table.Rows) 
    { 
     for (int i = 0; i < table.Columns.Count; i++) 
     { 
      Console.Write(row[i] + " "); 
     } 
     Console.WriteLine(); 
    } 
} 

private static DataTableReader GetReader() 
{ 
    // Return a DataTableReader containing multiple 
    // result sets, just for the sake of this demo. 
    DataSet dataSet = new DataSet(); 
    dataSet.Tables.Add(GetCustomers()); 
    dataSet.Tables.Add(GetProducts()); 
    return dataSet.CreateDataReader(); 
} 

Hier ist der Code Eltern-Kind-Beziehung für die Verwaltung der Daten

Imports System.Data 
Imports System.Data.SqlClient 
Imports System.Configuration 

Public Class DataRelation 
    Inherits System.Web.UI.Page 

    Protected lblDisplay As System.Web.UI.WebControls.Label 

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Dim objConn As SqlConnection 
    Dim da As SqlDataAdapter 
    Dim ds As DataSet 
    Dim dtrParent As DataRow 
    Dim dtrChild As DataRow 

    objConn = New SqlConnection(ConfigurationSettings.Appsettings("NorthwindConnection")) 
    da = New SqlDataAdapter("SELECT * FROM Categories", objConn) 
    ds = New DataSet() 
    Try 
     objConn.Open() 
     da.Fill(ds,"Categories") 
     da.SelectCommand = New SqlCommand("SELECT * FROM Products", objConn) 
     da.Fill(ds, "Products") 
    Catch exc As SqlException 
     Response.Write(exc.ToString()) 
    Finally 
     objConn.Dispose() 
    End Try 
    'Create the Data Relationship 
    ds.Relations.Add("Cat_Prod",ds.Tables("Categories").Columns("CategoryID"), _ 
          ds.Tables("Products").Columns("CategoryID")) 

    'Display the Category and Child Products Within 
    For each dtrParent in ds.Tables("Categories").Rows 
     lblDisplay.Text &= "<h3>" & dtrParent("CategoryName") & "</h3><ul>" 
     For each dtrChild in dtrParent.GetChildRows("Cat_Prod") 
     lblDisplay.Text &= "<li>" & dtrChild("ProductName") & "</li>" 
     Next 
     lblDisplay.Text &= "</ul>" 
    Next 
    End Sub 

End Class 
setzt

Sie weitere Erklärung über here finden

+0

Danke Rutesh, Entschuldigung für meine verwirrende Frage. Ich möchte den gesamten Inhalt von zwei Tabellen aus der Datenbank in zwei DataTables in ein DataSet abrufen, und zwei Tabellen sind Fremdschlüsselbeziehung in der Datenbank, und ich möchte die Beziehung in den zwei abgerufenen DataTable beibehalten. Funktioniert Ihre Lösung für mich? – George2

+0

Meine Verwirrung Ihres Codebeispiels ist, möchte ich in meinem Szenario wissen (Laden aller Tabelleninhalte), ob ich "die ID-Spalte als Primärschlüsselspalte festlegen muss" als Methode GetProducts und GetCustomers oben gezeigt? Was ist die Funktion von sogenannten "Setzen Sie die ID-Spalte als Primärschlüssel-Spalte"? – George2

+0

George, Vorherige Beispiel ist nur für das Hinzufügen mehrerer Tabellen, wenn Sie wollen, dass die Retential Integrität (Vordergrund Schlüsselbeziehungen) beibehalten werden, dann müssen Sie DataRelations Ich posten das Beispiel in der nächsten Antwort –

-1

Hier ist ein Beispielcode, wie ein DataSet mit LINQ qu laden eries Hier haben 2 Tabellen eine Beziehung. "dc" ist der Datenkontext.

  var query = dc.GetTable<Media>().Where(s => s.MediaID == new Guid("A72AA79A-6C40-4D6B-A826-241553FECDFE")); 
      var query1 = dc.GetTable<MediaVersion>().Where(s => s.MediaID == new Guid("A72AA79A-6C40-4D6B-A826-241553FECDFE")); 
      var query2 = dc.GetTable<RootPath>().Where(s => s.RootPathID == new Guid("62145B2C-BA36-4313-8CA2-0F224F8FE7E8")); 


      SqlCommand cmd = dc.GetCommand(query) as SqlCommand; 
      //Load first 
      SqlDataAdapter ada = new SqlDataAdapter(cmd); 
      DataSet ds = new DataSet(); 
      ada.Fill(ds, "Media"); 
      //Load second 
      cmd = dc.GetCommand(query1) as SqlCommand; 
      ada.SelectCommand = cmd; 
      ada.Fill(ds, "MediaVersion"); 
      ds.Relations.Add("Med_MedVer", ds.Tables["Media"].Columns["MediaID"], 
         ds.Tables["MediaVersion"].Columns["MediaID"]); 

      //Load third independent table 
      cmd = dc.GetCommand(query2) as SqlCommand; 
      ada.SelectCommand = cmd; 
      ada.Fill(ds, "RootPath"); 
Verwandte Themen