我有一个查询,它从一个视图中返回一个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
我尝试了不同的方法却没有结果
2条答案
按热度按时间50pmv0ei1#
有两件事,如果可以的话千万不要使用iif,第二,日期作为字符串应该是iso格式的(YYYYMM did)
另外,这是一种情况,在这种情况下,您实际上不需要参数,您正在处理一个日期,可以将其格式化,并直接将其作为sql文本的一部分,尽管我没有这样做。
ttcibm8c2#
既然你提到了ssms,我想你可能正在使用sqlserver。使用sql提供程序
最好将数据库对象保持在使用它们的方法的本地,这样可以确保它们已关闭并被释放(它们可能使用的是在其应用程序中发布的非托管资源
.Dispose
方法)Using...End Using
即使有错误,块也能保证这一点。在这个示例代码中,连接和命令都在一个using块中。注意第一行末尾的逗号Using
.可以将连接字符串直接传递给连接的构造函数。
将参数用于
.Add
方法指定SqlDbType
所以服务器知道会发生什么。您正在传入.netDate
这样就不需要格式化任何字符串。阿多会帮你解决的。如果出于某种原因需要使用odbc,只需将sql类型替换为odbc即可。
他回来了
DataTable
可直接用作.DataSource
为了一个DataGridView
在winforms中。