Newsgroup: it.comp.lang.visual-basic
Titolo: Insert Into

"Insert into..." e "AddNew, Edit..."
Quale soluzione è piu vantaggiosa? E perchè?
Greg

 Quale soluzione è piu vantaggiosa? E perchè?
In linea di massima "INSERT INTO" poichè fai una query secca e in una riga
(+ o -) fai tutto
mentre con addnew devi aprire un recordset, fare addnew, assegnare tutti i
campi, updatare il recordset e chiuderlo.
Anche se a volte è + chiaro (IMO) un addnew...
Se devi trasferire dati da una tabella ad un altra con "INSERT
INTO...(SELECT FROM...)..." risparmi tanto, ma tanto tempo.
Da un cliente sono passato da un eleborazione di 45' ad una di 5'
sostituendo addnew con un bel insert.
Alex

sostituendo addnew con un bel insert.
Eh eh, giustissimo!
Con AddNew c'e' un bell'avanti e indietro di dati tra client e server,
mentre con la il comando sql secco il lavoro viene fatto tutto sul
server.
-- 
ciao, hal


Sottoscrivo, però c'è stato tempo fa chi ha fatto delle prove, mi pare su
Access, e il risultato è stato una netta velocità dell'addnew rispetto
all'insert.
Poi non ho eseguito prove personalmente, perchè onestamente credo nella mia
logica di lavoro, nei miei "standard" quindi anche se AddNew in alcuni casi
fosse più veloce io continuerei comunque, ove possibile, ad usare la Insert.
Secondo me il il caso in cui conviene AddNew vale solo per Access, già con
sqlserver da AddNew a Insert c'è una bella differenza.
Vuoi mettere il passare una stringa di comando *E basta*, con il traffico
generato da un AddNew?
Le uniche prove che in questo senso mi sono capitate sono state casualmente
su As400, andando attorno ad un programma già fatto da terzi.
Un'AddNew che bloccava per una quarantina di secondi, sostituito da
un'Insert si limitava a 2-4 secondi.

un'Insert si limitava a 2-4 secondi.
Non solo, anche il codice risulta molto piu' snello e flessibile e,
soprattutto, il comando che arriva al db e' proprio quello che vuoi tu
e non quello deciso da chi ha implementato il DAO/RDO/ADO/ecc.
-- 
ciao, hal

Grazie a tutti per gli interventi, ma forse ho esposto il dubbio in maniera
sintetica e poco chiara, ese nza specificare l'ambiente.
Spiego meglio qui:
Database access 97, prog sviluppato in vb5.
Inserimento dati da 2 postazioni, e interrogazioni da 8 pc.
La tabella principale è oltre 20.000 record e comincia ad avere i primi
segni di appesantimento.
L'indice, che mi fa contatore, nella tabella principale lo gestisco io,
invece di access.
La tabella principale contiene 17 campi.
La procedura di inserimento è questa:
a) controllo dati
b) se ok:
- apro il recordset, con tutto il carico di 20.000 record
BeginTrans
Rs.AddNew
    CampoId= Rs.RecordCount +1
    Campo2= Text1
    ....
Rs.Update
CoomitTrans
Rs.Close
Ecco, vorrei sapere se usando una Insert in questo caso velocizza,  anche
se... bisogna ricordarsi che no bisogna mai piu cambiare l'ordine dei campi
nella tabella.
La Insert penso, non legge tutto il recordset, ma si limita ad aprirlo e ad
accodare un record... certo per farla tutta dovrei lasciar gestire il
contatore ad access... altrimenti mi tocca comunque aprirlo per sapere il
numero dei record, poi fare la Insert. Non so, mi hanno sempre detto di
contare da me..
Grazie in anticipo per commenti e suggerimenti.
Greg

contare da me..
Non so se Access lo supporti:
INSERT INTO tabella
(CampoId, Campo2)
SELECT MAX(CampoId)+1, valore_di_text1
FROM tabella
-- 
ciao, hal

 FROM tabella
E' quello che ho fatto in maniera molto meno elegante e piu lenta!
Ho fatto la select max prima e messo il valore in una variabile, provvedo a
nidificarla, sempre che lo supporti, come dici tu.
Ciao
Greg

 client?
