- Home
- Categorie
- Coding e Sistemistica
- Altri linguaggi per il web
- Problema inserimento record doppi
-
Problema inserimento record doppi
Ciao a tutti.
Avrei messo a punto una semplice procedura asp con la quale si fa l'upload di un file csv in un server e si registrano i dati in esso contenuti in una tabella di un database mysql.
Per evitare di caricare record doppi o non conformi alle condizioni previste nella procedura, ho messo un controllo sui record già esistenti nella tabella prima dell'inserimento nel db.
Mi sono accorto però che quando riprovo ad inserire lo stesso file csv i dati che prima erano stati esclusi mi vengono aggiunti.
Ad esempio nel file csv ho le seguenti righe:
riga 1 = PIPPO, 25/07/2008, 11:50, XXXZZZ, UTENTE
riga 2 = PIPPO, 26/07/2008, 01:50, XXXZZZ, UTENTE
riga 3 = CAIO, 25/07/2008, 17:50, XXXYYY, NEWBIE
riga 4 = TIZIO, 26/07/2008, 10:05, YYYZZZ, ADMINLa prima volta che carico il file csv nel db mi ritrovo con le righe 1-3 e 4.
La seconda volta che carico lo stesso file csv mi ritrovo nel db anche la riga 2 che il primo inserimento aveva escluso perchè riga simile alla riga 1.
Questo è il codice ASP:
PercorsoCSV = "D:\Inetpub\wwwroot\CSV\file1.csv " Set objFSO = Server.CreateObject("Scripting.FileSystemObject") strURL = percorsoCSV Set objFile = objFSO.OpenTextFile(strURL) objFile.SkipLine() strVariabile = "" Do While Not objFile.AtEndOfStream strText = objFile.readLine arrText = split(strText, ",", 17) 'CONTROLLO NEL DB L'ESISTENZA DELLA RIGA UGUALE SQL = " SELECT * " SQL = SQL & " FROM " SQL = SQL & " tabellaCSV " SQL = SQL & " WHERE " SQL = SQL & " NOME = '" & replace(arrText(0), """", "") & "' " SQL = SQL & " AND " SQL = SQL & " DATA = " & formatDBDate(replace(arrText(2), """", ""), "mysql") & " " SQL = SQL & " AND " SQL = SQL & " ORA = '" & replace(arrText(3), """", "") & "' " SQL = SQL & " AND " SQL = SQL & " CODICE_PERSONALE = '" & replace(arrText(7), """", "") & "' " SQL = SQL & " AND " SQL = SQL & " DESCRIZIONE = '" & replace(arrText(8), """", "") & "' " Set objRS = Server.CreateObject("ADODB.Recordset") objRS.open SQL, cn 'APERTURA PRIMO IF E CONTROLLO SU objRS if objRS.eof then 'QUI CONTROLLO LE RIGHE SIMILI ED INSERISCO NEL DB MYSQL if objRS("CODICE_PERSONALE") <> strVariabile then strSql = "INSERT INTO tabellaCSV ... " cn.execute(strSql) strVariabile = objRS("CODICE_PERSONALE") end if 'ALTRIMENTI SU PRIMO IF else response.write "record già presente!<br>" 'CHIUSURA PRIMO IF end if Loop objRS.Close() Set objRS = Nothing cn.Close() Set cn = nothing Set fsoMyFile = CreateObject("Scripting.FileSystemObject") if fsoMyFile.FileExists (PercorsoCSV) then fsoMyFile.DeleteFile PercorsoCSV end if Set fsoMyFile = Nothing Set objFSO = Nothing
Sapete darmi qualche buon consiglio per ovviare al problema?
Grazie
-
Scusami, ma le righe devono essere uguali o simili? Perchè tu escludi le righe identiche, perchè usi tutti AND nella query. in teoria dovrebbe inserire la riga anche la prima volta, a meno che la stessa riga sia già dentro. Altrimenti, il codice fa bene a inserire tutte e 4 le righe perchè hanno data diversa.
-
@cali1981 said:
Scusami, ma le righe devono essere uguali o simili? Perchè tu escludi le righe identiche, perchè usi tutti AND nella query. in teoria dovrebbe inserire la riga anche la prima volta, a meno che la stessa riga sia già dentro. Altrimenti, il codice fa bene a inserire tutte e 4 le righe perchè hanno data diversa.
Grazie.
Il criterio di esclusione è che la riga attuale letta dal file csv sia simile a quella precedente: se è così va esclusa dalla query di inserimento dati.
Infatti alla prima lettura del file csv:
-
il primo IF controlla che non ci siano record-righe uguali già registrate nel db mysql;
-
il secondo IF mette a confronto i due CODICI PERSONALI, quello letto e quello della riga precedente del file csv e se sono diversi li registra nel db:
'QUI CONTROLLO LE RIGHE SIMILI ED INSERISCO NEL DB MYSQL if objRS("CODICE_PERSONALE") <> strVariabile then strSql = "INSERT INTO tabellaCSV ... " cn.execute(strSql) strVariabile = objRS("CODICE_PERSONALE") end if
Il problema è nel primo IF perchè in un' eventuale seconda lettura dello stesso file csv, non trova la riga esclusa in prima lettura e la inserisce nel db.
Mi segui?
-
-
Ok, allora il problema è che strVariabile = objRS("CODICE_PERSONALE")
lo fa solo se la riga non è presente nel db, quindi lui la prima volta inseirsce la riga 1, strvariabile diventa uguale a quel codice e la seconda non la inserisce. La seconda volta invece strvaribile non lo valorizza perchè non entra nell'if. Giusto?
-
@cali1981 said:
Ok, allora il problema è che strVariabile = objRS("CODICE_PERSONALE")
lo fa solo se la riga non è presente nel db, quindi lui la prima volta inseirsce la riga 1, strvariabile diventa uguale a quel codice e la seconda non la inserisce. La seconda volta invece strvaribile non lo valorizza perchè non entra nell'if. Giusto?Giustissimo.
-
@cali1981 said:
Ok, allora il problema è che strVariabile = objRS("CODICE_PERSONALE")
lo fa solo se la riga non è presente nel db, quindi lui la prima volta inseirsce la riga 1, strvariabile diventa uguale a quel codice e la seconda non la inserisce. La seconda volta invece strvaribile non lo valorizza perchè non entra nell'if. Giusto?Scusa non ho capito se mi hai dato la soluzione al problema o hai chiesto semplicemente conferma del tuo ragionamento al riguardo...
-
Beh questa è una cosa che non va bene, quindi devi trovare un altro modo per farlo. Ad esempio, strvariabile = arrText(7)
-
@cali1981 said:
Beh questa è una cosa che non va bene, quindi devi trovare un altro modo per farlo. Ad esempio, strvariabile = arrText(7)
Scusa non ho capito.
-
Invece di fare:
strVariabile = objRS("CODICE_PERSONALE")
lo toglie e metti
strvariabile = arrText(7)
prima della riga con il commento:
'CONTROLLO NEL DB L'ESISTENZA DELLA RIGA UGUALE
-
@cali1981 said:
Invece di fare:
strVariabile = objRS("CODICE_PERSONALE")
lo toglie e metti
strvariabile = arrText(7)
prima della riga con il commento:
'CONTROLLO NEL DB L'ESISTENZA DELLA RIGA UGUALEHo provato ma con questa modifica non inserisce più nulla nel db mysql.
Fatico a seguirti, sorry.
-
No il resto è tutto uguale. In pratica, nel tuo script tu fai la query per vedere se il record c'è già, se non c'è lo inserisci e poi salvi il codice per controllarlo rispetto al successivo. Il problema è che se il record c'è già tu nn ti salvi il codice e perciò al secondo inserimento il record 2 lo inserisce! Invece facendo come ti ho detto io tu il codice lo salvi prima in ogni caso, quindi stavolta il record 2 non lo inserirà.
-
Ho provato ma con questa modifica non inserisce più nulla nel db mysql.
-
Scrivi qui il nuovo codice
-
Questo è il nuovo codice ASP:
PercorsoCSV = "D:\Inetpub\wwwroot\CSV\file1.csv " Set objFSO = Server.CreateObject("Scripting.FileSystemObject") strURL = percorsoCSV Set objFile = objFSO.OpenTextFile(strURL) objFile.SkipLine() strVariabile = "" Do While Not objFile.AtEndOfStream strText = objFile.readLine arrText = split(strText, ",", 17) strVariabile = arrText(7) 'CONTROLLO NEL DB L'ESISTENZA DELLA RIGA UGUALE SQL = " SELECT * " SQL = SQL & " FROM " SQL = SQL & " tabellaCSV " SQL = SQL & " WHERE " SQL = SQL & " NOME = '" & replace(arrText(0), """", "") & "' " SQL = SQL & " AND " SQL = SQL & " DATA = " & formatDBDate(replace(arrText(2), """", ""), "mysql") & " " SQL = SQL & " AND " SQL = SQL & " ORA = '" & replace(arrText(3), """", "") & "' " SQL = SQL & " AND " SQL = SQL & " CODICE_PERSONALE = '" & replace(arrText(7), """", "") & "' " SQL = SQL & " AND " SQL = SQL & " DESCRIZIONE = '" & replace(arrText(8), """", "") & "' " Set objRS = Server.CreateObject("ADODB.Recordset") objRS.open SQL, cn 'APERTURA PRIMO IF E CONTROLLO SU objRS if objRS.eof then 'QUI CONTROLLO LE RIGHE SIMILI ED INSERISCO NEL DB MYSQL if objRS("CODICE_PERSONALE") <> strVariabile then strSql = "INSERT INTO tabellaCSV ... " cn.execute(strSql) end if 'ALTRIMENTI SU PRIMO IF else response.write "record già presente!<br>" 'CHIUSURA PRIMO IF end if Loop objRS.Close() Set objRS = Nothing cn.Close() Set cn = nothing Set fsoMyFile = CreateObject("Scripting.FileSystemObject") if fsoMyFile.FileExists (PercorsoCSV) then fsoMyFile.DeleteFile PercorsoCSV end if Set fsoMyFile = Nothing Set objFSO = Nothing
-
giusto scusa, rimetti strvariabile come era all'inizio e aggiunge quella che ti ho detto ora, strVariabile = arrText(7) prima di response.write "record già presente!<br>" e dopo 'ALTRIMENTI SU PRIMO IF
else
-
@cali1981 said:
giusto scusa, rimetti strvariabile come era all'inizio e aggiunge quella che ti ho detto ora, strVariabile = arrText(7) prima di response.write "record già presente!<br>" e dopo 'ALTRIMENTI SU PRIMO IF
elseMitico, grande !!!
Adesso si funziona!!!
1000 grazie
-
di niente!
Ciao