Aggiungere vincoli esistenti a un DataSet

Si applica a: .NET Framework .NET Standard

Scarica ADO.NET

Il metodo Fill di SqlDataAdapter compila una classe DataSet solo con colonne e righe di tabella di un'origine dati. Anche se i vincoli vengono in genere impostati dall'origine dati, per impostazione predefinita il metodo Fill non aggiunge queste informazioni sullo schema alla classe DataSet.

Per popolare DataSet con le informazioni esistenti sui vincoli della chiave primaria da un'origine dati, è possibile chiamare il metodo FillSchema di DataAdapter oppure impostare la proprietà MissingSchemaAction di DataAdapter su AddWithKey prima di chiamare Fill. Ciò garantisce che i vincoli della chiave primaria in DataSet riflettano quelli nell'origine dati.

Nota

Le informazioni sul vincolo di chiave esterna non sono incluse e devono essere create in modo esplicito.

L'aggiunta delle informazioni sullo schema in una classe DataSet prima di compilarla con i dati assicura che i vincoli della chiave primaria siano inclusi con gli oggetti DataTable in DataSet. In questo modo, quando vengono effettuate altre chiamate per compilare DataSet, le informazioni nella colonna della chiave primaria vengono usate per confrontare le nuove righe provenienti dall'origine dati con le righe correnti in ogni DataTable e i dati correnti nelle tabelle vengono sovrascritti con i dati provenienti dall'origine dati. Senza le informazioni sullo schema, le nuove righe provenienti dall'origine dati verrebbero aggiunte a DataSet generando righe duplicate.

Nota

Se una colonna in un'origine dati viene identificata come colonna con incremento automatico, il metodo FillSchema o il metodo Fill con la proprietà MissingSchemaAction impostata su AddWithKey crea un oggetto DataColumn con una proprietà AutoIncrement impostata su true. È tuttavia necessario impostare direttamente i valori di AutoIncrementStep e AutoIncrementSeed.

Nota

Se si usa FillSchema o si imposta MissingSchemaAction su AddWithKey, è necessaria un'elaborazione aggiuntiva nell'origine dati per determinare le informazioni della colonna della chiave primaria. Questa ulteriore elaborazione può ridurre le prestazioni. Se le informazioni sulla chiave primaria sono note in fase di progettazione, è consigliabile specificare la colonna o le colonne della chiave primaria in modo esplicito per migliorare le prestazioni.

L'esempio di codice seguente descrive come aggiungere le informazioni sullo schema a DataSet usando FillSchema:

// Assumes that connection is a valid SqlConnection object.
string queryString =
"SELECT CustomerID, CompanyName FROM dbo.Customers";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);

DataSet customers = new DataSet();
adapter.Fill(customers, "Customers");

L'esempio di codice seguente descrive come aggiungere le informazioni sullo schema a DataSet usando la proprietà MissingSchemaAction e il metodo Fill:

// Assumes that customerConnection and orderConnection are valid SqlConnection objects.
SqlDataAdapter custAdapter = new SqlDataAdapter(
"SELECT * FROM dbo.Customers", customerConnection);
SqlDataAdapter ordAdapter = new SqlDataAdapter(
"SELECT * FROM Orders", orderConnection);

DataSet customerOrders = new DataSet();

custAdapter.Fill(customerOrders, "Customers");
ordAdapter.Fill(customerOrders, "Orders");

DataRelation relation = customerOrders.Relations.Add("CustOrders",
customerOrders.Tables["Customers"].Columns["CustomerID"],
customerOrders.Tables["Orders"].Columns["CustomerID"]);

foreach (DataRow pRow in customerOrders.Tables["Customers"].Rows)
{
    Console.WriteLine(pRow["CustomerID"]);
    foreach (DataRow cRow in pRow.GetChildRows(relation))
        Console.WriteLine("\t" + cRow["OrderID"]);
}

Gestione di più set di risultati

Se l'oggetto DataAdapter rileva più set di risultati restituiti da SelectCommand, verranno create più tabelle in DataSet. Alle tabelle viene assegnato un nome predefinito incrementale in base zero TableN, che inizia con Table invece che con "Table0". Alle tabelle verrà assegnato il nome incrementale in base zero TableNameN, che inizia con TableName invece che con "TableName0" se il nome di una tabella viene passato come argomento al metodo FillSchema.

Vedi anche