执行多个查询

时间:2010-05-01 15:41:38

标签: c# sql oledb oledbcommand

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

有没有办法在一个命令语句中执行多个查询?

我尝试用分号(;)分隔它们,但它给出了错误“最后找到的字符”

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

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

4 个答案:

答案 0 :(得分:1)

只需使用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

的示例

答案 1 :(得分:1)

无法在一个OleDbCommand内合并查询。如果可能的话,制作一个存储过程,否则你将不得不坚持在服务器上发射许多OleDbCommands。

但值得注意的是,默认情况下为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提供商,您可以使用此功能。但要注意,它可能与逐个插入记录一样慢。

答案 2 :(得分:0)

使用sp_executesql

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

答案 3 :(得分:0)

我想使用OleDB在Access数据库中为我正在处理的项目执行多个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();
}

希望它有所帮助。