【问题标题】:Execute multiple queries执行多个查询
【发布时间】:2010-05-01 15:41:38
【问题描述】:

我正在使用 OleDB 在 C# 中执行我的查询,

有什么方法可以在一个命令语句中执行多个查询?

我尝试用分号 (;) 分隔它们,但它给出错误“字符在末尾找到”

我必须一次执行数百个查询。

编辑:我正在执行插入语句。

【问题讨论】:

  • 相关问题基本上是针对存储过程的。没有帮助。
  • 写得很好的问题。我希望它对我来说是一场噩梦,试图用谷歌搜索这个特定的问题,但这是第一个结果。谢谢!

标签: c# sql oledb oledbcommand


【解决方案1】:

无法在一个OleDbCommand 中组合查询。如果可能,请创建一个存储过程,否则您将不得不坚持在服务器上触发许多 OleDbCommand。

值得注意的是,默认情况下,OleDbConnection 启用了连接池:

当您使用 .NET Framework 数据时 OLE DB 的提供程序,您没有 启用连接池,因为 提供者管理这个 自动。

编辑:

试试这样的:

INSERT INTO myTable ( Column1, Column2, Column3 )
SELECT 'Value1', 1, 'Value3'
UNION
SELECT 'Value1', 2, 'Value3'
UNION
SELECT 'Value1', 3, 'Value3'
UNION
SELECT 'Value1', 4, 'Value3'

根据您连接到的 OleDb 提供程序,您可能可以使用它。但请注意,它可能会像一条一条地插入记录一样慢。

【讨论】:

  • 示例 SQL 不适用于 Access 数据库:“查询表达式中的语法错误(缺少运算符)”(Provider=Microsoft.Jet.OLEDB.4.0)
【解决方案2】:

使用 GO(对批处理进行分组)和冒号将它们简单地批处理以分隔批处理中的查询。确保用空格包围你的结肠。您需要将此 SQL 提交给 sp_executesql。

BEGIN TRANSACTION
GO
USE AdventureWorks;
GO
CREATE TABLE dbo.mycompanies
(
 id_num int IDENTITY(100, 5),
 company_name nvarchar(100)
)
GO
INSERT mycompanies (company_name)
   VALUES (N'A Bike Store');
INSERT mycompanies (company_name)
   VALUES (N'Progressive Sports');
INSERT mycompanies (company_name)
   VALUES (N'Modular Cycle Systems');
INSERT mycompanies (company_name)
   VALUES (N'Advanced Bike Components');
INSERT mycompanies (company_name)
   VALUES (N'Metropolitan Sports Supply');
INSERT mycompanies (company_name)
   VALUES (N'Aerobic Exercise Company');
INSERT mycompanies (company_name)
   VALUES (N'Associated Bikes');
INSERT mycompanies (company_name)
   VALUES (N'Exemplary Cycles');
GO

SELECT id_num, company_name
FROM dbo.mycompanies
ORDER BY company_name ASC;
GO
COMMIT;
GO

示例取自MSDN

【讨论】:

  • GO 仅适用于 Microsoft SQL Server Management Studio。它用于分解语句,因此在使用 OleDbCommand 时不起作用
  • 通过 sp_executesql 执行语句时可以使用 GO。
【解决方案3】:

使用sp_executesql

请参阅my answer in another question,其中包含sp_executesql 的示例用法,用于批量发送 SQL 查询。

【讨论】:

    【解决方案4】:

    我想在一个 Access 数据库中使用 OleDB 为我正在从事的项目执行多个 SQL 语句,但我找不到任何适合我的情况的解决方案,所以我想出了这个解决方案,基本上将 SQL 字符串分解为多个 SQL 语句,并在一个事务中执行:

    string sql = GetMultiStatementSqlString();
    string[] sqlStatements = sql.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
    using (OleDbConnection conn = new OleDbConnection(connStr))
    {
        conn.Open();
        OleDbTransaction transaction = conn.BeginTransaction();
        foreach (string statement in sqlStatements)
        {
            using (OleDbCommand cmd = new OleDbCommand(statement, conn, transaction))
            {
                cmd.ExecuteNonQuery();
            }
        }
        transaction.Commit();
    }
    

    希望对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-01-09
      • 2012-12-29
      • 1970-01-01
      • 2020-02-20
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多