Impostazione delle proprietà
Le proprietà sono valori in cui sono archiviate informazioni descrittive sull'oggetto. Le opzioni di configurazione di MicrosoftSQL Server sono ad esempio rappresentate dalle proprietà dell'oggetto Configuration. Alle proprietà è possibile accedere direttamente o indirettamente utilizzando la relativa raccolta. Per l'accesso diretto alle proprietà viene utilizzata la sintassi seguente:
objInstance.PropertyName
Un valore di proprietà può essere modificato o recuperato a seconda che la proprietà disponga di accesso in lettura/scrittura o di accesso in sola lettura. È inoltre necessario impostare determinate proprietà prima che sia possibile creare un oggetto. Per ulteriori informazioni, vedere la documentazione di riferimento di SMO per l'oggetto specifico.
[!NOTA]
Le raccolte di oggetti figlio vengono visualizzate come proprietà di un oggetto. La raccolta Tables è ad esempio una proprietà di un oggetto Server. Per ulteriori informazioni, vedere Utilizzo delle raccolte.
Le proprietà di un oggetto sono membri della raccolta Properties. Tale raccolta può essere utilizzata per scorrere tutte le proprietà di un oggetto.
Talvolta una proprietà non è disponibile per i motivi seguenti:
La versione del server non supporta la proprietà, ad esempio se si tenta di accedere a una proprietà che rappresenta una nuova funzionalità di SQL Server in una versione precedente di SQL Server.
Il server non fornisce dati per la proprietà, ad esempio se si tenta di accedere a una proprietà che rappresenta un componente di SQL Server non installato.
Per gestire queste situazioni è possibile individuare le eccezioni SMO UnknownPropertyException e PropertyCannotBeRetrievedException.
Impostazione dei campi di inizializzazione predefiniti
SMO consente di eseguire un'ottimizzazione durante il recupero di oggetti. L'ottimizzazione riduce il numero di proprietà caricate mediante il passaggio automatico tra gli stati seguenti:
Parzialmente caricato. Quando viene fatto riferimento a un oggetto per la prima volta, esso dispone di un minimo di proprietà disponibili (ad esempio Name e Schema).
Completamente caricato. Quando viene fatto riferimento a una proprietà, le proprietà restanti, che sono rapide da caricare, vengono inizializzate e rese disponibili.
Proprietà che utilizzano grandi quantità di memoria. Le restanti proprietà non disponibili utilizzano grandi quantità di memoria e presentano un valore True per la proprietà Expensive (ad esempio DataSpaceUsage). Tali proprietà vengono caricate solo quando viene fatto loro riferimento in modo specifico.
Se l'applicazione recupera proprietà aggiuntive, oltre a quelle fornite nello stato di caricamento parziale, invia una query per recuperarle e passa allo stato di caricamento completo. Ciò può provocare traffico non necessario tra il client e server. Per una maggiore ottimizzazione, è possibile chiamare il metodo SetDefaultInitFields. Il metodo SetDefaultInitFields consente la specifica delle proprietà caricate quando viene inizializzato l'oggetto.
Il metodo SetDefaultInitFields imposta il comportamento di caricamento della proprietà per la parte restante dell'applicazione o fino a quando non viene reimpostato. È possibile salvare il comportamento originale utilizzando il metodo GetDefaultInitFields e ripristinarlo come necessario.
Esempi
Per utilizzare qualsiasi esempio di codice fornito, è necessario scegliere l'ambiente di programmazione, il modello di programmazione e il linguaggio di programmazione per la creazione dell'applicazione. Per ulteriori informazioni, vedere "Procedura: Creare un progetto Visual Basic SMO in Visual Studio .NET" o "Procedura: Creare un progetto Visual C# SMO in Visual Studio .NET" nella documentazione online di SQL Server.
Ottenere e impostare una proprietà in Visual Basic
In questo esempio di codice viene illustrato come ottenere la proprietà Edition dell'oggetto Information e come impostare la proprietà SqlExecutionModes della proprietà ConnectionContext sul membro ExecuteSql del tipo enumerato SqlExecutionModes.
'Connect to the local, default instance of SQL Server.
Dim srv As Server
srv = New Server
'Get a property.
Console.WriteLine(srv.Information.Version)
'Set a property.
srv.ConnectionContext.SqlExecutionModes = SqlExecutionModes.ExecuteSql
Ottenere e impostare una proprietà in Visual C#
In questo esempio di codice viene illustrato come ottenere la proprietà Edition dell'oggetto Information e come impostare la proprietà SqlExecutionModes della proprietà ConnectionContext sul membro ExecuteSql del tipo enumerato SqlExecutionModes.
{
//Connect to the local, default instance of SQL Server.
Server srv;
srv = new Server();
//Get a property.
Console.WriteLine(srv.Information.Version);
//Set a property.
srv.ConnectionContext.SqlExecutionModes = SqlExecutionModes.ExecuteSql;
}
Impostazione di diverse proprietà prima della creazione di un oggetto in Visual Basic
In questo esempio di codice viene illustrato come impostare direttamente la proprietà AnsiNullsStatus dell'oggetto Table e come creare e aggiungere colonne prima di creare l'oggetto Table.
'Connect to the local, default instance of SQL Server.
Dim srv As Server
srv = New Server
'Create a new table in the AdventureWorks database.
Dim db As Database
db = srv.Databases("AdventureWorks")
Dim tb As Table
'Specify the parent database, table schema and the table name in the constructor.
tb = New Table(db, "Test_Table", "HumanResources")
'Add columns because the table requires columns before it can be created.
Dim c1 As Column
'Specify the parent table, the column name and data type in the constructor.
c1 = New Column(tb, "ID", DataType.Int)
tb.Columns.Add(c1)
c1.Nullable = False
c1.Identity = True
c1.IdentityIncrement = 1
c1.IdentitySeed = 0
Dim c2 As Column
c2 = New Column(tb, "Name", DataType.NVarChar(100))
c2.Nullable = False
tb.Columns.Add(c2)
tb.AnsiNullsStatus = True
'Create the table on the instance of SQL Server.
tb.Create()
Impostazione di diverse proprietà prima della creazione di un oggetto in Visual C#
In questo esempio di codice viene illustrato come impostare direttamente la proprietà AnsiNullsStatus dell'oggetto Table e come creare e aggiungere colonne prima di creare l'oggetto Table.
'Connect to the local, default instance of SQL Server.
Dim srv As Server
srv = New Server
'Create a new table in the AdventureWorks database.
Dim db As Database
db = srv.Databases("AdventureWorks")
Dim tb As Table
'Specify the parent database, table schema and the table name in the constructor.
tb = New Table(db, "Test_Table", "HumanResources")
'Add columns because the table requires columns before it can be created.
Dim c1 As Column
'Specify the parent table, the column name and data type in the constructor.
c1 = New Column(tb, "ID", DataType.Int)
tb.Columns.Add(c1)
c1.Nullable = False
c1.Identity = True
c1.IdentityIncrement = 1
c1.IdentitySeed = 0
Dim c2 As Column
c2 = New Column(tb, "Name", DataType.NVarChar(100))
c2.Nullable = False
tb.Columns.Add(c2)
tb.AnsiNullsStatus = True
'Create the table on the instance of SQL Server.
tb.Create()
{
//Connect to the local, default instance of SQL Server.
Server srv;
srv = new Server();
//Create a new table in the AdventureWorks database.
Database db;
db = srv.Databases("AdventureWorks");
Table tb;
//Specify the parent database, table schema, and the table name in the constructor.
tb = new Table(db, "Test_Table", "HumanResources");
//Add columns because the table requires columns before it can be created.
Column c1;
//Specify the parent table, the column name, and data type in the constructor.
c1 = new Column(tb, "ID", DataType.Int);
tb.Columns.Add(c1);
c1.Nullable = false;
c1.Identity = true;
c1.IdentityIncrement = 1;
c1.IdentitySeed = 0;
Column c2;
c2 = new Column(tb, "Name", DataType.NVarChar(100));
c2.Nullable = false;
tb.Columns.Add(c2);
tb.AnsiNullsStatus = true;
//Create the table on the instance of SQL Server.
tb.Create();
}
Scorrimento di tutte le proprietà di un oggetto in Visual Basic
In questo esempio di codice viene eseguito lo scorrimento della raccolta Properties dell'oggetto StoredProcedure e vengono visualizzati gli oggetti nella schermata di output di Visual Studio.
Nell'esempio l'oggetto Property è stato inserito tra parentesi quadre in quanto è anche una parola chiave di Visual Basic.
'Connect to the local, default instance of SQL Server.
Dim srv As Server
srv = New Server
'Set properties on the uspGetEmployeedManagers stored procedure on the AdventureWorks database.
Dim db As Database
db = srv.Databases("AdventureWorks")
Dim sp As StoredProcedure
sp = db.StoredProcedures("uspGetEmployeeManagers")
sp.AnsiNullsStatus = False
sp.QuotedIdentifierStatus = False
'Iterate through the properties of the stored procedure and display.
'Note the Property object requires [] parentheses to distinguish it from the Visual Basic key word.
Dim p As [Property]
For Each p In sp.Properties
Console.WriteLine(p.Name & p.Value)
Next
Scorrimento di tutte le proprietà di un oggetto in Visual C#
In questo esempio di codice viene eseguito lo scorrimento della raccolta Properties dell'oggetto StoredProcedure e vengono visualizzati gli oggetti nella schermata di output di Visual Studio.
{
//Connect to the local, default instance of SQL Server.
Server srv;
srv = new Server();
//Set properties on the uspGetEmployeedManagers stored procedure on the AdventureWorks database.
Database db;
db = srv.Databases("AdventureWorks");
StoredProcedure sp;
sp = db.StoredProcedures("uspGetEmployeeManagers");
sp.AnsiNullsStatus = false;
sp.QuotedIdentifierStatus = false;
//Iterate through the properties of the stored procedure and display.
Property p;
foreach ( p in sp.Properties) {
Console.WriteLine(p.Name + p.Value);
}
}
Impostazione dei campi di inizializzazione predefiniti in Visual Basic
In questo esempio di codice viene illustrato come ridurre il numero di proprietà dell'oggetto inizializzate in un programma SMO. È necessario includere l'istruzione using System.Collections.Specialized per utilizzare l'oggetto StringCollection.
SQL Server Profiler consente di confrontare il numero di istruzioni inviate all'istanza di SQL Server con questa ottimizzazione.
'Connect to the local, default instance of SQL Server.
Dim srv As Server
srv = New Server
'Reference the AdventureWorks database.
Dim db As Database
db = srv.Databases("AdventureWorks")
'Assign the Table object type to a System.Type object variable.
Dim tb As Table
Dim typ As Type
tb = New Table
typ = tb.GetType
'Assign the current default initialization fields for the Table object type to a
'StringCollection object variable.
Dim sc As StringCollection
sc = srv.GetDefaultInitFields(typ)
'Set the default initialization fields for the Table object type to the CreateDate property.
srv.SetDefaultInitFields(typ, "CreateDate")
'Retrieve the Schema, Name, and CreateDate properties for every table in AdventureWorks.
'Note that the improvement in performance can be viewed in SQL Profiler.
For Each tb In db.Tables
Console.WriteLine(tb.Schema + "." + tb.Name + " " + tb.CreateDate)
Next
'Set the default initialization fields for the Table object type back to the original settings.
srv.SetDefaultInitFields(typ, sc)
Impostazione dei campi di inizializzazione predefiniti in Visual C#
In questo esempio di codice viene illustrato come ridurre il numero di proprietà dell'oggetto inizializzate in un programma SMO. È necessario includere l'istruzione using System.Collections.Specialized per utilizzare l'oggetto StringCollection.
SQL Server Profiler consente di confrontare il numero di istruzioni inviate all'istanza di SQL Server con questa ottimizzazione.
{
//Connect to the local, default instance of SQL Server.
Server srv;
srv = new Server();
//Reference the AdventureWorks database.
Database db;
db = srv.Databases("AdventureWorks");
//Assign the Table object type to a System.Type object variable.
Table tb;
Type typ;
tb = new Table();
typ = tb.GetType;
//Assign the current default initialization fields for the Table object type to a
//StringCollection object variable.
StringCollection sc;
sc = srv.GetDefaultInitFields(typ);
//Set the default initialization fields for the Table object type to the CreateDate property.
srv.SetDefaultInitFields(typ, "CreateDate");
//Retrieve the Schema, Name, and CreateDate properties for every table in AdventureWorks.
//Note that the improvement in performance can be viewed in SQL Server Profiler.
foreach ( tb in db.Tables) {
Console.WriteLine(tb.Schema + "." + tb.Name + " " + tb.CreateDate);
}
//Set the default initialization fields for the Table object type back to the original settings.
srv.SetDefaultInitFields(typ, sc);
}