Query generata da wizard

di il
16 risposte

Query generata da wizard

Un augurio a tutti voi, prima d'ogni cosa.

Ho bisogno del vostro aiuto ancora una volta (e non sarà di certo l'ultima!) : io, seguendo i consigli ricorrenti del forum, ho sempre scritto il codice, rifuggendo dai wizard, sia per imparare ,sia perchè essi non consentono sempre di fare ciò che necessita.
Ora, voglio capirci di più ed ho deciso -tra le prime cose fatte -di generare le query per l'inserimento,la modifica e la cancellazione dei dati.
Ecco, la query ottenuta per modificare una banalissima tabella db.:

UPDATE `studenti` SET `NOME` = ?, `INDIRIZZO` = ?, `CAP` = ?, `PROV` = ?, `COMUNE` = ? WHERE 
((? = 1 AND `RAGSOC1` IS NULL) OR (`RAGSOC1` = ?))  AND 
((? = 1 AND `INDIRIZZO` IS NULL) OR (`INDIRIZZO` = ?)) AND
((? = 1 AND `CAP` IS NULL) OR (`CAP` = ?)) AND 
((? = 1 AND `PROV` IS NULL) OR (`PROV` = ?)) AND 
((? = 1 AND `COMUNE` IS NULL) OR (`COMUNE` = ?)) AND 
(`ID` = ?))

Passandogli i soli parametri "base" (Nome,indirizzo,cap,prov e comune) la query non funziona.
Gli errori sono tutti del tipo : non è stato specificato il parametro Original NOME1,Original INDIRIZZO1,ecc. 
Che sono questi parametri Original? dove li prendo? perchè sono duplicati? Vuole forse avere il valore del campo prima della eventuale modifica per effettuare un raffronto tra dati?

Forse chiedo troppo.
Spero comunque che qualcuno di voi possa darmi qualche spunto per "capire" e per proseguire sulla strada dei wizards.

Grazie.

