Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Sanamento database tramite applicazione vb.net

    Buona sera a tutti,
    sono registrata da poco in questo forum e scrivo per chiedere aiuto riguardo la stesura di un programma in vb.net
    Ho un database access che contiene più righe uguali in un campo ed io in sostanza
    devo scrivere un programma che sani le righe del db.

    Io avevo pensato di istanziarmi un dataset popolarlo con il db poi a quel
    punto con un foreach andare a leggere ogni riga e annidato nel foreach mettere
    un if che controlla se il campo è stato popolato più volte e svuota il campo
    che voglio togliere.

    Voi come procedereste? Mi aiutereste a scrivere il codice?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Il titolo non c'azzecca molto con l'argomento...

    Più che un database, credo che tu abbia una tabella (o più tabelle) con record duplicati.


    Prima di tutto non conviene caricare tutta la tabella, ma trovare solo i record duplicati usando la query SQL seguente:

    codice:
      SELECT nome, COUNT(*) 
      FROM tabella 
      GROUP BY nome 
      HAVING COUNT(*) > 1
    li carichi in un DataGridView tramite un OleDataReader (inutile usare un Dataset).
    (Se non sai come eseguire queste operazioni, guardati il mio progetto in firma su ADO.NET)

    A quel punto potrai eliminare i record duplicati con un ForEach in base alla tua necessità, sempre usando una query di comando:
    codice:
    DELETE * FROM tabella WHERE <tua_condizione>
    dove <tua_condizione> è la condizione che inquivocabilmente indica la singola riga da eliminare.

    Se la tabella ha una chiave primaria (come dovrebbe essere), usa quella.
    Se non c'è allora devi creare un nuovo campo ed impostarlo come chiave primaria perchè altrimenti è pacifico che se tutti i campi dei record duplicati sono esattamente uguali allora la DELETE finirà per cancellare tutti i record uguali, anche quello che vuoi mantenere!



  3. #3

    Progetto Vb.NET

    Ciaoo...
    Ti riporto di seguito il codice che ho sviluppato seguendo il tuo ragionamento, ma c'è qualcosa che non torna e non riesco a capire dove sbaglio:


    <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Debug="true" Inherits="Gepra_LogStati._Default" %>
    <%@ Import Namespace ="System.Data.OleDb" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">

    <title>Connessione_LogStati</title>
    <script runat="server">

    Sub Page_Load(ByVal Sender As Object, ByVal e As EventArgs)

    'Percorso del Database
    Dim path As String = Server.MapPath("errori_DB.mdb")

    'Stringa di Connessione
    Dim connection As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path

    'Dichiaro, istanzio e passo un argomento ad una nuova connessione indicando
    'come argomento la relativa stringa di connessione appena creata
    Dim cn As New OleDbConnection(connection)

    cn.Open()

    'dichiaro una variabile stringa e gli assegno un valore che è la query che
    'mi restituisce i record duplicati
    Dim sql As String = "SELECT dbo_TAB_MasterMutui.Master_ID, Count(*) AS Espr1" _
    & "FROM dbo_TAB_MasterMutui" _
    & "INNER JOIN dbo_TAB_LogStati ON dbo_TAB_MasterMutui.Master_ID = dbo_TAB_LogStati.LOGSTATI_ID_pratica" _
    & "WHERE (((dbo_TAB_LogStati.LOGSTATI_Durata_stato) Is Null))" _
    & "GROUP BY dbo_TAB_MasterMutui.Master_ID" _
    & "HAVING (((Count(*))>1))" _
    & "ORDER BY dbo_TAB_MasterMutui.Master_ID"

    'dichiaro e istanzio una variabile cmd e gli passo 2 argomenti:
    'il valore della stringa e la connessione sulla quale dovrà essere effettuato il comando
    Dim cmd As New OleDbCommand(sql, cn)

    'scrivo il codice per popolare la collection Parameters con 2 valori che sono il nome
    'della colonna da controllare nella tabella del db e il contenuto del valore da ricercare
    cmd.Parameters.Add("LOGSTATI_Durata_stato, null")

    'infine dichiaro una variabile istanziando un oggetto Data Reader e gli assegno un metodo
    'che permette di effettuare l'operazione di lettura del recordset
    Dim dr As OleDbDataReader = cmd.ExecuteReader

    'ciclo l'intera tabella Log Stati, controllo per ogni riga il sup stato e se il
    'campo è stato popolato più volte lo svuoto eliminando i record duplicati
    For Each null As String In "dbo_TAB_LogStati"
    If "dbo_TAB_LogStati.LogStati_Durata_stato" = null Then
    cmd.CommandText = "DELETE * FROM TAB_LogStati WHERE LOGSTATI_Durata_stato = null"
    End If
    Next

    dr.Close()
    cn.Close()

    End Sub
    </script>
    </head>
    <body>
    <form id="form1" runat="server">
    <div>
    <%--inserisco un datagridview popolandolo con i dati della tabella Log Stati--%>
    <%-- caricando solo i record duplicati tramite un ole data reader--%>
    <asp:GridView ID="gridLogStati" runat="server" DataSourceID="AccessDataSource1"
    AutoGenerateColumns="False" DataKeyNames="LOGSTATI_ID" AllowSorting="True"
    AutoGenerateDeleteButton="True" AutoGenerateEditButton="True"
    AutoGenerateSelectButton="True" Height="205px">
    <Columns>
    <asp:BoundField DataField="LOGSTATI_ID" HeaderText="LOGSTATI_ID"
    InsertVisible="False" ReadOnly="True" SortExpression="LOGSTATI_ID" />
    <asp:BoundField DataField="LOGSTATI_ID_pratica"
    HeaderText="LOGSTATI_ID_pratica" SortExpression="LOGSTATI_ID_pratica" />
    <asp:BoundField DataField="LOGSTATI_Data_Cambio"
    HeaderText="LOGSTATI_Data_Cambio" SortExpression="LOGSTATI_Data_Cambio" />
    <asp:BoundField DataField="LOGSTATI_Stato" HeaderText="LOGSTATI_Stato"
    SortExpression="LOGSTATI_Stato" />
    <asp:BoundField DataField="LOGSTATI_Durata_stato"
    HeaderText="LOGSTATI_Durata_stato" SortExpression="LOGSTATI_Durata_stato" />
    <asp:BoundField DataField="LOGSTATI_Logon_ID" HeaderText="LOGSTATI_Logon_ID"
    SortExpression="LOGSTATI_Logon_ID" />
    </Columns>
    </asp:GridView>
    <asp:AccessDataSource ID="AccessDataSource1" runat="server"
    DataFile="~/errori_DB.mdb" SelectCommand="SELECT * FROM [dbo_TAB_LogStati]">
    </asp:AccessDataSource>
    </div>
    </form>
    </body>
    </html>

  4. #4
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Come prima cosa trovo davvero strano che in VB.NET usi ADODB invece di ADO.NET.
    Tra l'altro mescolando i due!!!
    Ma davvero funziona? Per me non dovrebbe nemmeno funzionare!

    Comunque, gli oggetti di ADODB vanno instanziati in modo corretto, non come fai tu.

    Riporto quanto scritto da William R. Vaughn in
    "Accesso ai Dati con Visual Basic" (APress - Mondadori Informatica)
    pag. 27
    ...
    Ma come si creano gli oggetti da codice? Troppi esempi (1) mostrano questa sintassi molto comune:

    Dim cn As New ADODB.Connection

    Quando si usa questa sintassi, si costringe Visual Basic ad aggiungere un sovraccarico di codice per ciascun oggetto, ogni volta che l'oggetto stesso viene referenziato, infatti "ogni volta" che Visual Basic incontra l'oggetto "cn", il compilatore aggiunge:

    If cn Is Nothing Then Set cn = New ADODB.Connection

    (1) L'autore stesso confessa di aver usato in passato questa sintassi non conoscendone l'impatto e ne chiede scusa!

    Stessa cosa viene ripetuta nel cap.6 pag. 136, riguardo al Recordset.

    A tal proposito, è bene tener presente che quando si usa la sintassi sbagliata, ovvero
    Dim rs As New ADODB.Recordset
    se poi si va a testare se l'oggetto rs è Nothing si avrà, logicamente, che è False.



    Ti segnalo anche un paio questi link, i primi che mi sono capitati 'a tiro':

    Why not to use the "Dim myObj as New Object" construct
    http://www.tek-tips.com/faqs.cfm?fid=6008

    Compare the speed of using Dim versus Dim As New
    http://www.vb-helper.com/howto_test_...new_speed.html


    Come ultima cosa:
    Affermare che "c'è qualcosa che non torna" non è che aiuta un granchè a capire alcunchè

  5. #5

    Applicazione vb.net

    Ciao, ho dato una letta ai link e a quanto mi hai scritto ma son bloccata qui, non riesco a risolvere il problema e il messaggio che visualizzo nell'esecuzione del progetto è:
    Generata eccezione di tipo 'System.OutOfMemoryException'

    Ho difficoltà a procedere da sola

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 © 2025 vBulletin Solutions, Inc. All rights reserved.