| 

.NET C# Java Javascript Exception

4
Hallo zusammen,

weiß jemand wie man in C# über Adox eine Access-Tabelle mit einem zusammengesetzten Key anlegen kann?

Habe eine DataTable in der die Keys angelegt sind. Wenn zwei Keys enthalten sind dann wird der erste angelegt aber der zweite Key wird in Access nicht erstellt. (kann man ja in der Entwurfsansicht der Tabelle von Accees kontrollieren). Im DataTable sind die Columns auch schon mit Datentyp angelegt

Hier mein Code:
private static void CreateKeys(DataTable exportData, Table nTable)
{
try
{
string[] colNames = new string[exportData.PrimaryKey.Count()];
string keyName = "PrimaryKey";

for (int i = 0; i < exportData.PrimaryKey.Count(); i++)
{
DataColumn key = exportData.PrimaryKey.GetValue(i) as DataColumn;
Column col = nTable.Columns[key.ColumnName];

if (i == 0)
{
nTable.Keys.Append(keyName, KeyTypeEnum.adKeyPrimary, key.ColumnName, null, null);
}
else
{
if (col != null)
{
nTable.Keys[keyName].Columns.Append(key.ColumnName, col.Type, 250);
}
}
}
}
catch (Exception ex)
{
}

}


Hat jemand eine Idee warum das nicht funtkioniert?

Danke
Marcus
News:
06.02.2014
MarcusS 207 1 5
Hallo Marcus, aus deiner Frage geht für mich noch nicht klar hervor, was du vorhast. Möchtest du nun *einen* (aus mehreren Columns) zusammengesetzten Key anlegen, oder mehrere Keys (von denen nur einer der Primary Key sein kann?
Maria Simlinger 06.02.2014
3 Antworten
2
Ich denke, so wie im Beispiel gezeigt wird es nicht ganz funktionieren, da meiner Meinung nach ein einzelner Key in der Schleife hinzugefügt wird, aber keiner der zusammenhängt. Kann es leider gerade nicht ausprobieren. Hier aber zwei Beispiele wie es gehen könnte:

1. Beispiel per Code
Key priKey = new Key();
priKey.Name = "PrimaryKey";
priKey.Columns.Append(DeineErsteSpalte, DataTypeEnum.DeinDatenTyp, Laenge);
priKey.Columns.Append(DeineZweiteSpalte, DataTypeEnum.DeinDatenTyp, Laenge);
// Und beide erst jetzt der Zieltabelle hinzufügen
nTable.Keys.Append((object)priKey, KeyTypeEnum.adKeyPrimary, null, null, null);

2. Beispiel 2 per DDL
Oder das ganze erst zum Schluss, wenn die Tabelle angelegt wurde als SQL Befehl:
ALTER TABLE ZielTabelle ADD CONSTRAINT PrimaryKey PRIMARY KEY ([Feld1], [Feld2])
07.02.2014
JEwen 2,7k 5
1
Hallo Marcus,

wenn du wirklich einen zusammengesetzten Key generieren möchtest, sollte diese Anpassung deinen Code zum funktionieren bringen:

try
{
string[] colNames = new string[exportData.PrimaryKey.Count()];
string keyName = "PrimaryKey";

var key = new Key();
key.Name = keyName;
key.Type = KeyTypeEnum.adKeyPrimary;

for (int j = 0; j < exportData.PrimaryKey.Count(); j++)
{
DataColumn keyCol = exportData.PrimaryKey[j];
Column col = nTable.Columns[keyCol.ColumnName];
key.Columns.Append(col, col.Type, col.Precision);

// das hier weg...
//if (i == 0)
//{
// nTable.Keys.Append(keyName, KeyTypeEnum.adKeyPrimary, key.ColumnName, null, null);
//}
//else
//{
// if (col != null)
// {
// nTable.Keys[keyName].Columns.Append(key.ColumnName, col.Type, 250);
// }
//}
}
nTable.Keys.Append(key);
}
catch (Exception ex)
{
//pfui leer ;)
}




hth :)
Maria

PS [(eckige Klammer)i] wird zu italics, musste die Schleifenvariable auf j ändern... hmm [/i]
07.02.2014
Maria Simlinger 1,1k 1 9
0
Hallo Maria,

funktioniert leider nicht - irgendwo ist noch ein Fehler.
Der Code wird durchlaufen aber in der AccessDatei habe ich dann nur eine Spalte/Column vor der der gelbe Schlüssel ist.

Müsste nicht vor jeder Spalte/Column ein gelber Schlüssel stehen?

GEgenüber Deinem Code habe ich nur eine Zeile geändert, weil er mit der Column nicht zurecht gekommen ist. Jetzt wird nur noch der Spaltennamen übergeben (key.Columns.Append(col.Name, ...))

string[] colNames = new string[exportData.PrimaryKey.Count()];

var key = new Key();
key.Name = keyName;
key.Type = KeyTypeEnum.adKeyPrimary;

for (int j = 0; j < keyCount; j++)
{
DataColumn keyCol = exportData.PrimaryKey[j];
Column col = nTable.Columns[keyCol.ColumnName];
key.Columns.Append(col.Name, col.Type, col.Precision);
}

nTable.Keys.Append(key);


Hast Du noch eine Idee?
18.02.2014
MarcusS 207 1 5
Zwei Gedanken: Die Tabelle hatte davor keinen Primary Key? Falls doch -> entferne den. Wenns weiterhin nicht geht versuche key.Columns.Append(col), ohne weitere Parameter.
Maria Simlinger 18.02.2014
Dkorrekte Anweisung für Append lautet key.Columns.Append(column.Name, column.Type, column.DefinedSize); (DefinedSize statt Precision)
Maria Simlinger 19.02.2014

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH