sql查询在ssms中工作,但在vb.net中不工作

llew8vvj  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(255)

我有一个查询,它从一个视图中返回一个datatable,它在ssms中运行得非常好,但是当我尝试在vb.net中使用它时,它返回
nvarchar数据类型转换为datetime数据类型导致值超出范围

ssms中的sql(执行时没有问题):

SELECT [Consecutivo], [Detalle], [MetodoPago], [Fecha], [Concepto], [Monto], [Recuperacion], [Usuario], [UsuarioNombre] FROM [BD_RentaEquipos].[dbo].[Cierres] WHERE datediff(day, [Fecha],'2020/05/12')=0

vb.net中的sql(不执行):

Public Function C_Cargar(Optional Fecha As Date? = Nothing) As DataTable
    Dim LeTable As New dsTablas.CierresDataTable
    AbrirConexion()
    'Dim SQL = "SELECT [Consecutivo], [Detalle], [MetodoPago], [Fecha], [Concepto], [Monto], [Recuperacion], [Usuario], [UsuarioNombre] FROM [BD_RentaEquipos].[dbo].[Cierres]" & IIf(Fecha IsNot Nothing, " WHERE datediff(day, [Fecha], '" & New String(Fecha.Value.Year & "/" & Fecha.Value.Month & "/" & Fecha.Value.Day) & "') = 0", "")
    Dim SQL = "SELECT [Consecutivo], [Detalle], [MetodoPago], [Fecha], [Concepto], [Monto], [Recuperacion], [Usuario], [UsuarioNombre] FROM [BD_RentaEquipos].[dbo].[Cierres]" & IIf(Fecha IsNot Nothing, " WHERE datediff(day, [Fecha], ? ) = 0", "")
    cmd = New OdbcCommand(SQL)
    Dim data As OdbcDataReader
    cmd.Connection = CN
    If Fecha IsNot Nothing Then
        With Fecha.Value
            cmd.Parameters.AddWithValue("@Fecha", Fecha)
            'cmd.Parameters.AddWithValue("@Fecha", New String(.Day & "/" & .Month & "/" & .Year))
        End With
    End If
    Try
        data = cmd.ExecuteReader
        While data.Read
            LeTable.Rows.Add()
            With LeTable.Rows(LeTable.Rows.Count - 1)
                .Item("Consecutivo") = data("Consecutivo")
                .Item("Detalle") = data("Detalle").ToString
                .Item("MetodoPago") = data("MetodoPago").ToString
                .Item("Fecha") = data("Fecha")
                .Item("Concepto") = data("Concepto").ToString
                .Item("Monto") = data("Monto")
                .Item("Recuperacion") = data("Recuperacion")
                .Item("Usuario") = data("Usuario")
                .Item("UsuarioNombre") = data("UsuarioNombre")
            End With
        End While
    Catch sqlerror As SqlException
        MsgBox(sqlerror.Message & Chr(13) & sqlerror.Procedure, MsgBoxStyle.Critical, "Excecion de Base de datos #" & sqlerror.Number)
        Err.Clear()
    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.Critical, "Excecion de Base de datos #" & "0x" & Hex(ex.HResult))
        Err.Clear()
    Finally
        CerrarConexion()
    End Try
    Return LeTable
End Function

我尝试了不同的方法却没有结果

50pmv0ei

50pmv0ei1#

有两件事,如果可以的话千万不要使用iif,第二,日期作为字符串应该是iso格式的(YYYYMM did)

Dim SQL = $"SELECT [Consecutivo], [Detalle], [MetodoPago], 
                   [Fecha], [Concepto], [Monto], [Recuperacion], 
                   [Usuario], [UsuarioNombre] 
            FROM [BD_RentaEquipos].[dbo].[Cierres]
            " 

cmd = New OdbcCommand()
Dim data As OdbcDataReader
cmd.Connection = CN
If Fecha IsNot Nothing Then
    SQL +=  " WHERE cast([Fecha] as date) = '?' ")
    cmd.Parameters.AddWithValue("@Fecha", Fecha.ToString("yyyy-MM-dd"))
End If
cmd.CommandText = SQL

另外,这是一种情况,在这种情况下,您实际上不需要参数,您正在处理一个日期,可以将其格式化,并直接将其作为sql文本的一部分,尽管我没有这样做。

ttcibm8c

ttcibm8c2#

既然你提到了ssms,我想你可能正在使用sqlserver。使用sql提供程序

Imports System.Data.SqlClient

最好将数据库对象保持在使用它们的方法的本地,这样可以确保它们已关闭并被释放(它们可能使用的是在其应用程序中发布的非托管资源 .Dispose 方法) Using...End Using 即使有错误,块也能保证这一点。在这个示例代码中,连接和命令都在一个using块中。注意第一行末尾的逗号 Using .
可以将连接字符串直接传递给连接的构造函数。
将参数用于 .Add 方法指定 SqlDbType 所以服务器知道会发生什么。您正在传入.net Date 这样就不需要格式化任何字符串。阿多会帮你解决的。
如果出于某种原因需要使用odbc,只需将sql类型替换为odbc即可。
他回来了 DataTable 可直接用作 .DataSource 为了一个 DataGridView 在winforms中。

Public Function C_Cargar(Optional Fecha As Date? = Nothing) As DataTable
    Dim LeTable As New DataTable
    Dim SQL = "SELECT [Consecutivo], [Detalle], [MetodoPago], [Fecha], [Concepto], [Monto], [Recuperacion], [Usuario], [UsuarioNombre] FROM [BD_RentaEquipos].[dbo].[Cierres]"
    Using cn As New SqlConnection("Your connection string"),
            cmd As New SqlCommand()
        If Fecha IsNot Nothing Then
            SQL &= " WHERE datediff(day, [Fecha], @Fecha)=0;"
            cmd.Parameters.Add("@Fecha", SqlDbType.DateTime).Value = Fecha
        End If
        cmd.CommandText = SQL
        cmd.Connection = cn
        cn.Open()
        LeTable.Load(cmd.ExecuteReader)
    End Using
    Return LeTable
End Function

相关问题