Domanda

La stringa passata alla mia funzione personalizzata è la seguente:

SELECT key FROM ubis WHERE MemberID = '144'
AND To >='11/7/2009 9:11:23 pm'
AND From <= '11/7/2009 9:11:23 pm'

    Public Shared Function GetDataTable(ByVal CmdText As String) As DataTable
        Dim myConn As New SqlConnection(ConfigurationManager.ConnectionStrings("Conn").ConnectionString)
        Dim myCmd As New SqlCommand(CmdText, myConn)
        myConn.Open()
        Dim myReader As SqlDataReader = myCmd.ExecuteReader()
        Dim myTable As New DataTable()
        myTable.Load(myReader)
        myConn.Close()
        Return (myTable)
    End Function

e qui è l'errore che ottengo, Conversione non riuscita durante la conversione di datetime dalla stringa di caratteri

Mi rendo conto che i campi datetime vengono passati come stringa nella funzione, ma quali opzioni ho?

È stato utile?

Soluzione

Hai provato in esecuzione l'SQL in studio gestione e vedere cosa succede?

Altri suggerimenti

Hai pensato di usare una query con parametri? Questo risolverebbe il problema, e la resa maggiore sicurezza nel caso in cui le condizioni WHERE sono tratte da input dell'utente.

Esempio (VB.NET):

Dim myCmd As New SqlCommand(CmdText, myConn)
myCmd.Parameters.AddWithValue("MemberID", 144)
myCmd.Parameters.AddWithValue("Timestamp", DateTime.Now)

Utilizzato con questo testo di query (SQL):

SELECT key FROM ubis WHERE MemberID = @MemberID
AND @Timestamp BETWEEN From AND To

Off-topic:. La parola chiave BETWEEN in SQL è solo un modo pulito per esprimere le condizioni >= AND <=

Questo odore di una vulnerabilità SQL injection. Tale data non ha per caso venuto da parte dell'utente (anche indirettamente), lo ha fatto? Anche se questo è sicuro, funzioni generiche come 'GetDataTable ()' che non rappresentano buoni parametri di query sono quasi sempre un errore.

Si desidera qualcosa di più simile a questo:

Public Shared Function GetMemberKeys(ByVal MemberID As Integer, ByVal KeyDate As DateTime) As DataTable

    Static sql As String= _
         "SELECT key" _
      + " FROM ubis" _ 
      + " WHERE MemberID= @MemberID AND @KeyDate BETWEEN [FROM] AND [TO]"

    Dim dt As New DataTable()
    Using cn As New SqlConnection(ConfigurationManager.ConnectionStrings("Conn").ConnectionString), _
          cmd As New SqlCommand(sql, cn)

        cmd.Parameters.Add("@MemberID", SqlDbType.Int).Value = MemberID
        cmd.Parameters.Add("@KeyDate", SqlDbType.DateTime).Value = KeyDate

        cn.Open()
        Using rdr As SqlDataReader = cmd.ExecuteReader()
             dt.Load(rdr)
        End Using
    End Using
    Return dt
End Function

2009/11/7 è ambigua -? È che 11 luglio o il 7 novembre

SQL non ha modo di dire - e dipende dalle impostazioni predefinite che è stato configurato con. Sarebbe meglio passare la data in un formato inequivocabile:

SELECT key FROM ubis WHERE MemberID = '144' 
               AND To >='11 July 2009 9:11:23 pm' 
               AND From <= '11 July 2009 9:11:23 pm'

In alternativa, utilizzare la conversione corretta con la , o un personalizzato uno , come suggerito da Zyphrax :

SELECT key FROM ubis WHERE MemberID = '144'
       AND To >= CONVERT(datetime, '11/7/2009 9:11:23 pm', 105)
       AND From <= CONVERT(datetime, '11/7/2009 9:11:23 pm', 105)

È possibile utilizzare il comando Convert per convertire il char a datetime.

SELECT key FROM ubis WHERE MemberID = '144'
           AND To >= CONVERT(datetime, '11/7/2009 9:11:23 pm', 105)
           AND From <= CONVERT(datetime, '11/7/2009 9:11:23 pm', 105)

Non sono sicuro circa il 105, si potrebbe avere a Google per il codice del formato giusto.

Inoltre se il codice SQL rileva un'eccezione, la connessione non verrà chiuso. Si potrebbe desiderare di aggiungere un po 'di utilizzare il codice per risolvere questo problema.

Public Shared Function GetDataTable(ByVal CmdText As String) As DataTable        
 Using myConn As New SqlConnection(ConfigurationManager.ConnectionStrings("Conn").ConnectionString)
   Using myCmd As New SqlCommand(CmdTxt, myConn)
     conn.Open()
       Using myReader As SqlDataReader = myCmd.ExecuteReader()
           Dim myTable As New DataTable()
           myTable.Load(myReader)
           myConn.Close()
           Return (myTable)  
      End Using
     End Using
End Function
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top