Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1

    [VB.Net] Esecuzione di una query tramite l'oggetto SqlCommand

    Ciao

    Ho la necessità di eseguire tramite un SqlCommand una stringa sql.
    Basandomi sui suggerimenti di un utente ho cercato di adattare il codice che ho utilizzato per eseguire una StoredProcedure.
    Ma non mi funziona.

    Ecco il codice:
    codice:
    Private Sub sCampi(ByRef strFile As String)
      Dim strSql As String = ""
      Dim indTab As Integer = 0
      Dim numRow As Integer = 0
      '
      Dim sNomeCampo As String = "", sTipoDato As String = ""
      Dim lLenCampo As Long = 0, sDefault As String = ""
      Dim bNull As Integer = 0, sCollation As String = "", 
      Dim sConstraints As String = ""
      '
      Dim strTit As New StringBuilder
      Dim fileSb As New StringBuilder(strFile)
      '
      Dim conn As New SqlConnection("DATA SOURCE=" & strServer & ";" _
          INITIAL CATALOG=" & strDataBase & ";UID='sa';PWD=''")
      '   
      Dim cmd As New SqlCommand("", conn)
      cmd.CommandType = CommandType.Text
      Dim da As New SqlDataAdapter(cmd)
      '
      '   array contentente l'elenco delle tabelle
      For indTab = 0 To UBound(ElencoTabelle) - 1
    
          ' Estrae l'elenco dei campi delle tabelle presenti nel database
          strSql = "SELECT DISTINCT TOP 100 PERCENT " _
           & "INFORMATION_SCHEMA.COLUMNS.table_name, " _
           & "INFORMATION_SCHEMA.COLUMNS.column_name, " _
           & "INFORMATION_SCHEMA.COLUMNS.column_default, " _
           & "INFORMATION_SCHEMA.COLUMNS.is_nullable, " _
           & "INFORMATION_SCHEMA.COLUMNS.data_type, " _
           & "ISNULL(INFORMATION_SCHEMA.COLUMNS.Collation_Name,_
              'SQL_Latin1_General_CP1_CI_AS') AS Collation, " _
           & "dbo.syscolumns.length, dbo.syscolumns.prec " _
           & "FROM " _
           & "INFORMATION_SCHEMA.COLUMNS  LEFT OUTER JOIN dbo.syscolumns " _
           & "ON INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME = dbo.syscolumns.name " _
           & "WHERE " _
           & "TABLE_NAME = '" & ElencoTabelle(indTab).ToString() & "' " _
           & "ORDER BY INFORMATION_SCHEMA.COLUMNS.column_name, " _
           & "INFORMATION_SCHEMA.COLUMNS.column_default"
    
           cmd.CommandText = strSql
           cmd.ExecuteReader()
    
           Dim dt As New DataTable
           da.Fill(dt)
    
           numRow = dt.Rows.Count
           If numRow > 0 Then
    
              strTit.Remove(0, strTit.Length)
              '
              For Each row As DataRow In dt.Rows
    
                 sNomeCampo = ""
                 sTipoDato = ""
                 lLenCampo = 0
                 bNull = 0
                 sDefault = ""
                 sCollation = ""
                 sConstraints = ""
    
                 sNomeCampo = row("COLUMN_NAME").ToString()
                 sTipoDato = row("DATA_TYPE").ToString()
                 If sTipoDato = "varchar" OrElse _
                    sTipoDato = "nvarchar" Then
                            lLenCampo = row("prec").ToString()
                 Else
                            lLenCampo = row("length").ToString()
                 End If
                 If row("IS_NULLABLE").ToString() = "yes" Then
                    bNull = 1
                 Else
                    bNull = 0
                 End If
                 'default value è null
                 If IsDBNull(row("COLUMN_DEFAULT").ToString()) Then
                    sDefault = ""
                 Else
                    sDefault = Replace(CStr(row("COLUMN_DEFAULT").ToString()), _
                               "'", "''")
                 End If
    
                 sCollation = "SQL_Latin1_General_CP1_CI_AS"
                 sConstraints = ""
    
                 'Scrivo il testo contenuto nelle righe
                 If strTit.ToString() <> ElencoTabelle(indTab) Then
                    strTit.Append("        * ")
                    strTit.Append(ElencoTabelle(indTab))
                    fileSb.AppendFormat("{0}{1}{0}", Environment.NewLine, strTit)
                 End If
                 fileSb.AppendFormat("                   - {0}, ", sNomeCampo)
                 fileSb.AppendFormat("{0}, ", sTipoDato)
                 fileSb.AppendFormat("{0}, ", lLenCampo)
                 fileSb.AppendFormat("{0}, ", bNull)
                 fileSb.AppendFormat("{0}, ", sDefault)
                 fileSb.AppendFormat("{0}, ", sCollation)
                 fileSb.AppendFormat("{0}, {1}", sConstraints, Environment.NewLine)
    
    
                 '   Inserisce i dati nella tabella tbCampiTabelle
                 strSql = "INSERT INTO tbCampiTabella(" _
                   & "IDTabella, NomeCampo, _
                      TipoDato, LunghezzaCampo, _
                      AmmetteNull, ValoreDefault, _
                      CollationCampo, ConstraintsCampo) " _
                   & "VALUES(" _
                   & "0, '[" & sNomeCampo & "]', " _
                   & "'" & sTipoDato & "', " & lLenCampo & ", " _
                   & " & bNull & ", '" & sDefault & "', " _
                   & "'" & sCollation & "', '" & sConstraints & "')"
    
                   adoConnACC.Execute(strSql)
    
              Next
              '
           End If
           dt.Dispose()
    
      Next
    
      da.Dispose()
      cmd.Dispose()
      conn.Dispose()
      strFile = fileSb.ToString()
    
      MsgBox("Importazione terminata con successo", _
      MsgBoxStyle.Information + MsgBoxStyle.OKOnly, Tit_MsgBox)
    
    End Sub
    Va in errore sulla riga in rosso, qual è l'execute corretta per questo tipo di sqlcommand?
    Il testo dell'errore è questo:
    5: ExecuteReader requires an open and available Connection. The connection's current state is closed.


    Grazie a tutti
    lady


    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

  2. #2
    Utente di HTML.it L'avatar di Brainjar
    Registrato dal
    Nov 2004
    Messaggi
    1,162
    Prova ad aprire la connessione prima del ciclo For ... Next

    codice:
      .........
      Dim cmd As New SqlCommand("", conn)
      cmd.CommandType = CommandType.Text
      Dim da As New SqlDataAdapter(cmd)
      ' --------------------
        conn.Open()
      ' --------------------
      .........
    Ciao,
    Brainjar.
    Ciao, Brainjar

  3. #3
    Originariamente inviato da Brainjar
    Prova ad aprire la connessione prima del ciclo For ... Next

    codice:
      .........
      Dim cmd As New SqlCommand("", conn)
      cmd.CommandType = CommandType.Text
      Dim da As New SqlDataAdapter(cmd)
      ' --------------------
        conn.Open()
      ' --------------------
      .........
    Ciao,
    Brainjar.
    Ciao Brain

    ho aggiunto la open, anche se nella routine che importa le relazioni non l'ho scritta da nessuna parte e il codice funziona lo stesso. forse la differenza sta nel fatto che per le relazioni utilizzo una storedprocedure? vorrei capire questa cosa, tu sai il motivo di questa differenza?

    Tornando al mio codice, ho scritto appunto la open e ora l'errore si genera sulla riga
    codice:
    Dim dt As New DataTable
    da.Fill(dt)
    e riporta questa descrizione:
    There is already an open DataReader associated with this Command which must be closed first.
    è strano perchè io alla fine di ogni ciclo sul DataTable eseguo la dispose del dt stesso.


    grazie x l'aiuto

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

  4. #4
    Utente di HTML.it L'avatar di Brainjar
    Registrato dal
    Nov 2004
    Messaggi
    1,162
    il Data Adapter da lo hai già collegato ad una fonte di dati con :

    codice:
      Dim da As New SqlDataAdapter(cmd)
    Per cui dovrebbe funzionare con
    codice:
        ' Commento le due righe 
        ' Dim dt As New DataTable
        ' da.Fill(dt)
    
        da.Fill()
    Da quanto si capisce dal tuo codice e dagli errori che ricevi, o
    fai il binding con l'oggetto command o lo fai con il DataTable.

    Prova così.

    Ciao,
    Brainjar.
    Ciao, Brainjar

  5. #5
    Originariamente inviato da Brainjar
    il Data Adapter da lo hai già collegato ad una fonte di dati con :

    codice:
      Dim da As New SqlDataAdapter(cmd)
    Per cui dovrebbe funzionare con
    codice:
        ' Commento le due righe 
        ' Dim dt As New DataTable
        ' da.Fill(dt)
    
        da.Fill()
    Da quanto si capisce dal tuo codice e dagli errori che ricevi, o
    fai il binding con l'oggetto command o lo fai con il DataTable.

    Prova così.

    Ciao,
    Brainjar.
    no, aspetta un attimo.
    il codice che ho postato in origine l'ho già usato per l'importazione delle relazioni presenti sul database di SqlServer richiesto dall'utente. E funziona alla perfezione così com'è scritto.
    L'unica differenza col codice che ho postato qui è la fonte dei dati: nel primo caso si tratta di una StoredProcedure nel secondo invece di un'istruzione di Select.
    Io non conosco bene il .Net ma il codice che mi hai appena corretto secondo me è giusto. Io sto facendo un ciclo e ogni volta che entro cambia la condizione della Select che viene eseguita ogni volta restituendo quindi un set di risultati diverso per ogni giro. Ecco perchè ritengo che
    codice:
    Dim dt As New DataTable
    da.Fill(dt)
    sia giusto.

    Non c'ho capito niente o è così?

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

  6. #6
    ho provato a fare come dici tu, ma appena tolto (dt) mi dice: "Error Overload resolution failed because no accessible 'Fill' accepts this number of arguments."

    è evidente che quindi il problema non è quello.
    non può essere il modo in cui apro il command?

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

  7. #7
    un datareader va' aperto e chiuso una volta rilevati i dati

    se nella stessa connection c'e' già un reader aperto ti darà sempre errore dicendoti appunto che e' aperto

    non occorre aprire un reader se esegui un ExecuteScalar o un ExecuteNonQuery

  8. #8
    Originariamente inviato da kentaromiura
    un datareader va' aperto e chiuso una volta rilevati i dati

    se nella stessa connection c'e' già un reader aperto ti darà sempre errore dicendoti appunto che e' aperto
    uè kenta


    io eseguo dt.Dispose() ogni volta che finisco il ciclo.
    non occorre aprire un reader se esegui un ExecuteScalar o un ExecuteNonQuery
    e allora come devo aprirlo sto command maledetto per far funzionare il codice?
    perchè qui (StoredProcedure) funziona tutto alla perfezione? :master:

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

  9. #9
    Utente di HTML.it L'avatar di Brainjar
    Registrato dal
    Nov 2004
    Messaggi
    1,162
    Uso VB.NET, in ambiente Sharp Develop, esclusivamente per il porting
    di mie applicazioni Java. E con DB ORACLE, per cui non utilizzo i
    data adapter e/o i data table, almeno per il momento. Ma credo che
    con la coppia di istruzioni :
    codice:
        Dim dt As New DataTable
        da.Fill(dt)
    passi al dataadapter, da, un oggetto datatable, dt, nuovo di zecca e
    in conflitto con una fonte dati già aperta. Questo è ciò che si
    capisce dal codice.

    La mia è una considerazione di logica (fallibile, ci mancherebbe).

    Mi dispiace non poterti essere di aiuto.
    Adesso sono preso da una 'consegna' e non posso 'studiare' una
    soluzione al tuo quesito.

    Ciao,
    Brainjar.
    Ciao, Brainjar

  10. #10
    Originariamente inviato da Brainjar
    Uso VB.NET, in ambiente Sharp Develop, esclusivamente per il porting
    di mie applicazioni Java. E con DB ORACLE, per cui non utilizzo i
    data adapter e/o i data table, almeno per il momento. Ma credo che
    con la coppia di istruzioni :
    codice:
        Dim dt As New DataTable
        da.Fill(dt)
    passi al dataadapter, da, un oggetto datatable, dt, nuovo di zecca e
    in conflitto con una fonte dati già aperta. Questo è ciò che si
    capisce dal codice.

    La mia è una considerazione di logica (fallibile, ci mancherebbe).

    Mi dispiace non poterti essere di aiuto.
    Adesso sono preso da una 'consegna' e non posso 'studiare' una
    soluzione al tuo quesito.

    Ciao,
    Brainjar.
    Ok, posso essere pure d'accordo con quanto affermi... il problema è che se tolgo (dt) il codice mi va in errore
    Io passo al dataadapter, da, un oggetto datatable, dt, nuovo di zecca ogni volta che entro nel ciclo. Per ogni tabella presente nel db devo leggere i campi, quindi c'è un primo ciclo sull'array delle tabelle e il secondo sul datatable contenente l'elenco dei campi. Alla fine di questo secondo ciclo c'è l'istruzione dt.Dispose() che dovrebbe azzerare la situazione.
    Possibile che non ci capisco una fava?


    Beh, comunque non preoccuparti se non puoi starmi appresso, sei stato molto gentile.
    Grazie lo stesso

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

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.