Autoinrement bei ADO.NET
-
Eigentlich sollt beim Insert die ID-Spalte automatisch wegfallen...
Dann hast Du entweder in Deiner DB was falsch definiert und er konnte die "ID"-Spalte nicht automatisch als Primär-Key identifizieren oder Du musst das Insert-Statement von Hand anpassen...Was für eine Version von VS? 2003 oder 2005? (ich vermute 2005, oder?)
-
ja ich benutze 2005.
Soll ich mal die Einstellungen der ID-Spalte posten?`!
-
"INSERT INTO [dbo].[inventar_data] ([ID], [gelöscht], [titel], [kategorie], [verli"
L"ehen], [ordner], [seite]) VALUES (@ID, @gelöscht, @titel, @kategorie, @verliehen"
L", @ordner, @seite);\r\nSELECT ID, gelöscht, titel, kategorie, verliehen, ordner, s"
L"eite FROM inventar_data WHERE (ID = @ID)"Konfiguriere den Adapter neu und lass beim Insert die ID weg.
-
marcap schrieb:
Soll ich mal die Einstellungen der ID-Spalte posten?`!
Ja, mach doch mal...
Bei mit sieht der "InsertQuery" so aus:INSERT INTO [dbo].[Test1] ([Name], [Vorname]) VALUES (@Name, @Vorname); SELECT ID, Name, Vorname FROM Test1 WHERE (ID = SCOPE_IDENTITY())
Das XSD der Tabelle sieht bei mir so aus (der untere Teil der xsd-Datei):
<xs:element name="TestDBDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true" msprop:Generator_UserDSName="TestDBDataSet" msprop:Generator_DataSetName="TestDBDataSet"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="Test1" msprop:Generator_UserTableName="Test1" msprop:Generator_RowDeletedName="Test1RowDeleted" msprop:Generator_RowChangedName="Test1RowChanged" msprop:Generator_RowClassName="Test1Row" msprop:Generator_RowChangingName="Test1RowChanging" msprop:Generator_RowEvArgName="Test1RowChangeEvent" msprop:Generator_RowEvHandlerName="Test1RowChangeEventHandler" msprop:Generator_TableClassName="Test1DataTable" msprop:Generator_TableVarName="tableTest1" msprop:Generator_RowDeletingName="Test1RowDeleting" msprop:Generator_TablePropName="Test1"> <xs:complexType> <xs:sequence> <xs:element name="ID" msdata:ReadOnly="true" msdata:AutoIncrement="true" msprop:Generator_UserColumnName="ID" msprop:Generator_ColumnPropNameInRow="ID" msprop:Generator_ColumnVarNameInTable="columnID" msprop:Generator_ColumnPropNameInTable="IDColumn" type="xs:long" /> <xs:element name="Name" msprop:Generator_UserColumnName="Name" msprop:Generator_ColumnPropNameInRow="Name" msprop:Generator_ColumnVarNameInTable="columnName" msprop:Generator_ColumnPropNameInTable="NameColumn" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="50" /> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="Vorname" msprop:Generator_UserColumnName="Vorname" msprop:Generator_ColumnPropNameInRow="Vorname" msprop:Generator_ColumnVarNameInTable="columnVorname" msprop:Generator_ColumnPropNameInTable="VornameColumn" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="50" /> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> <xs:unique name="Constraint1" msdata:PrimaryKey="true"> <xs:selector xpath=".//mstns:Test1" /> <xs:field xpath="mstns:ID" /> </xs:unique> </xs:element>
Und dann erkennt er eigentlich die ID-Spalte als Primary-Key/Autoincrement und lässt sie beim Insert raus...
@Knuddlbaer: Eigentlich muss man nichts von Hand verändern!!! Wenn man die Tabelle korrekt angelegt hat, sollte alles automatisch funktionieren!
-
Also die Einstellungen kann man auf dem Bild www.marcap.de/idspalte.JPG anschauen
Hier die XSD:
<xs:element name="inventarDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true" msprop:Generator_UserDSName="inventarDataSet" msprop:Generator_DataSetName="inventarDataSet"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="inventar_data" msprop:Generator_UserTableName="inventar_data" msprop:Generator_RowDeletedName="inventar_dataRowDeleted" msprop:Generator_RowChangedName="inventar_dataRowChanged" msprop:Generator_RowClassName="inventar_dataRow" msprop:Generator_RowChangingName="inventar_dataRowChanging" msprop:Generator_RowEvArgName="inventar_dataRowChangeEvent" msprop:Generator_RowEvHandlerName="inventar_dataRowChangeEventHandler" msprop:Generator_TableClassName="inventar_dataDataTable" msprop:Generator_TableVarName="tableinventar_data" msprop:Generator_RowDeletingName="inventar_dataRowDeleting" msprop:Generator_TablePropName="inventar_data"> <xs:complexType> <xs:sequence> <xs:element name="ID" msdata:AutoIncrement="true" msprop:Generator_UserColumnName="ID" msprop:Generator_ColumnVarNameInTable="columnID" msprop:Generator_ColumnPropNameInRow="ID" msprop:Generator_ColumnPropNameInTable="IDColumn" type="xs:int" /> <xs:element name="gelöscht" msprop:Generator_UserColumnName="gelöscht" msprop:Generator_ColumnVarNameInTable="columngelöscht" msprop:Generator_ColumnPropNameInRow="gelöscht" msprop:Generator_ColumnPropNameInTable="gelöschtColumn" type="xs:boolean" minOccurs="0" /> <xs:element name="titel" msprop:Generator_UserColumnName="titel" msprop:Generator_ColumnVarNameInTable="columntitel" msprop:Generator_ColumnPropNameInRow="titel" msprop:Generator_ColumnPropNameInTable="titelColumn" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="30" /> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="kategorie" msprop:Generator_UserColumnName="kategorie" msprop:Generator_ColumnVarNameInTable="columnkategorie" msprop:Generator_ColumnPropNameInRow="kategorie" msprop:Generator_ColumnPropNameInTable="kategorieColumn" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="20" /> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="verliehen" msprop:Generator_UserColumnName="verliehen" msprop:Generator_ColumnVarNameInTable="columnverliehen" msprop:Generator_ColumnPropNameInRow="verliehen" msprop:Generator_ColumnPropNameInTable="verliehenColumn" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="20" /> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="ordner" msprop:Generator_UserColumnName="ordner" msprop:Generator_ColumnVarNameInTable="columnordner" msprop:Generator_ColumnPropNameInRow="ordner" msprop:Generator_ColumnPropNameInTable="ordnerColumn" type="xs:int" minOccurs="0" /> <xs:element name="seite" msprop:Generator_UserColumnName="seite" msprop:Generator_ColumnVarNameInTable="columnseite" msprop:Generator_ColumnPropNameInRow="seite" msprop:Generator_ColumnPropNameInTable="seiteColumn" type="xs:int" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType>
-
[edit]
-
marcap schrieb:
Hier die XSD:
Du musst die ID-Spalte noch als Primär-Schlüssel definieren!!!
Was für eine Datenbank verwendest Du? MS SQL Express?
-
Wo in der xsd wird bei Dir die ID als Primary deklariert ? Ich sehe es nicht :o(
Bei marcap steht noch ergeänzend:
<xs:unique name="Constraint1" msdata:PrimaryKey="true"> <xs:selector xpath=".//mstns:inventar_data" /> <xs:field xpath="mstns:ID" /> </xs:unique>
-
Knuddlbaer schrieb:
Wo in der xsd wird bei Dir die ID als Primary deklariert ? Ich sehe es nicht :o(
Ganz unten:
<xs:unique name="Constraint1" msdata:PrimaryKey="true"> <xs:selector xpath=".//mstns:Test1" /> <xs:field xpath="mstns:ID" /> </xs:unique>
-
Ich verwende eine .mdf vom MS SQL Server 2005 Pro
-
Ah ok,
jetzt springt mir die ID im Block entgegen. Das steht in der xsd von marcap auch drinne.
-
marcap schrieb:
Ich verwende eine .mdf vom MS SQL Server 2005 Pro
Dann definier doch bitte die Spalte "ID" als "Primary Key" und dann erzeuge das DataSet nochmals...
-
Knuddlbaer schrieb:
Das steht in der xsd von marcap auch drinne.
Was steht da drin!? Ich kann nix finden von "Constraint" und "Primary"...
-
Unfairerweise hab ich das komplette Projekt hier liegen. Die Tabelle schaut folgt aus:
<xs:element name="inventarDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true" msprop:Generator_UserDSName="inventarDataSet" msprop:Generator_DataSetName="inventarDataSet"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="inventar_data" msprop:Generator_UserTableName="inventar_data" msprop:Generator_RowDeletedName="inventar_dataRowDeleted" msprop:Generator_RowChangedName="inventar_dataRowChanged" msprop:Generator_RowClassName="inventar_dataRow" msprop:Generator_RowChangingName="inventar_dataRowChanging" msprop:Generator_RowEvArgName="inventar_dataRowChangeEvent" msprop:Generator_RowEvHandlerName="inventar_dataRowChangeEventHandler" msprop:Generator_TableClassName="inventar_dataDataTable" msprop:Generator_TableVarName="tableinventar_data" msprop:Generator_RowDeletingName="inventar_dataRowDeleting" msprop:Generator_TablePropName="inventar_data"> <xs:complexType> <xs:sequence> <xs:element name="ID" msdata:AutoIncrement="true" msprop:Generator_UserColumnName="ID" msprop:Generator_ColumnPropNameInRow="ID" msprop:Generator_ColumnVarNameInTable="columnID" msprop:Generator_ColumnPropNameInTable="IDColumn" type="xs:int" /> <xs:element name="gelöscht" msprop:Generator_UserColumnName="gelöscht" msprop:Generator_ColumnPropNameInRow="gelöscht" msprop:Generator_ColumnVarNameInTable="columngelöscht" msprop:Generator_ColumnPropNameInTable="gelöschtColumn" type="xs:boolean" minOccurs="0" /> <xs:element name="titel" msprop:Generator_UserColumnName="titel" msprop:Generator_ColumnPropNameInRow="titel" msprop:Generator_ColumnVarNameInTable="columntitel" msprop:Generator_ColumnPropNameInTable="titelColumn" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="30" /> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="kategorie" msprop:Generator_UserColumnName="kategorie" msprop:Generator_ColumnPropNameInRow="kategorie" msprop:Generator_ColumnVarNameInTable="columnkategorie" msprop:Generator_ColumnPropNameInTable="kategorieColumn" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="20" /> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="verliehen" msprop:Generator_UserColumnName="verliehen" msprop:Generator_ColumnPropNameInRow="verliehen" msprop:Generator_ColumnVarNameInTable="columnverliehen" msprop:Generator_ColumnPropNameInTable="verliehenColumn" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="20" /> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="ordner" msprop:Generator_UserColumnName="ordner" msprop:Generator_ColumnPropNameInRow="ordner" msprop:Generator_ColumnVarNameInTable="columnordner" msprop:Generator_ColumnPropNameInTable="ordnerColumn" type="xs:int" minOccurs="0" /> <xs:element name="seite" msprop:Generator_UserColumnName="seite" msprop:Generator_ColumnPropNameInRow="seite" msprop:Generator_ColumnVarNameInTable="columnseite" msprop:Generator_ColumnPropNameInTable="seiteColumn" type="xs:int" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> <xs:unique name="Constraint1" msdata:PrimaryKey="true"> <xs:selector xpath=".//mstns:inventar_data" /> <xs:field xpath="mstns:ID" /> </xs:unique> </xs:element>
-
Dann sollte es auch korrekt funktionieren und die ID-Spalte sollte nicht vorhanden sein. Also einfach den "Insert-Befehl" löschen und neu anlegen lassen...
-
Das Problem war die fehlende Einstellung für das AutoIncrement im SQLServer
http://www.rothmichael.de/cpp/Tabelle.png
Marcap hat im DataSet nachträglich das AutoIncrement umgeschaltet, der Wizzard musste also davon ausgehen, das die ID manuell erzeugt wird.