Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Unbekannter Fehler MsSQL AdoDataset.Append (https://www.delphipraxis.net/172162-unbekannter-fehler-mssql-adodataset-append.html)

Perlsau 16. Dez 2012 19:39

Datenbank: MsSQL • Version: 2012 • Zugriff über: dbGo (Ado)

Unbekannter Fehler MsSQL AdoDataset.Append
 
Guten Abend allerseits,

ich habe folgendes Problem mit einer lokalen MsSQL-Datenbank, auf die ich via dbGo-Komponenten zugreife: Wenn ich einen neuen Datensatz via Dataset.Append oder auch Dataset.Insert anlege, kommt einer Fehlermeldung (unbekannter Fehler) noch vor dem Post bereits bei der Zuweisung
Delphi-Quellcode:
Dataset.FieldByName('Feldname').AsString := 'Inhalt';
. Mache ich dasselbe jedoch via SQL (TAdoQuery.ExecSQL), klappt die Zuweisung fehlerfrei.

Anfangs hatte ich durch allerlei Recherchen und Herumprobieren den Eindruck erhalten, es läge vielleicht daran, daß ich datensensitive Komponenten wie TDbEdit usw. einsetze. Der Fehler tauchte nämlich bereits beim Verlassen eines datensensitiven Eingabefeldes auf. Nach der mühevollen Umstellung auf "normale" Eingabefelder erschien jedoch derselbe unbekannte Fehler beim Zuweisen. Seltsamerweise kann ich Daten in die Felder eines bereits bestehenden Datensatzes ohne Fehler zuweisen (Dataset.Edit).

Nun habe ich irgendwo gelesen, es handle sich um ein Entwurfsproblem, jedoch keine weiteren Hinweise gefunden, was ich beim Entwurf (create table) der Tabelle falsch gemacht haben könnte. Das letzte Änderungsscript:
Code:
/*
   Sonntag, 16. Dezember 2012 00:56:49
*/

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.FilmTitel
   DROP CONSTRAINT DF_Titel_Filmtitel
GO
ALTER TABLE dbo.FilmTitel
   DROP CONSTRAINT DF_FilmTitel_Dauer
GO
ALTER TABLE dbo.FilmTitel
   DROP CONSTRAINT DF_FilmTitel_Medium
GO
ALTER TABLE dbo.FilmTitel
   DROP CONSTRAINT DF_FilmTitel_Jahr
GO
ALTER TABLE dbo.FilmTitel
   DROP CONSTRAINT DF_FilmTitel_Format
GO
ALTER TABLE dbo.FilmTitel
   DROP CONSTRAINT DF_FilmTitel_markiert
GO
ALTER TABLE dbo.FilmTitel
   DROP CONSTRAINT DF_FilmTitel_gesehen
GO
ALTER TABLE dbo.FilmTitel
   DROP CONSTRAINT DF_FilmTitel_FSK
GO
CREATE TABLE dbo.Tmp_FilmTitel
   (
   Idx_Titel bigint NOT NULL IDENTITY (1, 1),
   Titel_Name varchar(100) COLLATE Latin1_General_CI_AS NOT NULL,
   Dauer smallint NOT NULL,
   Medium varchar(50) COLLATE Latin1_General_CI_AS NULL,
   Jahr smallint NULL,
   Inhalt text COLLATE Latin1_General_CI_AS NULL,
   Format smallint NOT NULL,
   markiert bit NOT NULL,
   gesehen bit NOT NULL,
   FSK smallint NOT NULL
   ) ON [PRIMARY]
    TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_FilmTitel SET (LOCK_ESCALATION = TABLE)
GO
DECLARE @v sql_variant
SET @v = N'Index für Filmtitel'
EXECUTE sp_addextendedproperty N'MS_Description', @v, N'SCHEMA', N'dbo', N'TABLE', N'Tmp_FilmTitel', N'COLUMN', N'Idx_Titel'
GO
DECLARE @v sql_variant
SET @v = N'Titel des Films'
EXECUTE sp_addextendedproperty N'MS_Description', @v, N'SCHEMA', N'dbo', N'TABLE', N'Tmp_FilmTitel', N'COLUMN', N'Titel_Name'
GO
ALTER TABLE dbo.Tmp_FilmTitel ADD CONSTRAINT
   DF_Titel_Filmtitel DEFAULT ('Filmtitel') FOR Titel_Name
GO
ALTER TABLE dbo.Tmp_FilmTitel ADD CONSTRAINT
   DF_FilmTitel_Dauer DEFAULT ((0)) FOR Dauer
GO
ALTER TABLE dbo.Tmp_FilmTitel ADD CONSTRAINT
   DF_FilmTitel_Medium DEFAULT ('_unbekannt') FOR Medium
GO
ALTER TABLE dbo.Tmp_FilmTitel ADD CONSTRAINT
   DF_FilmTitel_Jahr DEFAULT ((2000)) FOR Jahr
GO
ALTER TABLE dbo.Tmp_FilmTitel ADD CONSTRAINT
   DF_FilmTitel_Format DEFAULT ((0)) FOR Format
GO
ALTER TABLE dbo.Tmp_FilmTitel ADD CONSTRAINT
   DF_FilmTitel_markiert DEFAULT ((0)) FOR markiert
GO
ALTER TABLE dbo.Tmp_FilmTitel ADD CONSTRAINT
   DF_FilmTitel_gesehen DEFAULT ((0)) FOR gesehen
GO
ALTER TABLE dbo.Tmp_FilmTitel ADD CONSTRAINT
   DF_FilmTitel_FSK DEFAULT ((0)) FOR FSK
GO
SET IDENTITY_INSERT dbo.Tmp_FilmTitel ON
GO
IF EXISTS(SELECT * FROM dbo.FilmTitel)
    EXEC('INSERT INTO dbo.Tmp_FilmTitel (Idx_Titel, Titel_Name, Dauer, Medium, Jahr, Inhalt, Format, markiert, gesehen, FSK)
      SELECT Idx_Titel, Titel_Name, Dauer, Medium, Jahr, Inhalt, Format, markiert, gesehen, FSK FROM dbo.FilmTitel WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_FilmTitel OFF
GO
DROP TABLE dbo.FilmTitel
GO
EXECUTE sp_rename N'dbo.Tmp_FilmTitel', N'FilmTitel', 'OBJECT'
GO
ALTER TABLE dbo.FilmTitel ADD CONSTRAINT
   PK_FilmTitel PRIMARY KEY CLUSTERED
   (
   Idx_Titel
   ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
COMMIT
select Has_Perms_By_Name(N'dbo.FilmTitel', 'Object', 'ALTER') as ALT_Per, Has_Perms_By_Name(N'dbo.FilmTitel', 'Object', 'VIEW DEFINITION') as View_def_Per, Has_Perms_By_Name(N'dbo.FilmTitel', 'Object', 'CONTROL') as Contr_Per

jobo 17. Dez 2012 07:49

AW: Unbekannter Fehler MsSQL AdoDataset.Append
 
Welche Fehlermeldung ist es genau?
Welcher Code führt zu dem Fehler? Der dargestellte ist ja offenbar Pseudocode..

Bummi 17. Dez 2012 08:41

AW: Unbekannter Fehler MsSQL AdoDataset.Append
 
Das dargestellte ist ein SQL-Script der die Struktur der Tabellen beschreibt(eigentlich ein Änderungsscript).
Hast Du einmal versucht wie sich das ganze Verhält wenn Du
- die Spalten die in der DB einen Defaultwert bekommen im AfterInsert codeseitig mit Werten vorbelegst
- Serverseitige Cursor verwendest

Jumpy 17. Dez 2012 09:08

AW: Unbekannter Fehler MsSQL AdoDataset.Append
 
Muss man nicht bei MSSQL auf case-sensitive achten?

Bummi 17. Dez 2012 09:32

AW: Unbekannter Fehler MsSQL AdoDataset.Append
 
Zitat:

Sie können die Nichtunterscheidung nach Groß-/Kleinbuchstaben durch Angeben von "_CI" explizit auswählen.
http://msdn.microsoft.com/de-de/libr...3-a4c39b0f39eb

Perlsau 17. Dez 2012 11:34

AW: Unbekannter Fehler MsSQL AdoDataset.Append
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von jobo (Beitrag 1195728)
Welche Fehlermeldung ist es genau?

Es gibt keine genaue Fehlermeldung. Im Error-Fenster steht lediglich "Unbekannter Fehler". Alle Zuweisungen führen zu dieser Fehlermeldung.

Zitat:

Zitat von Bummi (Beitrag 1195737)
Das dargestellte ist ein SQL-Script der die Struktur der Tabellen beschreibt(eigentlich ein Änderungsscript).
Hast Du einmal versucht wie sich das ganze Verhält wenn Du
- die Spalten die in der DB einen Defaultwert bekommen im AfterInsert codeseitig mit Werten vorbelegst
- Serverseitige Cursor verwendest

Bei Vorbelegung geschieht das Gleiche. Der serverseitige Cursor hat nur die eine Auswirkung: alles wird viel viel langsamer.

Zitat:

Zitat von Jumpy (Beitrag 1195738)
Muss man nicht bei MSSQL auf case-sensitive achten?

Muß man, wenn das eingestellt ist. Hat aber mit meinem Problem nicht zu tun.

Ich hab eben nach dem Frühstück eine Testanwendung und eine Testdatenbank mit drei Tabellen angelegt: Einmal Person mit Personendaten und einmal Land mit ein paar EU-Ländern, auf die das Feld Land aus der Tabelle Person verweist. Danach hab ich in meiner Testanwendung DB-Editfelder und eine TDBLookUpComboBox eingebaut und konnte editieren und einfügen (Dataset.Edit und Dataset.Append bzw. Dataset.Insert) ohne Fehlermeldung. Dann hab ich mir noch eine Tabelle (DBGrid) auf die Form geklatscht. Noch immer funktionierte alles bestns. So, und jetzt kommt's:

Nachdem ich im Feld-Editor des Datasets für die Pesonendaten (Aset_Person) ein neues Feld angelegt hatte, erschien wieder dieser unbekannte Fehler beim Wechsel von einem Editfeld ins nächste. Dieses neue Feld, das einfach für den Integer-Wert im Feld Land der Tabelle Person das entsprechende Land statt dem Index anzeigt, benötige ich für die Tabellendarstellung im DBGrid. Ich werde nun einmal versuchen, mit einem View zu arbeiten, da die Tabelle ja ReadOnly ist und ich so den Landnamen schon im View (in der Datenbank) ermitteln und betreitstellen kann.

Perlsau 17. Dez 2012 11:44

Nachtrag: gelöst
 
Ich habe jetzt aufgrund des Hinweises von Bummi die Lösung gefunden:

Wenn ich statt in AfterInsert gleich nach dem Dataset.Append die entsprechenden Spalten vorbelege – nämlich die mit einem Fremdschlüssel –, erscheint der Fehler nicht. Hurra :thumb:

Und ich hab heute nacht bis in die frühen Morgenstunden herumprobiert, aber darauf bin ich nicht gekommen :?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz