Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263

    [VB .NET] Impostare attesa fino a fine esecuzione Query

    Nello script VB NET che sto realizzando, ho bisogno di eseguire alcune Query di creazione Tabella e quindi queste nuove Tabelle vengono utilizzate da altre Query e così via.
    Accade in qualche caso che la complessità della tabella da creare necessiti di tempi lunghi, al punto che la procedura avanzi prima che la Query abbia terminato e così viene generato l’errore che dice che i dati che cerco non ci sono. Ovvio, non li ha ancora generati!
    Ho utilizzato le istruzioni
    codice:
                Thread.Sleep(500)
                Application.DoEvents())
    con tempi fino a 1 sec. e questo tempo è stato sufficiente sul mio PC ad attendere l'esecuzione della Query, (mentre la sola "Application.DoEvents()" non serve a niente) ma mi domando cosa accadrà quando farò eseguire la procedura su un PC più lento (caso normale qui da noi).
    Inoltre a forza di inserire tempi di attesa così lunghi ho rallentato tutta l'esecuzione.
    Qualcuno sa come fare in modo che lo svolgimento della procedura aspetti autonomamente che una Query abbia terminato l'esecuzione?

  2. #2
    Moderatore di Windows e software L'avatar di URANIO
    Registrato dal
    Dec 1999
    residenza
    Casalpusterlengo (LO)
    Messaggi
    1,254
    Non so come esegui la query, ma normalmente non esce fino a quando non ha finito l'esecuzione.
    Probabilmente nel tuo caso l'esecuzione va in timeout per esecuzione troppo lunga e nascondi l'eccezione.

    Quello che puoi fare è
    O aumentare il tempo di timeout (ma è sconsigliabile)
    O spezzare la query in parti più piccole.

  3. #3
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Quote Originariamente inviata da URANIO Visualizza il messaggio
    O spezzare la query in parti più piccole.
    Come ho detto, si tratta di Query di "Creazione Tabella" e non mi risulta che possano essere spezzate.
    Posso Creare Query vuote e poi accodare i dati, cosa che ho già provato a fare, ma il risultato non cambia perchè sono proprio i dati ad essere pesanti. Quanto al come eseguo le Query, di seguito un esempio:
    codice:
                Dim rcrdst As New ADODB.Recordset()
                Dim sSQL As String
                Dim OggiAIC As Long = DateSerial(Year(Now), Month(Now), Giorno)         
                Dim OggiAP As Long = DateSerial(Year(Now) - 1, Month(Now), Giorno)      
    
                sSQL = "SELECT Corrisp, Sum(Vendite.QMov) AS SommaDiQMov INTO VenditeAnnoStat_1 FROM Vendite GROUP BY Corrisp, Data, CarScar HAVING (((Data) Between #" & OggiAP & "# And #" & OggiAIC & "#) AND ((CarScar)='s')) ORDER BY Corrisp;"
                rcrdst.Open(sSQL, CnDBLocale, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
    La sola soluzione che io ho ipotizzato è di lavorare diversamente, cioè così:
    codice:
                Dim rsFornitori As New ADODB.Recordset()
                Dim rsPicam As New ADODB.Recordset()
                Dim sSQLPicam As String, sSQLAccess As String
    
                sSQLPicam = "SELECT Forcom.foc_cod_for, Forcom.foc_rag_soc_1, Forcom.foc_rag_soc_2, Forcom.foc_ind, Forcom.foc_cap, Forcom.foc_loc, Forcom.foc_pro, Forcom.foc_par_iva, Forcom.foc_cod_fis, Forcom.foc_naz, Forcom.foc_tel, Forcom.foc_fax, Forcom.foc_tlx, Forcom.foc_tip_pae, Forcom.foc_cod_val, Forcom.foc_tip_for, Forcom.foc_dat_cre, Forcom.foc_e_mail, Forcom.foc_web From Forcom WHERE (((Forcom.foc_tip_for)=20))"
                rsPicam.Open(sSQLPicam, CnPicam, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
    
                sSQLAccess = "DELETE Fornitori.* FROM Fornitori"
                rsFornitori.Open(sSQLAccess, CnDBServer, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
    
                sSQLAccess = "SELECT Fornitori.IDFor, Fornitori.RsF, Fornitori.Indirizzo, Fornitori.CAP, Fornitori.Citta, Fornitori.Prov, Fornitori.P_IVA, Fornitori.CodFis, Fornitori.Naz, Fornitori.Tel, Fornitori.Fax, Fornitori.Cell, Fornitori.I_E, Fornitori.Valuta, Fornitori.Tipologia, Fornitori.DtCre, Fornitori.Email, Fornitori.Web FROM Fornitori"
                rsFornitori.Open(sSQLAccess, CnDBServer, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
    
                rsPicam.MoveFirst()
    
                Do Until rsPicam.EOF
    
                    If Trim(rsPicam("foc_tip_for").Value) = 20 Then
    
                        'If Trim(rsPicam("foc_tip_for").Value) = 20 Or Trim(rsPicam("foc_tip_for").Value) = 21 Or Trim(rsPicam("foc_tip_for").Value) = 22 Then
                        rsFornitori.AddNew()
                        rsFornitori("IDFor").Value = Trim(rsPicam("foc_cod_for").Value)
                        rsFornitori("RsF").Value = Trim(rsPicam("foc_rag_soc_1").Value) '& " " & Trim(rsPicam("foc_rag_soc_2"))
                        rsFornitori("Indirizzo").Value = Trim(rsPicam("foc_ind").Value)
                        rsFornitori("CAP").Value = rsPicam("foc_cap").Value
                        rsFornitori("Citta").Value = Trim(rsPicam("foc_loc").Value)
                        rsFornitori("Prov").Value = rsPicam("foc_pro").Value
                        rsFornitori("P_IVA").Value = rsPicam("foc_par_iva").Value
                        rsFornitori("CodFis").Value = rsPicam("foc_cod_fis").Value
                        rsFornitori("Naz").Value = rsPicam("foc_naz").Value
                        rsFornitori("Tel").Value = rsPicam("foc_tel").Value
                        rsFornitori("Cell").Value = rsPicam("foc_tlx").Value
                        rsFornitori("Fax").Value = rsPicam("foc_fax").Value
                        rsFornitori("I_E").Value = rsPicam("foc_tip_pae").Value
    
                        If rsFornitori("I_E").Value = "E" Then
                            rsFornitori("Valuta").Value = rsPicam("foc_cod_val").Value
                        Else
                            rsFornitori("Valuta").Value = "EUR"
                        End If
    
                        rsFornitori("Tipologia").Value = rsPicam("foc_tip_for").Value
                        rsFornitori("DtCre").Value = rsPicam("foc_dat_cre").Value
                        rsFornitori("Email").Value = rsPicam("foc_e_mail").Value
                        rsFornitori("Web").Value = rsPicam("foc_web").Value
                        rsFornitori.Update()
                    End If
                    rsPicam.MoveNext()
                    Application.DoEvents()
                Loop
    
                rsFornitori.AddNew()
                rsFornitori("IDFor").Value = 9999
                rsFornitori("RsF").Value = "SISTEMAX"
                rsFornitori("I_E").Value = "I"
                rsFornitori("Valuta").Value = "EUR"
                rsFornitori("Tipologia").Value = 20
                rsFornitori.Update()
    
                If rsPicam.State <> ConnectionState.Closed Then
                    rsPicam.Close()
                    rsPicam.ActiveConnection = Nothing
                    Application.DoEvents()
                End If
    
                If rsFornitori.State <> ConnectionState.Closed Then
                    rsFornitori.Close()
                    rsFornitori.ActiveConnection = Nothing
                    Application.DoEvents()
                End If
    ma questo vuol dire, ammesso che in tuttii i casi si possa fare, scrivere qualche nMila stringhe in più, con la possibilità di fare mMila errori in più.
    Ecco perchè sto cercando una soluzione che direttamente mi faccia proseguire la routine SOLO quando la Query in esecuzione ha finito.

  4. #4
    quindi tu non solo crei la tabella, ma la popoli anche. Vedo che usi Access: medita di passare a SQL Server (grossomodo compatibile con SQL Server); in questo modo potresti eseguire una SP in tempi enormemente più rapidi

  5. #5
    potresti già risparmiare tempo usando una WHERE nella SELECT invece di usare

    IfTrim(rsPicam("foc_tip_for").Value)=20Then

  6. #6
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Quote Originariamente inviata da optime Visualizza il messaggio
    potresti già risparmiare tempo usando una WHERE nella SELECT invece di usare

    IfTrim(rsPicam("foc_tip_for").Value)=20Then
    Ma questa non è una Query.
    Io ho aperto due Query; da una di queste prelevo i valori che devo inserire nell'altra. È l'equivalente di una Query di aggiornamento fatta utilizzando VB .NET. E ovviamente questo script arriva fino in fondo prima di proseguire.
    Per quanto concerne SQL Server, sicuramente hai ragione, ma io sono tanto affezionato ad Access 2007 con il quale posso utilizzare anche vecchi Report (o farne di nuovi molto facilmente) senza faticare ad imparare altro SW e soprattutto posso stamparli direttamente in .pdf

  7. #7
    Quote Originariamente inviata da Rickycast Visualizza il messaggio
    Ma questa non è una Query.
    Io ho aperto due Query; da una di queste prelevo i valori che devo inserire nell'altra.
    ciao,
    provato anche
    insert into tabDest(...) select ... from tabSource
    senza usare i recordset con addnew ?

  8. #8
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    A parte che trovo strano che usi in VB.NET un ADODB (COM), invece di usare ADO.NET (NET)...

    Comunque, a parte questo perché, invece di usare un recordset, non usi il comando INSERT INTO per inserire in blocco tutti i record?

  9. #9
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Quote Originariamente inviata da gibra Visualizza il messaggio
    A parte che trovo strano che usi in VB.NET un ADODB (COM), invece di usare ADO.NET (NET)...

    Comunque, a parte questo perché, invece di usare un recordset, non usi il comando INSERT INTO per inserire in blocco tutti i record?
    Ti prego di scusarmi in anticipo per le mie probabili manchevolezze e castronerie.
    Uso un ADODB perchè qualcuno mi ha insegnato a fare così fin da quando usavo VB6 e poi ho trovato più comodo adattarmi, o meglio, non so da che parte cominciare. Quindi adesso, per fare un salto di qualità, avrei bisogno di qualche esempio concreto di utilizzo di Query con ADO.NET. Una volta capito il meccanismo andrò avanti con il sistema che mi indichi e che, non ho dubbi, è quello più corretto.
    Per quanto concerne il comando INSERT INTO, se non mi sbaglio è quello utilizzato nelle Query di ACCODAMENTO. Ovviamente l'ho anche utilizzato ma solo se avevo già la tabella creata. Una strada potrebbe essere infatti quella di creare TUTTE, ma proprio TUTTE le Tabelle che mi servono e poi svuotarle e riempirle; ci ho anche pensato ma ho talmente tante Tabelle già così che alla fine rischio di fare confusione. Così le creo e le elimino ogni volta.
    Comunque, anche nel caso di Accodamento di dati ho visto che i tempi, con il mio sistema (ADODB), sono quasi gli stessi che occorrono per creare e popolare la tabella; anche in questi casi ho dovuto aggiungere qualche "Sleep".

  10. #10
    elimini la tabella e poi la ricrei riempiendola

    quindi DROP TABLE e poi SELECT INTO. due comandi due

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.