no, basta, come ha gia scritto Hal un cursore minimale possibilmente vuoto,
cioe' il risultato di una
SELECT ..... WHERE 1 = 0
saluti
Andrea Montanari
montanar...@virgilio.it
http://www.asql.biz/DbaMgr.shtm
DbaMgr2k ver 0.3.1  -  DbaMgr ver 0.49.1
(my vb6+sql-dmo little try to provide MS MSDE 1.0 and MSDE 2000 a visual
interface)
--------- remove DMO to reply

>un'Insert si limitava a 2-4 secondi.
C'e' da aggiungere il fatto che se si utilizza MySQL con MyOLEDB (da 
preferire nettamente a MyODBC) il metodo addnew non funziona correttamente.
Per cui l'istruzione SQL è ancora più consigliata.
Ciao,
        Negus



A parte il fatto che sono d'accordo con quanto scrivete tu e David, ti
faccio notare che non hai quotato correttamente, attribuendo a me le
parole di David.
Scherzi di un KNode ancora acerbo? ;-)
-- 
ciao, hal


 no, basta, come ha gia scritto Hal un cursore minimale possibilmente vuoto,
 cioe' il risultato di una
 SELECT ..... WHERE 1 = 0
==================
Scusa, non comprendo affatto cosa intendi.
Se io faccio Insert Into Tabbella (Campo1, Campo2) Values(100,200) dove
dovrei usare la select scritta da te?
Il punto è che non capisco cosa faccia e a cosa serva.... ti ringrazio se
vorrai illuminarmi di piu.
Greg

 vorrai illuminarmi di piu.
il discorso era relativo ad un cursore ado, dove apri un recordset vuoto son
una SELECT... WHERE 1=0, senza cosi' dover caricare il cursore con tutti i
record presenti nella tabella..
chiaramente coun l'utilizzo di comandi INSERT non serve...


 ciao, hal
================
Eh purtroppo per quante prove abbia fatto pare non funzioni,  e a cercare
sul NG non ho trovato messaggi di qualcuno che l'abbia mai usata. Peccato.
Greg

sul NG non ho trovato messaggi di qualcuno che l'abbia mai usata. Peccato.
Funziona, solo che andava verificata la sintassi. Questa l'ho eseguita
proprio adesso:
INSERT INTO tabellaTest ( CampoId, Campo2 )
SELECT Max([CampoID])+1 AS NuovoId, "nuovo" AS Campo2
FROM tabellaTest;
-- 
ciao, hal

FROM tabellaTest;
deve diventare cosi', in modo da poter essere usata anche con la
tabella vuota:
INSERT INTO tabellaTest ( CampoId, Campo2 )
SELECT IIf(IsNull(Max([CampoId])),1,Max([CampoId])+1) AS NuovoId,


 (studiare la documentaione di quello che si usa e' cosi' difficile?)
============
Non vorrei tediarti Hal, anzi solo ringraziarti perchè mi hai dato ottimi
suggerimenti qui e altrove.
Ma... a parte il fatto che a me il tuo esempio non funziona (ho riprodotto
tutto pari pari anche la tabellatest coi campi evidentemnte avrò sbagliato
qualcosa, ma non desisto provo ancora), ecco la documentazione l'ho letta e
parla di soli 2 modi di usare la INSERT INTO, o tutti i campi di una tabella
oppure dei valori uno per uno.
Mentre, io sto cercando di trovare una terza via non documentata che è un
misto delle 2 dette sopra:
primo campo fornito da select e il resto da textbox e variabili.
Grazie ancora
Greg

 qualcosa, ma non desisto provo ancora)
=========
E infatti a non desistere funziona
Grazie a te Hal :)
Greg

qualcosa, ma non desisto provo ancora),
A questo punto potrebbe essere un problema di versione di database, io
ho provato con Access XP inglese.
La tabella e' composta da un campo Long ed uno Text.
Comunque non disperare: considera che Access ha un sacco di
limitazioni e non ti permette sempre di fare con sql quello che riesci
a fare con altri database. Io lavoro con sql server e oracle  e ogni
volta che devo fare qualcosa con Access mi sento le mani legate :-(
Buon lavoro ;-)
-- 
ciao, hal