VB.NET 使用 SQL Server CE 一次多选

Posted

技术标签:

【中文标题】VB.NET 使用 SQL Server CE 一次多选【英文标题】:VB.NET Multiple Selects at once using SQL Server CE 【发布时间】:2013-08-13 12:39:11 【问题描述】:

我有一个数组列表,其中包含一些项目的 ID。我想从 SQL Server CE 数据库中一次执行多项选择,并使用我的数组列表,其中包含要选择的项目 id,例如在 oracle (ODP.NET) 中执行多项更新时类似的操作,如下所述:@ 987654321@

您可以将数组作为参数传递。

我也想做同样的事情,但在 SQL Server CE 的情况下是多选。有可能吗?

关于我想做的事情的草稿:

SqlCeCommand = SqlCeConnection.CreateCommand()
SqlCeCommand.CommandText = "SELECT * FROM MyTable WHERE Id=:ids"
SqlCeCommand.CommandType = CommandType.Text

SqlCeCommand.Parameters.Add(":ids", DbType.Int32, ArrayListOfIds, ParameterDirection.Input)

Using reader As System.Data.SqlServerCe.SqlCeDataReader = SqlCeCommand.ExecuteReader()
  Using targetDb As Oracle.DataAccess.Client.OracleBulkCopy = New Oracle.DataAccess.Client.OracleBulkCopy(con.ConnectionString)
    targetDb.DestinationTableName = "MyTable"
    targetDb.BatchSize = 100
    targetDb.NotifyAfter = 100
    targetDb.BulkCopyOptions = Oracle.DataAccess.Client.OracleBulkCopyOptions.UseInternalTransaction
    AddHandler targetDb.OracleRowsCopied, AddressOf OnOracleRowsCopied targetDb.WriteToServer(reader)
    targetDb.Close()
  End Using
  reader.Close()
End Using

【问题讨论】:

我们可以查看您正在使用的 SQL 版本吗?这可以帮助我们更好地了解您想要做什么。据我所知,SQL Server CE中没有多选这样的操作。 好吧,我还没有做任何事情。我有一个 id 数组列表,从中我想做的是从 SqlCe 数据库中的表中选择数组列表中的 id,但是一次执行此操作,而不是一个一个,最后,一旦我完成这个选择,我想使用数据阅读器阅读这个,以便将这些记录批量复制到 Oracle 中的一个表中。很明显,对SqlCe的select得到的结果和oracle中的表的列和类型是一样的。 【参考方案1】:

您应该通过构建“IN”子句并在 for each 循环中添加每个参数来尝试这种方法:

SqlCeCommand = SqlCeConnection.CreateCommand()

SqlCeCommand.CommandType = CommandType.Text
Dim sb As New StringBuilder()
Dim i As Integer = 1

For Each id As Integer In ArrayListOfIds
    ' IN clause
    sb.Append("@Id" & i.ToString() & ",")

    ' parameter
    SqlCeCommand.Parameters.Add("@Id" & i.ToString(), DbType.Int32, id, ParameterDirection.Input)

    i += 1
Next

【讨论】:

由于某种原因,我无法在答案中发布最后一行,所以我在这里添加它SqlCeCommand.CommandText = "SELECT * FROM MyTable WHERE Id IN (" + sb.ToString() + ")" 符号@相当于Oracle中的:,对吧?用于参数化。一件事,转换为字符串时应删除 In 子句中的最后一个字符: i.ToString().TrimEnd(",")【参考方案2】:

如果您正在调用存储过程,您可以这样做:

    将数组序列化为 XML 字符串,如下所示:https://***.com/a/6937351/734914 调用存储过程,传入字符串参数 将 XML 字符串解析为包含 ID 的本地表变量,如下所示:https://***.com/a/8046830/734914 使用 ID 执行您需要的任何查询

我引用的链接可能不是网络上最好的例子,但是“序列化为 XML,传递字符串参数,反序列化 XML”的概念在这里应该可以工作

【讨论】:

作者没有使用完整的 SQL Server,所以这不起作用。 SQL Server CE 是完整 SQL Server 的一个非常有限的子集。

以上是关于VB.NET 使用 SQL Server CE 一次多选的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 vb.net 将 excel 文件导入 sql server

是否可以一次将整个 VB.NET 数据表插入 SQL Server

使用 C#/VB.NET 实现 SQL Server Profiler

在 SQL Server Reporting Services (VB.Net) 中查找上一个日历月的第一天和最后一天

SQL 查询字符串在 SQL Server Management Studio 中有效,但在带有 SQLCommand.ExecuteReader 的 VB.net 中无效

vb.net访问sql server数据库(SqlDataReader和DataSet两种方式)