【问题标题】:SqlDataAdapter not filling data table with SQL Where ClauseSqlDataAdapter 未使用 SQL Where 子句填充数据表
【发布时间】:2020-02-08 16:17:01
【问题描述】:

尝试使用带有WHERE 子句的SqlDataAdapter 填充数据表,但它没有返回任何内容。 SQL 命令本身从 SSMS 中返回数据,仅删除代码中的 WHERE 子句即可按预期填充数据表。

 Dim adapter As New SqlDataAdapter
 Dim datatable As New DataTable

 Using cnn As New SqlConnection(connectionString)
   cnn.Open()
   adapter = New SqlDataAdapter("SELECT * FROM [MyProjectDtbl] WHERE zipcode = 22021", cnn)
   adapter.Fill(datatable)
   adapter.Dispose()
 End Using

翻遍Select命令EventSink,发现:

无法将“System.Data.SqlClient.SqlInternalConnectionTds”类型的对象转换为“System.Data.SqlClient.SqlInternalConnectionSmi”类型

【问题讨论】:

  • 邮政编码是数据库表中名为 MyProjectDbtl 的数字字段吗?
  • 是的,邮政编码是一个整数
  • OT,该列不应该是数字类型。区号、电话号码等不是您进行数学运算的数字。它们应该是包含数字字符的文本。
  • 只是为了快速检查,如果您使用WHERE zipcode <> 22021,它会返回任何内容吗?
  • 我怀疑这个例外是一个红鲱鱼。显然它被捕获了,否则你会看到一个未处理的异常。我怀疑这发生在尝试将对象转换为一种类型的代码中,如果失败,则继续将其转换为另一种类型。抛出的异常是完全合法的,并且一直在系统代码中发生。当他们没有被抓到时,你就有问题了。

标签: sql-server vb.net


【解决方案1】:

用参数试试。

Private Sub OPCode()
    Dim dt As New DataTable
    Using cnn As New SqlConnection(connectionString),
            cmd As New SqlCommand("SELECT * FROM [MyProjectDtbl] WHERE zipcode = @zip", cnn)
        cmd.Parameters.Add("@zip", SqlDbType.Int).Value = 22021
        cnn.Open()
        dt.Load(cmd.ExecuteReader)
    End Using
    Debug.Print(dt.Rows.Count.ToString)
End Sub

【讨论】:

    猜你喜欢
    • 2021-05-20
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2020-04-13
    • 1970-01-01
    相关资源
    最近更新 更多