Выполнение нескольких запросов

Я использую OleDB для выполнения своих запросов на C#,

Есть ли способ выполнить несколько запросов в одном операторе команды?

Я пытался разделить их точкой с запятой (;), но выдает ошибку "Найдены символы в конце"

Мне нужно выполнить несколько сотен запросов одновременно.

Изменить: я выполняю операторы вставки.


person smartali89    schedule 01.05.2010    source источник
comment
Связанный с этим вопрос в основном касается хранимых процедур. Не помогло.   -  person smartali89    schedule 01.05.2010
comment
Хорошо написанный вопрос. Я ожидал, что это будет для меня кошмаром, пытаясь найти в Google эту конкретную проблему, но это был первый результат. Спасибо!   -  person Michael Lang    schedule 14.04.2011


Ответы (4)


Невозможно объединить запросы в рамках одной 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 вы подключаетесь, вы можете использовать это. Но будьте осторожны, это может быть так же медленно, как вставка записей по одной.

person Codesleuth    schedule 01.05.2010
comment
Пример SQL не работает с базой данных Access: Синтаксическая ошибка (отсутствует оператор) в выражении запроса (Provider=Microsoft.Jet.OLEDB.4.0) - person JohnB; 15.08.2012

Просто объедините их в пакет, используя 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.

person Johannes Rudolph    schedule 01.05.2010
comment
GO применяется только к Microsoft SQL Server Management Studio. Он используется для разделения операторов и, следовательно, не будет работать при использовании OleDbCommand. - person Codesleuth; 01.05.2010
comment
GO можно использовать при выполнении вашего оператора через sp_executesql. - person Johannes Rudolph; 01.05.2010

Используйте 1_.

См. ">мой ответ в другом вопросе, где я привожу пример использования sp_executesql для пакетной отправки SQL-запросов.

person Amry    schedule 01.05.2010

Я хотел выполнить несколько операторов SQL в базе данных Access, используя OleDB для проекта, над которым я работаю, и я не смог найти ничего подходящего для моей ситуации, поэтому я придумал это решение, которое в основном разбивает строку 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();
}

Надеюсь, это поможет кому-то.

person 41686d6564    schedule 04.04.2018