16 Risposte

  • Re: Query generata da wizard

    La questione non è proprio pertinente con VB.NET, tuttavia devi tenere presente che i segnaposto espressi con il punto interrogativo devono corrispondere ai parametri passati alla query sia nel numero, sia nella posizione, quindi dalla seconda linea in poi i vari “?” non hanno un corrispondente parametro in entrata.

  • Re: Query generata da wizard

    27/12/2023 - grumpy ha scritto:


    quindi dalla seconda linea in poi i vari “?” non hanno un corrispondente parametro in entrata.

    Grazie mille,grumpy. Di certo non ho capito quello che mi vuoi dire.

    Se non hanno un corrispondente parametro in entrata perchè gli errori che ricevo sono del tipo ”non è stato specificato il parametro Original NOME1,Original INDIRIZZO1,ecc. ".

  • Re: Query generata da wizard

    Intanto di che database si parla? Access?

    Allora mettiamola così: i “?” nella query devono esser in numero uguale ai parametri che gli passi e devono essere nello stesso ordine.

    Mostra il codice con la chiamata della query e spiega anche che cosa vorresti ottenere dalla sua esecuzione.

  • Re: Query generata da wizard

    Grumpy, grazie ancora per il tuo intervento.

    Il database è Access, ma il wizard è stato generato dal Vs 2019.

    Questo è il codice con gli errori conseguenziali :

        Private Sub SaveItem_Click(sender As Object, e As EventArgs) Handles SaveItem.Click
          If newrec = True Then
              newrec = False
              StudentiTableAdapter1.InsertQuery(NomeTextBox.Text, INDIRIZZOTextBox.Text, CAPTextBox.Text, PROVTextBox.Text, COMUNETextBox.Text)
          Else
              StudentiTableAdapter1.UpdateQuery(NomeTextBox.Text, INDIRIZZOTextBox.Text, CAPTextBox.Text, PROVTextBox.Text, COMUNETextBox.Text, Val(IDTextBox.Text))
          End If
      End Sub
  • Re: Query generata da wizard

    Cominciamo dalla query: le righe dalla seconda alla sesta non hanno senso, quindi eliminale. Elimina anche gli apici e le parentesi inutili:

    UPDATE studenti SET NOME = ?, INDIRIZZO = ?, CAP = ?, PROV = ?, COMUNE = ? WHERE ID = ?

    Come segnaposto dei parametri usa dei nomi mnemonicamente validi anziché i punti interrogativi (di solito si prefissano con @)

    UPDATE studenti SET NOME = @Nome, INDIRIZZO = @Indirizzo, CAP = @Cap, PROV = @Provincia, COMUNE = @Comune? WHERE ID = @Id

    Ora documentati su come impostare il valore dei parametri alla query. Ricorda: i valori vengono sostituiti ai segnaposto in base all'ordine, non al nome e, ripeto, devono essere in numero uguale.

    P.S.: Potresti anche fare a meno di usare l'oggetto TableAdapter; un oggetto Command è più semplice e intuitivo.

  • Re: Query generata da wizard

    Il mio problema ,Grumpy (come nel mio post introduttivo) , non è quello di scrivere una query correttamente , ma di dare una spiegazione , un senso al codice che viene prodotto dai wizard, perchè sono sicuro che quel codice è utilizzabile. Vorrei capire come.

    Grazie mille per il tuo interessamento.

  • Re: Query generata da wizard

    Non ho idea di cosa tu abbia richiesto al wizard, io aborro questi pseudo-automatismi. Di certo quella query non va bene. Così a occhio potrebbe cercare di essere una SELECT che si preoccupa (sbagliando) di includere anche record con valori NULL.

    La strada dei wizard, anche solo per vedere cosa fanno, è una perdita di tempo e anti-istruttiva. Molto meglio un testo su cui imparare l'SQL senza ambiguità.

  • Re: Query generata da wizard

    salve,
    IntelliSense dovrebbe aiutarti a comprendere COSA siano quei parametri...
    leggendo Function GestioneUfficiDatasetTableAdapters.studentiTableAdapter.UpdateQuery (.....
    te li elenca tutti...anche troppi...
    ti indica di fornire NOME as string, INDIRIZZO AS string, etc... e questo sarebbe il valore corrente dell'aggiornamento...
    i parametri Original_NOME as string, Original_INDIRIZZO AS string, etc sono i valori originali prima dell'aggiornamento, cioe' quelli che tu hai letto dal db al momento del caricamento..

    personalmente anche io rimuoverei il tutto ed userei un Command valorizzando i Parameters che effettivamente mi servono..
    il filtro

    WHERE 
    ((? = 1 AND `RAGSOC1` IS NULL) OR (`RAGSOC1` = ?))  AND 
    ((? = 1 AND `INDIRIZZO` IS NULL) OR (`INDIRIZZO` = ?)) AND
    ((? = 1 AND `CAP` IS NULL) OR (`CAP` = ?)) AND 
    ((? = 1 AND `PROV` IS NULL) OR (`PROV` = ?)) AND 
    ((? = 1 AND `COMUNE` IS NULL) OR (`COMUNE` = ?)) AND 
    (`ID` = ?))

    a mio parere e' anche non corretto... la parte valida e'
    WHERE (`ID` = ?))
    dove va appunto fornita la chiave primaria della tabella, che a quanto pare correttamente si chiama ID

    sinceramente non capisco bene
    ((? = 1 AND `RAGSOC1` IS NULL) OR (`RAGSOC1` = ?))  AND 
    che una volta sviluppati diventano
    ((paramRagSocOriginaleSTRINGA = 1 AND `RAGSOC1` IS NULL) OR (`RAGSOC1` = paramRagSocOriginaleSTRINGA))  AND ...
    quindi
    (('Azienda pippo srl' = 1 AND `RAGSOC1` IS NULL) OR (`RAGSOC1` = 'Azienda pippo srl'))  AND 
    oppure
    ((NULL = 1 AND `RAGSOC1` IS NULL) OR (`RAGSOC1` = NULL))  AND 

    non capisco…
    a meno che ? = 1 AND ... sia un'altra cosa che non vedo... dovrebbe essere un valore numerico, in ogni caso...
    e sempre in ogni caso, il filtro di questo tipo mi sembra inutile, se non nel caso di un aggiornamento completamente pessimistico dove NON SOLO la chiave primaria deve avere un riscontro, ma TUTTE le colonne della tabella debbano ancora essere esattamente uguali al valore originario per evitare che nel frattempo altri utenti abbiano modificato la riga dietro le spalle...

    al di la' di cio', segui le indicazioni di @grumpy ed usa un Command "normale" :D

    salutoni romagnoli,
    -- 
    Andrea

  • Re: Query generata da wizard

    Asql, grazie per il tuo intervento e scusa il ritardo con cui ti rispondo.

    Premetto (è doveroso precisarlo per evitare fraintendimenti) che sono in grado di scrivere delle query , sopratutto quelle basiche, come insert, delete e update (e per queste non ricorro certamente ai wizard!).

    Io sto cercando SOLO di “capire” la query generata da visual studio, che non può non avere una logica e non può non essere operativa. 

    Condivido -al tempo stesso- le tue pesanti perplessità!

    Salutoni laziali. 

  • Re: Query generata da wizard

    Salve a tutti….

    cercato, e “trovato”…

    utilizzando NorthWind.dbo,Customers su SQL Server, i parametri vengono ovviamente generati come named parameters e non con il “?”

    il Update command text e' popolato di parametri, addirittura 31

    quindi, il testo contiene

    ...
    AND ((@IsNull_ContactName = 1 AND [ContactName] IS NULL) OR ([ContactName] = @Original_ContactName))
    ...
    

    e @IsNull_ContactName e' il 14^ parametro (13^ in base 0)

    F12 sul metodo Update fa il suo lavoro, e cercando il corretto overload, viene fuori

    e cosi' mi torna tutto meglio, anche SE personalmente non concordo con questo comando di concorrenza cosi' pessimistica… in caso, su SQL Server, avrei aggiunto una colonna RowVersion, ma tant'e' :D

    sintatticamente, comunque, “e' giusto” :D
    “MS aveva ragione”…. (solo sintatticamente :D )

    salutoni romagnoli
    – 
    Andrea

  • Re: Query generata da wizard

    Andrea, che dirti? Sei stato grande!

    Ora ,userò Sql server per il mio piccolo archivio studenti e sono certo che (con minor dati) anche a me tutto sembrerà più comprensibile.

    Subito dopo queste festività ritornerò sull'argomento.

    Grazie,Andrea (alias asql).

    Ti auguro una buona fine d'anno ed un sereno e salutare 2024.

    Gianfranco

  • Re: Query generata da wizard

    Ho fatto alcuni esercizi per capire di più . Conclusioni :ho capito di meno! 

    a) le query generale da una tabella Sql Server funzionano
    b) la stessa query generata avendo come sorgente un file Access non funziona
    c) le query non vengono generate sempre: molto spesso si limitano a scrivere "Delete" ,"Update" (mentre per Insert il wizard genera una normale query,come se scritta manualmente)
    d) le query non vengono scritte quando il wizard non riconosce valido il nome della tabella (se provi infatti a forzare la scheramta vuota usando il generatore di query ti restituisce il seguente errore : Errore nel nome della tabella o della visualizzazione nella clausola UPDATE.
    Impossibile analizzare il testo della query;

    Io ho provato con una tabella minimale :

    UPDATE [dbo].[REGIONI] SET [REGIONE] = @REGIONE 
    WHERE
    (([CR] = @Original_CR) AND ([REGIONE] = @Original_REGIONE));
    SELECT CR, REGIONE FROM REGIONI WHERE (CR = @CR)

    Sono troppo vecchio o -meglio- informaticamente troppo ignorante per capire il senso della prima parte della query : non capisco  la Where,assolutamente. Eppur l'update e l'insert FUNZIONANO!!!

  • Re: Query generata da wizard

    WHERE
    (([CR] = @Original_CR) AND ([REGIONE] = @Original_REGIONE));

    Sono troppo vecchio o -meglio- informaticamente troppo ignorante per capire il senso della prima parte della query : non capisco  la Where,assolutamente. Eppur l'update e l'insert FUNZIONANO!!!

    salve, non parlare di eta' che qui siamo in parecchi che hanno visto “Pippi Calzelunghe” :D

    non ho compreso “cosa non capisci” della clausola where sull'update…
    non so in questo caso quale sia la chiave primaria (che concettualmente e' l'unica effettivamente necessaria), ma in questo caso, per aggiornare [Regione] da “Emilia Romagna” a “Veneto”, il filtro ti richiede anche il valore originale di CR (codice Regione??)
    quindi:

    @Original_CR = ‘ER’
    @Original_REGIONE = ‘Emilia Romagna’
    @REGIONE = ‘Veneto’

    UPDATE [dbo].[REGIONI] SET [REGIONE] = 'Veneto"
    WHERE
       (([CR] = 'ER') AND ([REGIONE] = 'Emilia Romagna'));

    che in questo senso sarebbe concettualmente sbagliato in quanto [CR] dovrebbe diventare ‘VE’, ma questo e' un altro discorso…

    ho compreso correttamente la tua richiesta?


    salutoni romagnoli
    – 
    Andrea

  • Re: Query generata da wizard

    Salve,Andrea.

    Mi hai spiegato in termini “chiarissimi” la where , che ora mi sembra concettualmente più accettabile, ma resta incomprensibile il motivo per il quale necessita del valore originale della regione, giacchè sarebbe (è) sufficiente la chiave (CR) per modificare i valori dei set indicati.

    Grazie mille,Andrea.

    PS: quando parlo di “vecchiaia”, lo faccio con cognizione di… età.Ho 77 anni. Pippi Calzelunghe la conosco solo per sentito dire! 

Devi accedere o registrarti per scrivere nel forum
16 risposte