none
Procedimiento almacenado en SQLserver problema al intentar convertir varchar a datetime RRS feed

  • Pregunta

  • Buenas Compañeros como vamos...

    Estoy intentando ejecutar un procedimiento almacena desde vB.net 2010 con la siguiente funcion

    Public Shared Function SelectDriverQualifications(ByVal iCodUser As String, ByVal iCustomer As String,
            ByVal dcListEventInOuts As Dictionary(Of Integer, String), ByVal dcListEventField As Dictionary(Of Integer, String),
            ByVal sFieldPoint As String, ByVal dStart As DateTime, ByVal dEnd As DateTime) As DataTable

            Dim sEventos As String = String.Join(",", dcListEventInOuts.Keys)
            If Not sEventos = "" Then
                sEventos += "," + String.Join(",", dcListEventField.Keys) + ","
            End If

            Dim dt As New DataTable, sqlcmd As SqlCommand, db As Database = DatabaseFactory.CreateDatabase()
            sqlcmd = db.GetStoredProcCommand("WC_GetHistoricalForQualificationDriver")
            sqlcmd.Parameters.Add(New SqlParameter("@CodUser", Str(iCodUser)))
            sqlcmd.Parameters.Add(New SqlParameter("@Customer", Str(iCustomer)))
            sqlcmd.Parameters.AddWithValue("@FHInicio", Convert.ToString(dStart))
            sqlcmd.Parameters.AddWithValue("@FHFinal", Convert.ToString(dEnd))
            sqlcmd.Parameters.Add(New SqlParameter("@NEventos", sEventos))
            dt.Load(db.ExecuteReader(sqlcmd))
            Return dt

    iCodUser="15"

    iCustomer="1184"

    dStart= 8/1/2013

    dEnd= 8/18/2013 11:59:59 PM

    sEventos = 41,42,33,49,35,45,43,51,37,39,34,50,36,46,44,52,38,40,

    y en mi procedimiento almacenado tengo esto 

    USE [AZSmart]
    GO
    /****** Object:  StoredProcedure [dbo].[WC_GetHistoricalForQualificationDriver]    Script Date: 09/18/2013 12:29:23 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER OFF
    GO
    -- =============================================
    -- Author: <Angel Sanchez>
    -- Create date: <8/09/2013>
    -- Description: <Get Historical Qualification For Driver>
    -- =============================================
    ALTER PROCEDURE [dbo].[WC_GetHistoricalForQualificationDriver]
    (
    @CodUser AS VARCHAR(4),
    @Customer  AS VARCHAR(5),
    @FHInicio As varchar(max),
    @FHFinal AS varchar(max),
    @NEventos AS Varchar(Max)

    )
    AS
    BEGIN

    Declare @Query AS Nvarchar(MAX);

    Set @Query = 
    N'SELECT 
    TA.FHServer,  
    C.Nombres,
    C.Apellidos, 
    C.Cedula, 
    TA.ID, 
    TA.NEvento, 
    TA.Velocidad, 
    TA.FuenteGps 
    FROM Conductores  AS C  
    INNER JOIN  TransConductor AS TC ON TC.CodConductorInc = C.CodConductorInc  
    INNER JOIN TransAvl AS TA ON TA.Ticket=TC.Ticket  
    WHERE TA.CodUser = '+@CodUser+ ' And TA.CodClienteInc =  '+@Customer+ ' 
    AND FHServer BETWEEN convert(datetime,'+@FHInicio+', 103) and convert(datetime,'+@FHFinal+', 103)
    AND TA.NEvento IN ('+@NEventos + '255,256,257,258,15,31,32) ORDER BY TA.Ticket'

    EXEC (@Query);

    END

    Pero al ejecutar la funcioon desde el depurador de VB.net 2010 me arroja el siguiente error 

    Sintaxis incorrecta cerca de '12'.

    y desde el depurador de SQL ejecuto esta consulta 

    EXEC WC_GetHistoricalForQualificationDriver '15','1184','8/1/2013','8/18/2013 11:59:59 PM','41,42,33,49,35,45,43,51,37,39,34,50,36,46,44,52,38,40,'

    y me sale este error 

    Mens. 102, Nivel 15, Estado 1, Línea 14
    Sintaxis incorrecta cerca de '11'.

    Ya intente cambiar una parte del codigo de VB.Net 2010

    sqlcmd.Parameters.AddWithValue("@FHInicio", SqlDbType.DateTime).Value=Convert.ToDateTime(dStart)

    sqlcmd.Parameters.AddWithValue("@FHFinal", SqlDbType.DateTime).Value=Convert.ToDateTime(dEnd)

    y siguen saliendo un error 

    Sintaxis incorrecta cerca de '1'

    Agradezco la ayuda ya que he buscado y he probado con el cast con el convert y demas opciones,, Agradezco la orientacion 

    jueves, 19 de septiembre de 2013 14:29

Todas las respuestas

  • hola

    en el procedure defines la fecha como @FHInicio As varchar(max),

    eso claramente no es un datetime, por eso me pregunto no deberias definirlo como datetime y asi poder aplicar el between usando

    [ADO.NET] Filtrar rango de fechas

    analiza el articulo alli filtro por un rango de fechas y estas se definen como datetime

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 19 de septiembre de 2013 17:36
  • PROBE TU CODIGO LEANDRO PERO CUANDO LO EJECUTO ME SALE ESTE ERROR DESDE EL VISUAL

    Error al convertir una cadena de caracteres en fecha y/u hora.

     

    MIRA EL CODIGO QUE TENGO EN VISUAL 

    Public Shared Function SelectDriverQualifications(ByVal iCodUser As String, ByVal iCustomer As String,
            ByVal dcListEventInOuts As Dictionary(Of Integer, String), ByVal dcListEventField As Dictionary(Of Integer, String),
            ByVal sFieldPoint As String, ByVal dStart As DateTime, ByVal dEnd As DateTime) As DataTable

            Dim sEventos As String = String.Join(",", dcListEventInOuts.Keys)
            If Not sEventos = "" Then
                sEventos += "," + String.Join(",", dcListEventField.Keys) + ","
            End If

            Dim dt As New DataTable, sqlcmd As SqlCommand, db As Database = DatabaseFactory.CreateDatabase()
            sqlcmd = db.GetStoredProcCommand("WC_GetHistoricalForQualificationDriver")
            sqlcmd.Parameters.Add(New SqlParameter("@CodUser", Str(iCodUser)))
            sqlcmd.Parameters.Add(New SqlParameter("@Customer", Str(iCustomer)))
            sqlcmd.Parameters.AddWithValue("@FHInicio", SqlDbType.DateTime).Value = Convert.ToDateTime(dStart)
            sqlcmd.Parameters.AddWithValue("@FHFinal", SqlDbType.DateTime).Value = Convert.ToDateTime(dEnd)
            sqlcmd.Parameters.Add(New SqlParameter("@NEventos", sEventos))
            'sqlcmd.Parameters.Add("@NEventos", SqlDbType.VarChar).Value = Convert.ToString(sEventos)
            dt.Load(db.ExecuteReader(sqlcmd))
            Return dt

    dStart=#8/1/2013#

    dEnd = #8/18/2013 11:59:59 PM#

    sEventos="41,42,33,49,35,45,43,51,37,39,34,50,36,46,44,52,38,40,"

    Y ESTE ES EL PROCEDIMIENTO EN SQL 

    USE [AZSmart]
    GO

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER OFF
    GO

    ALTER PROCEDURE [dbo].[WC_GetHistoricalForQualificationDriver]
    (
    @CodUser AS NVARCHAR(4),
    @Customer  AS NVARCHAR(5),
    @FHInicio As datetime,
    @FHFinal AS datetime,
    @NEventos AS NVarchar(Max)

    )
    AS
    BEGIN

    Declare @Query AS Nvarchar(MAX);

    Set @Query = 
    N'SELECT 
    TA.FHServer,  
    C.Nombres,
    C.Apellidos, 
    C.Cedula, 
    TA.ID, 
    TA.NEvento, 
    TA.Velocidad, 
    TA.FuenteGps 
    FROM Conductores  AS C  
    INNER JOIN  TransConductor AS TC ON TC.CodConductorInc = C.CodConductorInc  
    INNER JOIN TransAvl AS TA ON TA.Ticket=TC.Ticket  
    WHERE TA.CodUser = '+@CodUser+ ' And TA.CodClienteInc =  '+@Customer+ ' 
    AND FHServer BETWEEN CAST (CONVERT(CHAR(8),'+@FHInicio+',112) AS INT) AND CAST (CONVERT(CHAR(8),'+@FHFinal+',112) AS INT)
    AND TA.NEvento IN ('+@NEventos + '255,256,257,258,15,31,32) ORDER BY TA.Ticket'

    PRINT @Query;
    EXEC  @Query;

    END



    jueves, 19 de septiembre de 2013 18:09