+ Rispondi al Thread
Pagina 1 di 3 123 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23

Discussione: [MSSQL] Incongruenza tra PK e proprietà UNIQUE

  1. #1
    Sgrubak ora è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    265

    [MSSQL] Incongruenza tra PK e proprietà UNIQUE

    Buonasera,
    chiedo un suggerimento per una cosa che non riesco a comprendere.

    Il seguente stralcio, è quanto prodotto da Sql Server Management Studio (versione 17.3) riguardo alla creazione di una tabella che ho progettato per il mio DB:
    codice:
    --Precedono i DROP dei vincoli e della tabella stessa
    
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[Programma](
    	[Id_Prog] [int] IDENTITY(1,1) NOT NULL,
    	[Codice] [varchar](20) NULL,
    	[Qta] [int] NULL,
    	[Macchina] [varchar](20) NULL,
    	[InizioProd] [datetime] NULL,
    	[FineProd] [datetime] NULL,
    	[InizioAttrezzaggio] [datetime] NULL,
    	[FineAttrezzaggio] [datetime] NULL,
    	[DataInserimento] [smalldatetime] NULL,
    	[Riga] [int] NOT NULL,
    	[InLavorazione] [bit] NOT NULL,
    	[Note] [varchar](max) NULL,
    	[QtaMateriale] [numeric](8, 2) NULL,
    	[ProduzioneCompletata] [bit] NOT NULL,
    	[GiorniResidui] [tinyint] NULL,
    	[OreResidue] [tinyint] NULL,
    	[TipoMateriale] [varchar](8) NULL,
    	[QtaResidua] [int] NULL,
    PRIMARY KEY CLUSTERED 
    (
    	[Id_Prog] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    
    --Segue il ripristino dei vincoli
    Detto DB lo utilizzo mediante un'applicazione che sto sviluppando in C#. La colonna della tabella del DataSet fortemente tipizzato (inserito nel progetto tramite wizard di Visual Studio) riporta le proprietà:
    codice:
    AutoIncrement = True
    AutoIncrementSeed = -1
    AutoIncrementStep = -1
    Per l'inserimento di righe nella tabella utilizzo il comando
    codice:
    ProgrammaRow riga = ProgDataSet.Programma.NewProgrammaRow();
    riga.BeginEdit();
    //Edito tutti i campi che mi interessano
    riga.EndEdit();
    ProgDataSet.Programma.Rows.Add(riga);
    TableAdapterManager.UpdateAll(ProgDataSet);
    In fase di debug mi trovo correttamente [Id_Prog] della nuova riga impostato a -1 e incrementa di -1 ad ogni chiamata per [NewProgrammaRow()]

    Nel momento in cui vado ad eseguire una Select sulla tabella mi ritrovo valori "stravaganti" per la colonna Id_Prog:
    codice:
    Id_Prog    DataInserimento
    39001      25/02/2019  --Questo è il primo record in assoluto
    39002      25/02/2019
    ...
    40001      26/02/2019
    41001      27/02/2019
    41002      27/02/2019
    ...
    Io mi sarei aspettato un progressivo da 1 a n indipendentemente dalla data...

    Cosa ho sbagliato/tralasciato?

    Grazie in anticipo

  2. #2
    L'avatar di nman
    nman non è in linea Scribacchino
    Luogo
    Milano
    Post
    1,652
    Non ho capito tutto nel dettaglio ......
    Ma se tu hai un campo ID_Prog che imposti in SQLServer ad autioncrementale (1-1)
    perchè poi lo vuoi forzare dalla applicazione di Visual Studio ???
    Se non lo devi leggere per qualche motivo quel campo deve essere assolutamente "sconosciuto" per la applicazione

    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    codice:
    AutoIncrement = True
    AutoIncrementSeed = -1
    AutoIncrementStep = -1
    Mi sembra che il tuo autinncremento nella applicazione è meno 1

    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    codice:
    Id_Prog    DataInserimento
    39001      25/02/2019  --Questo è il primo record in assoluto
    39002      25/02/2019
    ...
    40001      26/02/2019
    41001      27/02/2019
    41002      27/02/2019
    ...
    Da qui invece mi sembra che ad ogni nuovo giorno di calendario incrementi di un migliaio ......
    questo lo puo fare solamente la applicazione

    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    Io mi sarei aspettato un progressivo da 1 a n indipendentemente dalla data...
    Elimina nella applicazione tutti i riferimenti a quel campo e vedrai che SQLServer fara quello che desideri

    .
    Ultima modifica di nman; 18-04-2019 18:56 

  3. #3
    L'avatar di gibra
    gibra non è in linea Amanuense
    Luogo
    Breganze (VI)
    Post
    6,060

  4. #4
    Sgrubak ora è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    265
    Quote Originariamente inviato da nman Visualizza il messaggio
    ...perchè poi lo vuoi forzare dalla applicazione di Visual Studio ???
    Se non lo devi leggere per qualche motivo quel campo deve essere assolutamente "sconosciuto" per la applicazione


    Mi sembra che il tuo autinncremento nella applicazione è meno 1


    Da qui invece mi sembra che ad ogni nuovo giorno di calendario incrementi di un migliaio ......
    questo lo puo fare solamente la applicazione
    Ciao nman e grazie per la risposta!
    Il campo è in sola lettura. Riprendo il dato solo per riempire delle FK in altre tabelle, ma dopo che è stato inserito nella tabella. Il valore -1 non l'ho messo io, ma è stato il wizard ad impostarlo così. Anche se provo ad inserire manualmente un record mi incrementa di 1000 e riparte dalla prima unità. Ad esempio l'ultima riga inserita ieri è stata valorizzata a 50001, oggi la riga inserita a mano da Sql Server Management Studio ha valore 51001. Mi sento quindi di escludere che sia un problema di codice C#.

    Riguardo al suggerimento di Gibra, se ho ben inteso mi suggerisci di lasciar perdere il DataSet creato da VS e scriverne uno mio? Ho paura di questa cosa...

  5. #5
    L'avatar di gibra
    gibra non è in linea Amanuense
    Luogo
    Breganze (VI)
    Post
    6,060
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    Riguardo al suggerimento di Gibra, se ho ben inteso mi suggerisci di lasciar perdere il DataSet creato da VS e scriverne uno mio? Ho paura di questa cosa...
    E' dei Wizard che devi avere paura e starne lontano.
    Sono una emerita ciofeca (la solita) di Microsoft per far credere che è facile sviluppare applicazioni database.

    Con il risultato che poi, quando il tuo 'grado' di programmatore si alzerà leggermente e vorrai iniziare ad apportare modifiche per soddisfare esigenze 'leggermente' maggiori e/o diverse ti accorgerai che sei stato buttato nell'abisso, nell'incubo perché mettere mano al codice generato dai wizard è come entrare in un labirinto senza uscita.

    Singifica che: o ti tieni così quello che hai, o dovrai rifare tutto da capo.

    Ci sono diversi modi per gestire i dati, con e senza i dataset!

  6. #6
    Sgrubak ora è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    265
    Quote Originariamente inviato da gibra Visualizza il messaggio
    Ci sono diversi modi per gestire i dati, con e senza i dataset!
    A questo punto, credo che aprirò un thread dedicato, per chiedere lumi sul migliore approccio per gestire le mie esigenze. Ahimè sono laureato alla "Youtube University" e mi accorgo sempre dopo che il mio approccio iniziale è sempre limitato da qualche parte (ci sono già capitato purtroppo). Rincominciare l'ennesima volta non dovrebbe essere un gran problema. Per fortuna ho tenuto ben distinti l'elaborazione dei dati dal collegamento al DB. Mi basterà modificare solo la seconda parte che attualmente dipende dal wizard. :-)

    Vedrò però se almeno mi sarà possibile qui appagare la curiosità sullo strano incremento dell'indice.

  7. #7
    L'avatar di nman
    nman non è in linea Scribacchino
    Luogo
    Milano
    Post
    1,652
    Concordo pienamente con Gibra sui Widzart, ...... buttali via ......

    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    ........ Vedrò però se almeno mi sarà possibile qui appagare la curiosità sullo strano incremento dell'indice.
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    ........ Ad esempio l'ultima riga inserita ieri è stata valorizzata a 50001, oggi la riga inserita a mano da Sql Server Management Studio ha valore 51001. Mi sento quindi di escludere che sia un problema di codice C#........
    Potrebbero essere entrambi

    In SQLServer delle Stored oppure dei Trigger in autonomia potrebbero inserirt/modificarti quel valore

    In Visual Studio invece potresti andare a modificare il "numeratore" dei record che predispone il nuovo ID (in questo momento non ricordo come si fa, ma ricordo che è possibile farlo)

    se vuoi escludere totalmente VisualStudio allora devi testarlo su un BackUp del DB totalmente disconnesso dalla applicazione

    .
    Ultima modifica di nman; 19-04-2019 12:14 

  8. #8
    Sgrubak ora è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    265
    Quote Originariamente inviato da nman Visualizza il messaggio
    In SQLServer delle Stored oppure dei Trigger in autonomia potrebbero inserirt/modificarti quel valore
    Non ho ne trigger ne SP. Solo il vincolo Unique(1,1) sulla colonna PK
    Quote Originariamente inviato da nman Visualizza il messaggio
    In Visual Studio invece potresti andare a modificare il "numeratore" dei record che predispone il nuovo ID
    Dovrebbero esse per l'appunto le proprietà della DataColumn di cui parlavamo prima: AutoIncrement, AutoIncrementStep, AutoIncrementSeed.
    Farò qualche tentativo pasticciando con quei valori
    Quote Originariamente inviato da nman Visualizza il messaggio
    se vuoi escludere totalmente VisualStudio allora devi testarlo su un BackUp del DB totalmente disconnesso dalla applicazione
    Perdonami se la domanda ti sembra stupida ma cosa intendi per disconnesso? Il mio DB è al momento sul PC su cui sto lavorando, ma l'ho creato e lo edito con Sql Server Management Studio, non con VS.

  9. #9
    L'avatar di nman
    nman non è in linea Scribacchino
    Luogo
    Milano
    Post
    1,652
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    ....... Perdonami se la domanda ti sembra stupida ma cosa intendi per disconnesso? Il mio DB è al momento sul PC su cui sto lavorando, ma l'ho creato e lo edito con Sql Server Management Studio, non con VS.
    Mhhhh!!!!!!
    direi che è impossibile che solo SQLServer senza Stored, trigger a qualche altra diavoleria ti faccia un incremento di 1000 unita al giorno sulla PK (come lo hai descritto sopra)
    Pero la cosa mi incuriosisce .......
    se puoi mandaci un .bak privo di dati sensibili in modo che lo si possa guardare bene

    certamente da qualche parte c'è qualcosa che genera quel comportamento

    .

  10. #10
    Sgrubak ora è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    265
    Quote Originariamente inviato da nman Visualizza il messaggio
    direi che è impossibile che solo SQLServer senza Stored, trigger a qualche altra diavoleria ti faccia un incremento di 1000 unita al giorno sulla PK (come lo hai descritto sopra)
    Per questo motivo ho scritto. Sicuramente ho "inciuccato" qualcosa da qualche parte.

    Qui il link per il file di backup completo.

+ Rispondi al Thread
Pagina 1 di 3 123 ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi