2016-07-22 6 views
0

Я пытаюсь использовать Postgres Plus 9.5 с .Net 4.5, Npgsql 3.1.6. Пакет NuGet. Я прочитал, что здесь об этой ошибке, но я не понимаю, почему я это понял. Все расположено. Здесь приведен код:«Операция уже выполняется» на DataAdaper.Fill

public override DataTable getActListData(int FunkNr) 
{ 
    using (var cmd = new NpgsqlCommand()) 
    { 
    cmd.CommandText = npgsqlCommand3.CommandText; 
    cmd.Connection = this.npgsqlConnection; 
    cmd.Parameters.Add(new Npgsql.NpgsqlParameter("ANWENDUNG", NpgsqlTypes.NpgsqlDbType.Numeric)); 
    cmd.Parameters.Add(new Npgsql.NpgsqlParameter("XFUNKNR", NpgsqlTypes.NpgsqlDbType.Numeric)); 


    using (var da = new NpgsqlDataAdapter(npgsqlCommand3)) 
    { 
     var tab = new DataTable(); 
     da.SelectCommand.Parameters["ANWENDUNG"].Value = getAnwendung(); 
     da.SelectCommand.Parameters["XFUNKNR"].Value = FunkNr; 
     da.Fill(tab); // Here is the error on the 5th call 
     return tab; 
    } 
    } 
} 

Эта проблема возникает из Npgsql или из Postgres?

Некоторые другие вопросы:

Я прочитал здесь, что ленивая загрузка невозможна, но я не понимаю, из-за Npgsql или Postgres?

Возможно ли в Postgres открыть несколько курсоров и прочитать по запросу в том же соединении?

Edit: Изменен код:

using (var npgsqlConnection = new NpgsqlConnection()) 
    { 
    ConnectionString = string.Format(DataClientFactory.DataBaseConnectString, DB, User, PW); 
    npgsqlConnection.ConnectionString = ConnectionString; 
    npgsqlConnection.Open(); 
    .... 
    the code above here 
    .... 
} 

Та же ошибка в одном вызове. Ошибка:

System.InvalidOperationException occurred 
    HResult=-2146233079 
    Message=An operation is already in progress. 
    Source=Npgsql 
    StackTrace: 
     bei Npgsql.NpgsqlConnector.StartUserAction(ConnectorState newState) 
    InnerException: 
+0

Ваш код кажется, ОК, но что-то вне вашего образца может получить доступ к 'this.npgsqlConnection' ... Вам нужно внимательно следить за всеми видами использования соединения. Обратите внимание, что стандартная практика - просто открывать новые подключения и закрывать их для каждой операции - объединение пулов гарантирует, что влияние производительности не будет. –

+0

Что касается нескольких запросов на одном и том же соединении (я предполагаю, что это то, что вы подразумеваете под ленивой загрузкой) ... Npgsql не позволяет вам одновременно открывать несколько читателей * в одном и том же соединении. Эта возможность иногда называется MARS (несколько активных наборов результатов) и поддерживается SqlClient. Тем не менее, вы все равно можете использовать курсоры PostgreSQL самостоятельно и открывать несколько курсоров, каждый раз извлекая часть набора результатов. Вам решать это. –

+0

@ShayRojansky Перемещение происходит из Oracle, и я должен использовать тот же сеанс (соединение). Существуют переменные пакета, используемые между вызовами. – Mottor

ответ

0

Если кусок кода вы вывесили прогонов одновременно на одной и той же связи, то, что ваша проблема - Npgsql соединения не поточно-, и это не возможно иметь несколько читателей открыты в то же времени (MARS).

+0

У DevArt тоже нет MARS (http://forums.devart.com/viewtopic.php?f=3&t=33074&p=114288&hilit=mars#p114288). Вы сейчас, если это ограничение Postgres? – Mottor

+0

Нет одновременного доступа. Существует только один поток. Все читатели используют() – Mottor

+0

Попробуйте создать и открыть свой NpgsqlConnection в своей функции (вместо this.npgsqlConnection), не забудьте также его утилизировать –

 Смежные вопросы

  • Нет связанных вопросов^_^