Pergunta

A seqüência de caracteres passada para a minha função personalizada é o seguinte:

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 aqui está o erro eu fico, Falha ao converter datetime da seqüência de caracteres

Eu entendo que os campos de data / hora são passados como seqüência de caracteres para a função, mas que opções eu tenho?

Foi útil?

Solução

Você já tentou executar o sql management studio e ver o que acontece?

Outras dicas

Você já pensou em utilizar uma consulta parametrizada?Isso iria resolver o seu problema, e o rendimento, maior segurança no caso em que o WHERE as condições são tomadas de entrada do usuário.

Exemplo (VB.NET):

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

Usado com este texto de consulta (SQL):

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

Off-topic:o BETWEEN palavra-chave no SQL é apenas uma maneira elegante de expressar a >= AND <= condições.

Isso cheira a uma vulnerabilidade de injeção sql.Data em que, não por acaso vir do usuário (mesmo que indiretamente), não é?Mesmo se um presente é seguro, funções genéricas como " GetDataTable ()", que não conta para o bom parâmetros de consulta são quase sempre um erro.

Você quer algo mais parecido com este:

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

11/7/2009 é ambígua - é que dia 11 de julho e 7 de novembro?

O SQL não tem nenhuma maneira de saber - e isso depende de padrões tem sido o programa de configuração com.Seria melhor passar a data em um inequívoca formato:

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'

Em alternativa, usar a conversão correta correta o formato de código, ou personalizado, como sugerido por 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)

Você pode usar o comando CONVERT para converter o char para um 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)

Eu não tenho certeza sobre o 105, talvez você precise Google para o formato certo código.

Além disso, se o seu código SQL encontra uma excepção, a sua conexão não será fechada.Você pode querer adicionar um pouco de Usar o código para corrigir isso.

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top