Visualizzazione dei risultati da 1 a 10 su 19

Hybrid View

  1. #1

    [VB6] ADO, ASP e XMP per la gestione di un database remoto

    Sono numerosi gli esempi sul web di come interagire, mediante un programma scritto in VB6, con un database MSAccess remoto.
    Utilizzano ADO, ASP e XML per la gestione del database e visualizzano il tutto in una finestra VB6.
    Riguardano tutti la LETTURA oppure la MODIFICA di un record. Nessuno, che io sappia, affronta il problema di come AGGIUNGERE un nuovo record.
    Li ho provati ampiamente tutti questi metodi e devo dire che funzionano egregiamente.
    Ma - ripeto - non ho trovato il modo di AGGIUNGERE un record.
    Qualcuno sa darmi qualche suggerimento ?
    Grazie per l'attenzione

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Come modifichi un record?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    se ASP è usato per esporre un webservice, la INSERT va messa lì. Ma, come dice giustamente oregon, vediamo come fai adesso la lettura e la modifica

  4. #4
    Applico i concetti espressi nell'articolo (prima parte)


    Questa è la funzione lato VB6

    codice:
    Public Function LeggiRsWeb(Query As String) As ADODB.Recordset
       Dim rs As New ADODB.Recordset
       '
       rs.CursorType = adOpenKeyset
       rs.LockType = adLockBatchOptimistic  ' deve essere Batch
       rs.CursorLocation = adUseClient
       rs.Open WebHost & "GetXMLRecordset.asp?Query=" & Query
       Set LeggiRsWeb = rs.Clone
       rs.Close
       Set rs = Nothing
    End Function
    e questo è il codice ASP

    codice:
    <%
    Const enuErrorConnection = 0
    Const enuErrorOpenRecordset = 1
    Dim rs, stm, Parm, cn
    On Error Resume Next
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    Set stm = CreateObject("ADODB.Stream")
    
    strConn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Session("gloDB")+"db........mdb"
    cn.ConnectionString=strConn 
    cn.CursorLocation=3     '    adUseClient
    cn.Open
    If Err Then
       rs.Fields.Append "EType", 3
       rs.Fields.Append "Number", 20
       rs.Fields.Append "Description", 200, 500
       rs.Open
       rs.addnew 
       rs(0) = enuErrorConnection
       rs(1) = Err.Number    
       rs(2) = Err.Description 
       rs.MoveFirst
       rs.Update
    Else
       Parm = Request.QueryString("Query")
       '--- siccome il carattere # non passa nella query lo sostituisco con un carattere "|"
       '    (l'operazione inversa l'ho fatta dal lato codice VB)
       if instr(Parm,"|")>0 then
          Parm=replace(Parm,"|","#")
       end if   
       rs.Open Parm,cn,3,4,1   
       If Err Then
          Set rs = CreateObject("adodb.Recordset")
          rs.Fields.Append "EType", 3
          rs.Fields.Append "Number", 20
          rs.Fields.Append "Description",200,500
          rs.Open
          rs.AddNew
          rs(0) = enuErrorOpenRecordset
          rs(1) = Err.Number        
          rs(2) = Err.Description
          rs.Update
       End If
    End If
    rs.Save stm,1
    cn.Close
    Set cn = Nothing 
    Response.ContentType = "text/xml"
    Response.Expires=0
    Response.Buffer=False
    Response.Write "<?xml version='1.0' encoding='ISO-8859-1'?>" & chr(13) & chr(10)
    Response.Write stm.ReadText
    stm.Close
    Set stm = Nothing
    Set rs = Nothing
    %>
    Funziona tutto egregiamente, ma non so come aggiungere un record. Ora, leggendo meglio il codice ASP, mi viene il dubbio che un semplice INSERT INTO (come suggerito da "optime", che ringrazio) potrebbe fare il caso mio. Oggi provo ma. dovendo inserire parecchio (1000-2000 byte di dati con accenti, barre, asterischi, ecc.) nel record, temo che non si possa fare una query cosi' lunga.
    Ultima modifica di giustavalla; 05-02-2014 a 11:59

  5. #5
    Quote Originariamente inviata da giustavalla Visualizza il messaggio
    Ora, leggendo meglio il codice ASP, mi viene il dubbio che un semplice INSERT INTO (come suggerito da ...) potrebbe fare il caso mio. Oggi provo ma. dovendo inserire parecchio (1000-2000 byte di dati con accenti, barre, asterischi, ecc.) nel record, temo che non si possa fare una query cosi' lunga.
    "..." ti ringrazia

  6. #6
    Quote Originariamente inviata da optime Visualizza il messaggio
    "..." ti ringrazia
    Avevo dimenticato il tuo nome, scusa.

  7. #7
    Ho provato, senza successo, nel seguente modo :
    1) creo un recordset disconnesso
    codice:
       Dim rsD As ADODB.Recordset
       Set rsD = New ADODB.Recordset
       If rsD.State = adStateOpen Then rsD.Close
       Set rsD.ActiveConnection = Nothing ' non so se serve
       rsD.Fields.Append "IDeffettuazione", 3
       rsD.Fields.Append "IDGita", 3
       rsD.Fields.Append "IDValle", 3
       rsD.Fields.Append "Data", 7
       rsD.Fields.Append "Meteo", 202, 100
       ...............
        rsD.Open
    2) lo popolo
    codice:
     rsD.AddNew
       rsD("IDeffettuazione") = IDEff
       rsD("IDGita") = IDGitaEff
       rsD("IDValle") = 1     ' da perfezionare
       rsD("Data") = Now
       rsD("Meteo") = Left(Trim$(Tx(0)), 100)
       ............
       rsD.Update
    3) creo lo stream e lo invio alla pagina Update.asp
    codice:
     rsD.Save stm, adPersistXML
       stm.SaveToFile FilePerDebug, adSaveCreateOverWrite ' debug
       xml.Open "POST", WebHost & "Update.asp", False
       xml.send stm.ReadText
       If xml.responseText <> "" Then
          MsgBox Right(xml.responseText, Len(xml.responseText) - InStr(xml.responseText, vbCrLf) - 1), vbCritical, Left(xml.responseText, InStr(xml.responseText, vbCrLf) - 1)
       End If
    Questa è la pagina Update.asp
    codice:
    <% 
    Dim rs, stm,  ErrorMessage
    on error resume next
    strConn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbEff.mdb"
    Set rs = Server.CreateObject ("ADODB.Recordset")
    Set stm = Server.CreateObject("ADODB.Stream")
    with rs
        .CursorLocation = 3  ' adUseClient
        .Open Request
        .ActiveConnection =strConn
        .UpdateBatch
    end with
    if err then
            ErrorMessage =  "RSUpdate error: " & err.Description & "[" & err.Number & "]"
            rs.Save stm,1   ' adPersistXML
           ' Set content type to xml, specify XSL for formatting, then push XML stream text to calling component:
            Response.ContentType = "text/xml"
            Response.Write "<!-- " & ErrorMessage &  " -->"        ' This is treated as a comment
            Response.Write "<?xml:stylesheet type=""text/xsl"" href=""recordsetxml.xsl""?>" & vbCrLf
            Response.Write stm.ReadText
    end if
    %>
    Risultato: lo stream sembra corretto, il file XML (FilePerDebug.XML) pure ma il tutto produce un MsgBox con il seguente errore :
    "Le informazioni sulla tabella di base non sono sufficienti per effettuare l'aggiornamento".

    Grazie anticipatamente a coloro che vorranno aiutarmi.

  8. #8
    Effettivamente ho dei dati di un mio programma (sviluppato in VB6) che vorrei trasferire nel web; i dati non sono memorizzati su un db.
    Il tuo suggerimento (usare ADODB.Command) è stato risolutivo.
    Dapprima mi sono costruito una istruzione SQL del tipo
    INSERT INTO TabEff VALUES(8815,101361,1182,#2014-02-09#,'tempo bello','1','dettagli in quot ……

    Poi ho richiamato la pagina ASP
    codice:
    On Error Resume Next
       rs.CursorType = adOpenKeyset
       rs.LockType = adLockBatchOptimistic
       rs.CursorLocation = adUseClient
       rs.Open WebHost & "InsertMT.asp?Query=" & Criterio
       rs.Close
       Set rs = Nothing
    nella quale ho inserito un oggetto (si dice cosi ?) ADODB.Command.
    Due soli veniali inconvenienti, ma per il resto è tutto OK. Essi sono :

    1. Se non inserisco un “On Error Resume Next” va in errore la linea rs.Open WebHost & "InsertMT.asp?Query=" & Criterio
    2. L’istruzione SQL (la query) non può essere più lunga di 2000 caratteri circa per cui non è possibile inserire molti dati; mi dispiace ma non penso si possa fare niente.
    3. Nella query bisogna sostituire il carattere # con un altro carattere (ad esempio |) in quando il # non passa; un doppio replace (lato VB e lato ASP) e tutto è OK.
    4. Lo stesso succede per il carattere asterisco; un banale replace ovvia al tutto.

    Grazie di cuore !

  9. #9
    Quote Originariamente inviata da giustavalla Visualizza il messaggio
    Effettivamente ho dei dati di un mio programma (sviluppato in VB6) che vorrei trasferire nel web; i dati non sono memorizzati su un db.
    Il tuo suggerimento (usare ADODB.Command) è stato risolutivo.
    Dapprima mi sono costruito una istruzione SQL del tipo
    INSERT INTO TabEff VALUES(8815,101361,1182,#2014-02-09#,'tempo bello','1','dettagli in quot ……

    Poi ho richiamato la pagina ASP
    codice:
    On Error Resume Next
       rs.CursorType = adOpenKeyset
       rs.LockType = adLockBatchOptimistic
       rs.CursorLocation = adUseClient
       rs.Open WebHost & "InsertMT.asp?Query=" & Criterio
       rs.Close
       Set rs = Nothing
    nella quale ho inserito un oggetto (si dice cosi ?) ADODB.Command.
    Due soli veniali inconvenienti, ma per il resto è tutto OK. Essi sono :

    1. Se non inserisco un “On Error Resume Next” va in errore la linea rs.Open WebHost & "InsertMT.asp?Query=" & Criterio
    2. L’istruzione SQL (la query) non può essere più lunga di 2000 caratteri circa per cui non è possibile inserire molti dati; mi dispiace ma non penso si possa fare niente.
    3. Nella query bisogna sostituire il carattere # con un altro carattere (ad esempio |) in quando il # non passa; un doppio replace (lato VB e lato ASP) e tutto è OK.
    4. Lo stesso succede per il carattere asterisco; un banale replace ovvia al tutto.

    Grazie di cuore !
    ... veramente non era questo che intendevo ... anche se funziona

    Se ti va bene come hai fatto ignora il resto.

    Non so ti sei letta questo :
    http://www.nicolaottomano.it/it-lang...i/DBRemoto.htm

    ... ad un certo punto, lato asp esegue l'UpdateBatch che tu non puoi eseguire
    per i motivi che ho provato a spiegare

    codice:
    Set rs = Server.CreateObject("ADODB.Recordset")
    Set stm = Server.CreateObject("ADODB.Stream")
    Set conn = Server.CreateObject("ADODB.Connection")
        
    conn.ConnectionString = "driver={Microsoft Access Driver (*.mdb)};dbq=" & _
        Server.MapPath("example.mdb")
    conn.CursorLocation = adUseClient
    conn.Open 
        
    With rs
        .CursorLocation = adUseClient
        .Open Request
        .ActiveConnection = conn
        .UpdateBatch
    End With
    Nel tuo caso dovresti invece fare una cosa del genere (... è solo una bozza non provata) :

    codice:
    Set rs = Server.CreateObject("ADODB.Recordset")
    Set cmd = Server.CreateObject("ADODB.Command")
    Set conn = Server.CreateObject("ADODB.Connection")
        
    conn.ConnectionString = "driver={Microsoft Access Driver (*.mdb)};dbq=" & _
        Server.MapPath("example.mdb")
    conn.CursorLocation = adUseClient
    conn.Open 
    
    cmd.activeconnction=conn
        
    With rs
        .CursorLocation = adUseClient
        .Open Request
           
         'lo lasci disconnesso perchè nel tuo caso non ha senso collegarlo al db
        '.ActiveConnection = conn
        '.UpdateBatch 'queto va commentato perchè a te non funzionerà 
        
         while not .eof
            cmd.commandeText = <costruisco la insert in base al record corrente di rs>
            N.B. andrebbero usati i parametri su cui ti invito a documentarti
             cmd.execute
            .movenext
         wend  
    
    
    End With
    etc ...

    HTH
    Ultima modifica di sspintux; 10-02-2014 a 13:46

  10. #10
    OK.
    Sembra proprio che la mia soluzione funzioni. Se per caso avessi dei problemi adotterò la tua e già vedo che il mio piccolo inconveniente (punto 1) con il tuo codice dovrebbe scomparire.
    Grazie di tutto. Ho imparato qualcosa in più.

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