Chiave primaria dupilcata non ne esco

giovedì 17 marzo 2005 - 11.56

lobax Profilo | Junior Member

salve,
ho un grosso problema con la fase di conferma di un ordine(nel mio caso conferma appuntamento) ho una transazione che va a buon fine solo a db vuoto, inseriche solo 1 record se tento sucessivamente mi restituisce:

report errore:(da pagina):

[OleDbException (0x80004005): L'apporto modifiche non è riuscito perché si è cercato di duplicare i valori nell'indice, nella chiave primaria o nella relazione. Modificare i dati nel campo o nei campi che contengono dati duplicati, rimuovere l'indice o ridefinire l'indice per consentire l'inserimento di voci duplicate, quindi ritentare l'operazione.]
System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(Int32 hr) +41
System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) +174
System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) +92
System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) +65
System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) +112
System.Data.OleDb.OleDbCommand.ExecuteNonQuery() +66
BSite.BSite.ConfermaAppuntamento.AddConfAppuntamento(Int32 Uid, String Gaid) in C:\Inetpub\bSite\componenti\ConfDataLogic.vb:69
bSite.chekApp.Page_Load(Object sender, EventArgs e) in C:\Inetpub\bSite\Customers\ChekApp.aspx.vb:36
System.Web.UI.Control.OnLoad(EventArgs e) +67
System.Web.UI.Control.LoadRecursive() +35
System.Web.UI.Page.ProcessRequestMain() +750

qui riporto la query incriminata:(su access di prova stesso problema cmq da pagina sulla trans)

PARAMETERS GAID Text ( 255 );
INSERT INTO Appuntamenti_Dettaglio ( APID, Ids, datapp, ora )
SELECT Appuntamenti_Confermati.APID, Servizi.IDS, Appuntamento.Ora, Appuntamento.DataApp
FROM Appuntamenti_Confermati, Servizi INNER JOIN Appuntamento ON Servizi.IDS = Appuntamento.IDS
WHERE (((Appuntamento.Gaid)=[gaid]));

da pagina faccio una transazione:
1 inserisco da appuntamento a apuntamenti_confermati
2 copio da appuntamenti_confermati a appuntamenti_dettaglio
3 cancello il record dalla tab appuntamento.

chiavi:
Servizi.IDS(incremento)
Appuntamenti_Confermati.APID(incremento)
Appuntamenti_Dettaglio APID e IDS (numerici duplicati ammessi) relazione molti a molti

Scusate la lunghezza spero che riusciate a capire x un aiuto.
grazie ciao

lobax Profilo | Junior Member

si lo so ma, il campo che fa capo alla tabella conferma(come fosse ordini) ha un id contatore quindi non è possibilile sia duplicato, la tabella di dettaglio dovrebbe accettare anche record duplicati(classico caso di più prodotti nello stesso ordine)
appunto per questo non capisco quale possa essere il dato duplicato:
Public Class ConfermaAppuntamento


Public Function AddConfAppuntamento(ByVal Uid As Integer, ByVal Gaid As String)

Dim BSconn As OleDbConnection ......[cut]
Dim TranString1 As String
Dim TranString2 As String
Dim TranString3 As String

TranString1 = "INSERT INTO Appuntamenti_Confermati (Uid, data_conf )VALUES (@uid, now()) "
Dim cmd1 As New OleDbCommand(TranString1, BSconn)
' e questa è ok

Dim parameterCustomerID As OleDbParameter = New OleDbParameter("@UID", OleDbType.Integer, 4)
parameterCustomerID.Value = CInt(Uid)
cmd1.Parameters.Add(parameterCustomerID)



TranString2 = " INSERT INTO Appuntamenti_Dettaglio ( APID, Ids, ora, datapp )" & _
" SELECT [Appuntamenti_Confermati].[Apid], [Servizi].[IDS], [Appuntamento].[ora], [Appuntamento].[DataApp]" & _
" FROM Appuntamenti_Confermati, Servizi INNER JOIN Appuntamento ON [Servizi].[IDS]=[Appuntamento].[IDS]" & _
" WHERE ((([Appuntamento].[Gaid])=[gaid])) "
Dim cmd2 As New OleDbCommand(TranString2, BSconn)
' come dicevi tu infatti questa canna

Dim parameterGuID As OleDbParameter = New OleDbParameter("@gaid", OleDbType.VarWChar, 100)
parameterGuID.Value = Gaid
cmd2.Parameters.Add(parameterGuID)

'c'e delete...ecc ...roba che non centra.

TranString3 = "DElETE FROM Appuntamento WHERE Gaid = @gaid"
'......poi commit ..
queste le relazioni tra record tabella e dettagilo_record tabella:
Relazioni:
Appuntamenti_ConfermatiAppuntamenti_Dettaglio
Appuntamenti_Confer
Appuntamenti_Dettag
APID 1 n APID
Attributes: Imposto
RelationshipType: Uno-a-molti
------------------------------------------------------------------------------
ServiziAppuntamenti_Dettaglio
Servizi
Appuntamenti_Dettag
IDS 1 n Ids
Attributes: Imposto
RelationshipType: Uno-a-molti
-------------------------------------------------------------------------------
ServiziAppuntamento
Servizi
Appuntamento
IDS 1 n IDS
Attributes: Imposto,
Aggiornamenti in cascata
RelationshipType: Uno-a-molti
--------------------------------------------------------------------------------
UsersAppuntamenti_Confermati
Users
Appuntamenti_Confer
Uid 1 n uid
Attributes: Imposto
RelationshipType: Uno-a-molti

insomma il classico ordini > dettaglio_ordini, ordine chiave contatore, e dettaglio_ordini doppia chiave quella del prodotto e quella dell'ordine, l'id provvisorio dell'appuntamento(carrello) è un guid di sistema che viene sostituito con l'id utente al login, sul tipo di ibuyspy .
bel casino da spiegare...centra qualche cosa che uso un guid?..non so che altre spiegazioni dare.
sono nella.........m
ciao grz

lobax Profilo | Junior Member

Il problema sta in questa query:
(test da access)
PARAMETERS GAID Text ( 255 );
INSERT INTO Appuntamenti_Dettaglio ( APID, Ids, ora , DataApp)
SELECT Appuntamenti_Confermati.APID, Servizi.IDS, Appuntamento.Ora,
Appuntamento.DataApp
FROM Appuntamenti_Confermati, Servizi INNER JOIN Appuntamento ON
Servizi.IDS = Appuntamento.IDS
WHERE (((Appuntamento.Gaid)=[gaid]));

facendo delle prove e togliendo gli indici e chiavi mi accorgo dell'errore, la s.query di cui sopra mi
inserisce anche tutti i record presenti nella tabella
conferma che rispettano la condizione, quindi anche quelli già presenti moltiplicandoli esponenzialmente.
....daiiii...
ciao grz
lob

Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5