Indexerstellung nicht möglich?

04/02/2008 - 06:53 von Dirk Michaelsen | Report spam
Guten Morgen,

ich habe eine C#-Applikation geschrieben, die eine SQL Server Compact
Edition Datenbank für eine MDE-Anwendung erstellt. Das Füllen der
Datenbank funktioniert auch soweit sehr gut. Lediglich die Erstellung
der Indizes will einfach nicht funktionieren.

Zur Erstellung der Indizes verwende ich folgende Methode:

snip
private SqlCeConnection conn;
private SqlCeTransaction trans;

public void GenerateIndices()
{
Console.WriteLine("Erstelle Indizes");
try
{
trans = conn.BeginTransaction();

string[] indexDefinitions =
{
"CREATE INDEX ArtstmId ON Artikel (artstm_id)",
"CREATE INDEX ArtikelNr ON Artikel (artikel_nr)",
"CREATE INDEX MestmId ON Mengeneinheiten (mestm_id)",
"CREATE INDEX ArtstmId ON Mengeneinheiten
(artstm_artstm_id)",
"CREATE INDEX MestmId ON Ean (mestm_mestm_id)",
"CREATE INDEX Ean ON Ean (ean)",
"CREATE INDEX MestmId ON Konditionen (mestm_mestm_id)"
};

foreach (string index in indexDefinitions)
{
Console.WriteLine("sende SQL-Command: " + index);
SqlCeCommand cmd = conn.CreateCommand();
cmd.CommandText = index;
cmd.ExecuteNonQuery(); // dies ist Zeile 140
}
trans.Commit();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
snip

Bereits beim ersten Aufruf von cmd.ExecuteNonQuery() springt die
Anwendung in den Catch-Block mit der relativ nichtssagenden Meldung
"[Artikel]" und dem folgenden Exception-Stacktrace:

$exception {" [ Artikel ]"} System.Exception
{System.Data.SqlServerCe.SqlCeException}
bei System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr)
bei System.Data.SqlServerCe.SqlCeCommand.ExecuteCommandText(IntPtr&
pCursor, Boolean& isBaseTableCursor)
bei
System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior
behavior, String method, ResultSetOptions options)
bei System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery()
bei MDEDatenImport.DataConnection.GenerateIndices() in C:\Dokumente
und Einstellungen\dimich\Eigene Dateien\Visual Studio
2005\Projects\MDEDatenImport\MDEDatenImport\DataConnection.cs:Zeile
140.

Was mache ich falsch?

Gruß
Dirk
 

Lesen sie die antworten

#1 Peter Doering
04/02/2008 - 11:38 | Warnen spam
Hallo,

Dirk Michaelsen wrote:

ich habe eine C#-Applikation geschrieben, die eine SQL Server Compact
Edition Datenbank für eine MDE-Anwendung erstellt. Das Füllen der
Datenbank funktioniert auch soweit sehr gut. Lediglich die Erstellung
der Indizes will einfach nicht funktionieren.

Zur Erstellung der Indizes verwende ich folgende Methode:

snip
"CREATE INDEX ArtstmId ON Artikel (artstm_id)",
"CREATE INDEX ArtikelNr ON Artikel (artikel_nr)",
"CREATE INDEX MestmId ON Mengeneinheiten (mestm_id)",
"CREATE INDEX ArtstmId ON Mengeneinheiten
(artstm_artstm_id)",
"CREATE INDEX MestmId ON Ean (mestm_mestm_id)",
"CREATE INDEX Ean ON Ean (ean)",
"CREATE INDEX MestmId ON Konditionen (mestm_mestm_id)"
snip

Bereits beim ersten Aufruf von cmd.ExecuteNonQuery() springt die
Anwendung in den Catch-Block mit der relativ nichtssagenden Meldung
"[Artikel]" und dem folgenden Exception-Stacktrace:
snip



Mit der Meldung kann ich auch nix anfangen, aber hast du denn mal geprueft,
ob sich die SQL-Statements im Management Studio ausfuehren lassen?

Kritische Punkte koennten sein:

1. Du hast den Indexen nur Feldnamen, nicht die Tabellennamen mitgegeben.
Falls das Strategie ist, koennte es in anderen Tabellen bereits einen Index
gleichen Namens geben, was nicht erlaubt waere. Die uebliche Syntax fuer
den Indexnamen waere [Artikel$ArtstmID].

2. Du pruefst nicht, ob der Index bereits besteht:

IF EXISTS (SELECT * FROM sys.indexes WHERE object_id OBJECT_ID(N'[dbo].[Artikel]') AND name = N'ArtstmId')

Gruss - Peter

2. SQL Server-Entwickler-Konferenz
Nürnberg, 12./13.4.2008 + 19./20.4.2008
http://www.donkarl.com/SEK

Ähnliche fragen