Conversione non riuscita durante la conversione di datetime dalla stringa di caratteri
-
12-09-2019 - |
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?
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