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 中无效