Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Discussione: VB OdbcDataAdapter

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    133

    VB OdbcDataAdapter

    Scusate se continuo a rompere ma le lacune sono molte.
    Sono costretto a usare ODBC perché è l'unico modo che mi da il provider per accedere ad un file mysql.

    Quindi per ottenere un equivalente del recordset -> data.datatable uso il seguente codice.
    (Attualmente le prove sono con un DataBase di Access).

    Codice PHP:
    Imports Microsoft.VisualBasic
    Imports System
    Imports System
    .Web

    Public Class DataBase

        
    Function FindRecord(ByVal Table As StringByVal Sql As String) As Data.DataTable

            Err
    .Clear()
            
    Dim Contesto As HttpContext HttpContext.Current

            Dim ObjCo 
    As New Data.Odbc.OdbcConnection
            ObjCo
    .ConnectionString System.Configuration.ConfigurationManager.AppSettings("connString")
            If 
    Err.Number <> 0 Then Contesto.Response.Redirect("~/errore.htm?P=FR001")

            
    Dim DataAD As Data.Odbc.OdbcDataAdapter
            DataAD 
    = New Data.Odbc.OdbcDataAdapter(SqlObjCo)
            If 
    Err.Number <> 0 Then Contesto.Response.Redirect("~/errore.htm?P=FR002")

            
    Dim Rs As New Data.DataTable
            Dim returnValue 
    As Integer DataAD.Fill(Rs)
            If 
    Err.Number <> 0 Then Contesto.Response.Redirect("~/errore.htm?P=FR003")

            
    FindRecord Rs
            ObjCo
    .Close()

        
    End Function

    End Class 
    Ho letto che OdbcDataAdapter restituisce tutti i record?
    Quello che non ho capito è restituisce tutti i record previsti dalla Sql. I record saranno molti, se mai finirò il tutto, e l'idea che carichi 30.000 record per selezionarne uno mi sembra una follia.
    Le Sql che uso generalmente selezionano un solo record "ID=Valore" quindi di solito uso
    Data.DataTable.Rows(0)("Campo")

    è corretto il modo di procedere? Ci sono altre soluzioni?

    Un grazie anticipato, e buon Natale a tutti.
    Tomas
    tomas

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    133
    Il codice sopra riportato aveva alcuni errori, adesso funziona bene.
    Codice PHP:
    Imports Microsoft.VisualBasic
    Imports System
    Imports System
    .Web

    Public Class MyDataBase

        
    Public Shared Function FindRecord(ByVal Sql As String) As Data.DataTable

            Err
    .Clear()
            
    Dim Contesto As HttpContext HttpContext.Current

            Dim ObjCo 
    As New Data.Odbc.OdbcConnection
            ObjCo
    .ConnectionString System.Configuration.ConfigurationManager.AppSettings("connString")
            If 
    Err.Number <> 0 Then Contesto.Response.Redirect("~/errore.htm?P=FR001")

            
    Dim DataAD As Data.Odbc.OdbcDataAdapter
            DataAD 
    = New Data.Odbc.OdbcDataAdapter(SqlObjCo)
            If 
    Err.Number <> 0 Then Contesto.Response.Redirect("~/errore.htm?P=FR002")

            
    Dim Rs As New Data.DataTable
            Dim returnValue 
    As Integer DataAD.Fill(Rs)
            If 
    Err.Number <> 0 Then Contesto.Response.Redirect("~/errore.htm?P=FR003")

            
    FindRecord Rs
            ObjCo
    .Close()

        
    End Function

    End Class 
    tomas

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    133
    Altri dubbi

    bisogna aggiungere
    set ObjCo=Nothing

    ?

    Tomas
    tomas

  4. #4
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Per estrarre un solo valore dovresti usare il metodo ExecuteScalar dell'oggetto Command.

    Comunque per estrarre un Datatable usavo questa (è OleDb ma i concetti sono gli stessi):

    codice:
    Namespace Database
        Public Class OleDbTools
    
            Private _StringaConnessione As String
            Public Property StringaConnessione() As String
                Get
                    Return _StringaConnessione
                End Get
    
                Set(ByVal Value As String)
                    _StringaConnessione = Value
                End Set
            End Property
    
            Private _SQL As String
            Public Property SQL() As String
                Get
                    Return _SQL
                End Get
    
                Set(ByVal Value As String)
                    _SQL = Value
                End Set
            End Property
    
            Private internal_OLEDBCONN As OleDbConnection
            Private internal_OLEDBCOMMAND As OleDbCommand
            Private internal_OLEDBREADER As OleDbDataReader
            Private internal_OLEDBADAPTER As OleDbDataAdapter
            Private internal_DATASET As DataSet
    
            Private Sub Connetti()
                Try
                    internal_OLEDBCONN = New OleDbConnection(StringaConnessione)
                    internal_OLEDBCONN.Open()
                Catch ex As OleDbException
                    internal_OLEDBCONN.Close()         
                    Throw ex
                End Try
            End Sub
    
            Public Function EstraiDataTable(ByVal strNomeDataTable As String) As DataTable
                Connetti()
                internal_DATASET = New DataSet
                internal_OLEDBADAPTER = New OleDbDataAdapter(_SQL, internal_OLEDBCONN)
                Try
                    internal_OLEDBADAPTER.Fill(internal_DATASET, strNomeDataTable)
                    Return internal_DATASET.Tables(0)
                Catch ex As OleDbException
                    Throw ex
                    Return Nothing
                Finally
                    internal_OLEDBCONN.Close()
                End Try
            End Function
    
    
            ' Restituisce un solo valore (prima riga, prima colonna)
            Public Function EstraiValoreSingolo() As String
                Connetti()
                internal_OLEDBCOMMAND = New OleDbCommand(Me._SQL, internal_OLEDBCONN)
                Try
                    internal_OLEDBREADER = internal_OLEDBCOMMAND.ExecuteScalar()
                    internal_OLEDBREADER.Read()
                    Return System.Convert.ToString(internal_OLEDBREADER(0))
                Catch ex As OleDbException
                    Throw ex
                    Return System.Convert.ToString("")
                Finally
                    internal_OLEDBCONN.Close()
                    internal_OLEDBCOMMAND.Dispose()
                End Try
            End Function
        End Class
    End NameSpace
    dandogli le proprietà SQL e StringaConnessione prima.


    Esempio:
    codice:
    Dim myDB as new Database.OleDbTools
    myDB.SQL = "SELECT CAMPO1,CAMPO2 FROM TABELLA"
    myDB.StringaConnessione = ConfigurationManager.AppSettings("strconn")
    Dim dt as New DataTable 
    dt = myDB.EstraiDataTable("prova")

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    133
    Grazie mi studio il tutto e adatto a odbc. Anche tu usi DataAdapter, se va bene a te va bene sicuramente anche nel mio caso. Poi quando sarò più bravo cercherò di capire le differenze tra i vari metodi.
    Buon Natale
    Tomas
    tomas

  6. #6
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Di solito si usa un Adapter quando si vuole riempire un DataSet o si vuole aggiornare il DB (metodo Update). Ci sono casi in cui quindi non serve

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    133
    Rieccomi, ho convertito la tua classe per connessioni OleDb in ODBC.

    Codice PHP:
    Imports Microsoft.VisualBasic
    Imports System
    .Data
    Imports System
    .Data.Odbc

    Namespace MyDataBase

        
    Public Class OdbcTools

            
    Private _StringaConnessione As String
            
    Public Property StringaConnessione() As String
                Get
                    
    Return _StringaConnessione
                End Get
                Set
    (ByVal Value As String)
                    
    _StringaConnessione Value
                End Set
            End Property

            
    Private _SQL As String
            
    Public Property SQL() As String
                Get
                    
    Return _SQL
                End Get

                Set
    (ByVal Value As String)
                    
    _SQL Value
                End Set
            End Property

            
    Private internal_OdbcConn As OdbcConnection
            
    Private internal_OdbcCommand As OdbcCommand
    'Private internal_OdbcReader As OdbcDataReader
            Private internal_OdbcAdapter As OdbcDataAdapter
            Private internal_DataSet As DataSet

            Private Sub Connetti()
                Try
                    internal_OdbcConn = New OdbcConnection(StringaConnessione)
                    internal_OdbcConn.Open()
                Catch ex As OdbcException
                    internal_OdbcConn.Close()
                    Throw ex
                End Try
            End Sub

            Public Function EstraiDataTable(ByVal strNomeDataTable As String) As DataTable
                Connetti()
                internal_DataSet = New DataSet
                internal_OdbcAdapter = New OdbcDataAdapter(_SQL, internal_OdbcConn)
                Try
                    internal_OdbcAdapter.Fill(internal_DataSet, strNomeDataTable)
                    Return internal_DataSet.Tables(0)
                Catch ex As OdbcException
                    Throw ex
                    Return Nothing
                Finally
                    internal_OdbcConn.Close()
                End Try
            End Function

            Public Function EstraiValoreSingolo() As String
                Connetti()
                internal_OdbcCommand = New OdbcCommand(Me._SQL, internal_OdbcConn)
                Try
    internal_OdbcReader internal_OdbcCommand.ExecuteScalar()
    ' internal_OdbcReader.Read()
                    Return System.Convert.ToString(internal_OdbcCommand.ExecuteScalar())
                Catch ex As OdbcException
                    Throw ex
                    Return System.Convert.ToString("")
                Finally
                    internal_OdbcConn.Close()
                    internal_OdbcCommand.Dispose()
                End Try
            End Function
        End Class
    End Namespace 
    Sin qui nulla di difficile, tranne:
    1) internal_OdbcReader.Read() mi dava errore, eseguendo ExecuteScalar si ha direttamente il valore richiesto, non è necessario, anzi dava errore, eseguire odbcReader.read

    2) a cosa serve il parametro di passaggio nella chiamata
    EstraiDataTable(ByVal strNomeDataTable As String)
    strNomeDataTable non serve a nulla, credo.
    Il DataTable è restituito dalla funzione e il parametro stringa non viene utilizzato.
    L'istruzione
    OdbcAdapter.Fill(internal_DataSet, strNomeDataTable)
    in realtà in questo caso non ha bisogno del nome tabella

    Le mie non sono assolutamente critiche, anzi ti ringrazio molto del codice ho imparato un sacco di cose, sto solo cercando di capire come funziona.
    Grazie mille
    Tomas
    tomas

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    133
    Come si fa a pubblicare il codice? Io uso il tag PHP ma come ben si vede non è il tag giusto.
    Tomas
    tomas

  9. #9
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Con il tag (code) con parentesi quadre, e la sua chiusura.

    - La stringa con il nome del DB mi serviva nel caso volessi restituire un Datatable con un suo nome. (per usarlo poi con una istruzione come DT("utenti").Rows(0)("campo1") ). Se non pensi sia una funzione utile semplicemente toglila

    - Per la read del reader, scusami ti ho postato una versione della Sub che non c'entrava nulla ! Hai ragione, quello della Read era un test aggiunto in seguito ed erroneamente non cancellato.

    Quella corretta è questa:
    codice:
            
    Public Function EstraiSingoloValore() As String
                Connetti()
                internal_SQLCOMMAND = New SqlCommand(Me._SQL, internal_SQLCONN)
                Try
                    Return System.Convert.ToString(internal_SQLCOMMAND.ExecuteScalar())
                Catch ex As SqlException
                    Throw ex
                    Return System.Convert.ToString("")
                Finally
                    internal_SQLCONN.Close()
                    internal_SQLCOMMAND.Dispose()
                End Try
    End Function

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    133
    Grazie imparato una cosa in più DT("nome")
    Gli errori fanno solo bene, ti costringono a vincere la pigrizia e studiare tutto il codice.

    Adesso sto facendo delle prove con l'oggetto page per eseguire l'operazione inversa del request.form. Dato un record caricare automaticamente, per nome del campo=nome del controllo, i text box, i check box e posizionare le dropdownlist. Per ora ci provo da solo poi se non ci riesco mi rifaccio vivo.
    Tomas
    tomas

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.