Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente bannato
    Registrato dal
    Aug 2004
    Messaggi
    213

    Ottenere il CommandText elaborato coi parametri di un SqlCommand...

    Quando devo impostare i parametri di un SqlCommand, naturalmente non faccio altro che aggiungerli alla collection Parameters e impostare il CommandText.

    Se CommandText è per esempio

    codice:
    Select Pippo From Disney Where Topolino = @Topolino


    vorrei ottenere la nuova stringa sql modificata dall'SqlCommand dopo l'applicazione dei parametri.
    Vorrei ottenere cioé qualcosa del genere

    codice:
    Declare @Topolino Int
    Set @Topolino = MioValore --cioé il valore assegnato al parametro...
    Select Pippo From Disney Where Topolino = @Topolino


    che dovrebbe essere, credo, la sql così come viene elaborata dal command.

    E' possibile ottenerla?

  2. #2

    Re: Ottenere il CommandText elaborato coi parametri di un SqlCommand...

    Vorrei ottenere cioé qualcosa del genere

    Declare @Topolino Int
    Set @Topolino = MioValore --cioé il valore assegnato al parametro...
    Select Pippo From Disney Where Topolino = @Topolino

    che dovrebbe essere, credo, la sql così come viene elaborata dal command. E' possibile ottenerla?
    Il codice TSql che hai riportato sembra essere quello di una stored procedures di sqlserver.
    Utilizzare una sp esistente con un sqlcommand e' molto semplice e dopo aver assegnato al commandtext il nome della sp e al commandtype il tipo giusto, non ti rimane altro che aggiungere al sqlcommand i parametri che la sp si aspetta.
    Se invece vuoi sapere come aggiungere parametri ad una query sql un esempio e' (dopo aver valorizzato l'sqlcommand.commandtext con la query):
    codice:
    tuoCommand.Parameters.Add("@Topolino", SqlDbType.VarChar).Value = "Topolone"
    Saluti a tutti
    Riccardo

  3. #3
    Utente bannato
    Registrato dal
    Aug 2004
    Messaggi
    213
    Forse non sono stato molto chiaro

    Per quanto riguarda l'assegnazione di parametri ecc ad un command, no problem; quello che vorrei ottenere è proprio la stringa sql generata dallo stesso command dopo che i parametri sono stati addati alla commandtext iniziale.

    es.

    codice:
    with comando
        .commandtext = "select ciao from saluti where pippo = @pippo"
        .parameters.add("@pippo","yauchie")
    end with
    Naturalmente la stringa sql che io passo inizialmente è "select ciao from saluti where pippo = @pippo", che contiene un riferimento al parametro (@pippo) e non il valore dello stesso nella condizione della query.

    Supponendo di assegnare il valore "yauchie" al parametro @pippo, penso che prima di essere data in pasto a Sql Server, la query iniziale (quella della commandtext) venga opportunamente "trasformata" sostituendo a ciascun parametro il suo valore, altrimenti è ovvio che la query eseguita in sql server darebbe errore (cioé se provassi con query analyzer per es. ad eseguire la commandtext così come gliel'ho data io, cioé "select ciao from saluti where pippo = @pippo", ovviamente mi restituirebbe errore perché @pippo non è stata né dichiarata (con Declare) né valorizzata (con Set).

    Secondo me dunque la query viene trasformata in uno dei seguenti modi:

    1 - (più semplice) vengono sostituiti i parametri, direttamente con i loro valori. Nell'esempio la query trasformata e data in esecuzione a sql server sarebbe:

    codice:
    select ciao from saluti where pippo = 'yauchie'
    oppure

    2 - la commandtext viene modificata assumendo l'aspetto di una sp. Cioé:

    codice:
    Declare @pippo varchar
    set @pippo = 'yauchie'
    
    select ciao from saluti where pippo = @pippo

    Sia in un modo, che nell'altro, la query così modificata è ovviamente eseguibile direttamente in sql server.

    Ecco, io vorrei ricavare in qualche modo la stringa sql così ottenuta dall'elaborazione della commandtext con i parametri.

  4. #4
    Originariamente inviato da Yauchie
    Ecco, io vorrei ricavare in qualche modo la stringa sql così ottenuta dall'elaborazione della commandtext con i parametri.
    Puoi ottenere la stringa sql leggendola dalla proprieta' commandtext.
    Puoi sostituire con le funzioni offerte dalla classe string (es. replace, substring ecc.) i parametri con il rispettivo valore ottenuto ad es. con
    codice:
    Dim m_pippo As String = m_cmd.Parameters("@pippo").Value
    Saluti a tutti
    Riccardo

  5. #5
    Utente bannato
    Registrato dal
    Aug 2004
    Messaggi
    213
    Originariamente inviato da riccardone
    Puoi ottenere la stringa sql leggendola dalla proprieta' commandtext.
    Puoi sostituire con le funzioni offerte dalla classe string (es. replace, substring ecc.) i parametri con il rispettivo valore ottenuto ad es. con
    codice:
    Dim m_pippo As String = m_cmd.Parameters("@pippo").Value
    Il problema è che se il parametro è una stringa, va messo tra apici, se è un intero o decimale, senza, se è una data tra apici e in un determinato formato.....e così via...

  6. #6
    Originariamente inviato da Yauchie
    Il problema è che se il parametro è una stringa, va messo tra apici, se è un intero o decimale, senza, se è una data tra apici e in un determinato formato.....e così via...
    Potresti controllare prima di che tipo e' es.
    codice:
    Dim m_sql As String = m_cmd.CommandText
            Select Case m_cmd.Parameters("@pippo").SqlDbType
                Case SqlDbType.VarChar
                    m_sql = m_sql.Replace("@pippo", "'" & m_cmd.Parameters("@pippo").Value & "'")
                Case SqlDbType.Int
                    m_sql = m_sql.Replace("@pippo", m_cmd.Parameters("@pippo").Value)
            End Select
    Saluti a tutti
    Riccardo

  7. #7
    Utente bannato
    Registrato dal
    Aug 2004
    Messaggi
    213
    Può essere un'idea, peccato che però non si possa fare in un modo diretto

  8. #8
    Originariamente inviato da Yauchie
    Può essere un'idea, peccato che però non si possa fare in un modo diretto
    codice:
    Public Function ModoDiretto(ByVal _param As SqlClient.SqlParameter, ByVal _sql As String) As String
            Select Case _param.SqlDbType
                Case SqlDbType.VarChar
                    Return _sql.Replace(_param.ParameterName, "'" & _param.Value & "'")
                Case SqlDbType.Int
                    Return _sql.Replace(_param.ParameterName, _param.Value)
            End Select
        End Function
    Saluti a tutti
    Riccardo

  9. #9
    Utente bannato
    Registrato dal
    Aug 2004
    Messaggi
    213
    LOOOL :maLOL: :maLOL: :maLOL:




  10. #10
    Utente bannato
    Registrato dal
    Aug 2004
    Messaggi
    213
    In effetti non è poi così brutta come soluzione, quella di adottare una funzione. Ho fatto come vedi sotto, le passo come unico parametro l'SqlCommand di cui mi viene restituita la CommandText elaborata con l'applicazione dei parametri.
    Strano però che non ci sia una proprietà o metodo proprio del command...

    codice:
        Public Function TrasformaSql(ByVal cmd As SqlCommand) As String
            Dim tempSql As String = cmd.CommandText
            For Each Parametro As SqlParameter In cmd.Parameters
                With Parametro
                    If .SqlDbType = SqlDbType.Char Or .SqlDbType = SqlDbType.Text Or .SqlDbType = SqlDbType.VarChar Then
                        tempSql = tempSql.Replace(.ParameterName, "'" & (.Value) & "'")
                    ElseIf .SqlDbType = SqlDbType.DateTime Then
                        tempSql = tempSql.Replace(.ParameterName, "'" & Year(.Value) & "-" & Month(.Value) & "-" & Day(.Value) & "'")
                    ElseIf .SqlDbType = SqlDbType.Bit Then
                        tempSql = tempSql.Replace(.ParameterName, IIf(.Value, 1, 0))
                    Else
                        tempSql = tempSql.Replace(.ParameterName, Str(.Value).Replace(",", "."))
                    End If
                End With
            Next
            Return tempSql
        End Function

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.