Ich versuche, erweiterte Eigenschaften für Tabellen und Spalten in einer Winforms C # -Anwendung zu lesen. Ich verwende dazu SQL Server SMO. Wenn ich die Anwendung ausführe, werden die erweiterten Eigenschaften nicht angezeigt. Wenn ich jedoch die erweiterten Eigenschaften mit PowerShell lese, werden die erweiterten Eigenschaften angezeigt.
Der C # -Code:
var x = col.ExtendedProperties.Count;
var NPI = col.ExtendedProperties["NPI"].Value;
bool npi = bool.Parse(NPI.ToString());
Der PowerShell-Code:
Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"
$server = New-Object Microsoft.SqlServer.Management.Smo.Server $env:COMPUTERNAME
$server.Databases["<db name>"].Tables["<table name>"].Columns["<column name>"].ExtendedProperties | Select Name, Value, State
Ich habe überprüft, dass sowohl Visual Studio als auch PowerShell dieselbe Version von SMO (11.0.0.0) verwenden. Wenn ich den C # -Code ausführe, ist col.ExtendedProperties.Count = 0, aber wenn ich den PowerShell-Code ausführe, erhalte ich:
Name Value State
---- ----- -----
NPI False Existing
Hat jemand eine Idee, warum dies passieren könnte?
zusätzliche Information
Im C # -Code öffne ich einen DataReader für eine Tabelle mit:
sourceServer.ConnectionContext.ExecuteReader(<select command>)
um die Daten aus der Tabelle abzurufen. Ich gehe dann mit DataReader in eine while-Schleife und in dieser while-Schleife habe ich:
foreach (Column col in sourceTable.Columns)
{
StringBuilder cleanData = CleanseColumn(col, dr[col.Name].ToString());
sbvalues.Append("'" + cleanData + "', ");
}
Wenn ich durch die gehe, hat foreach
die sourceTable
Variable ihre erweiterte Eigenschaft, die col
Spaltenvariable jedoch nicht.
quelle
Antworten:
Ich möchte @BradC nur ein wenig beschatten. Ich habe seinen Code in Visual Studio 2015 (Update 3) auf einem Windows 10 Pro x64-Computer gegen eine SQL Server 2014-Instanz getestet und kann bestätigen, dass Sie die erweiterten Eigenschaften eines Felds ohne Probleme erhalten können.
Zum Replizieren verwende ich eine meiner lokalen Datenbanken. Ich habe den folgenden Code-Snip verwendet, um einige erweiterte Eigenschaften zu definieren.
Ich habe ein neues Konsolenprojekt erstellt und die folgenden Referenzen hinzugefügt:
Alles aus:
Mein ganzer Code, basierend auf @ BradCs, sieht also so aus:
Natürlich können Sie jetzt auf die Eigenschaften zugreifen und deren Werte verwenden.
Der Count-Wert, der in Ihrem Beispiel nicht funktioniert hat:
quelle
Sie haben Ihren Code, der das
col
Objekt instanziiert , nicht angezeigt. Können wir diesen Code sehen?Wenn Sie so etwas wie die
GetSchemaTable()
Methode des Datenlesers verwenden, wird das tatsächliche Tabellenobjekt (SQL SMO) nicht zurückgegeben, sondern eine neue Tabelle mit vielen nützlichen Spalteneigenschaften, die jedoch (soweit ich sehen kann) keine erweiterten Eigenschaften enthält.Schauen Sie sich diese StackOverflow-Antwort von Christopher Klein an . Wenn ich das richtig lese, sollte dies ein tatsächliches SQL SMO-Tabellenobjekt zurückgeben, mit dem Sie meiner Meinung nach erweiterte Spalteneigenschaften abrufen können, etwa:
Wenn dies nicht funktioniert, bleiben Sie einfach bei Ihrer funktionierenden PowerShell-Version oder greifen Sie auf eine der anderen Ideen in dieser Antwort zurück .
quelle