4

Visual Studio、postgresqlデータベース、ado.netエンティティデータモデルを使用しています。接続文字列で、設定できませんMultipleActiveResultSets=True

通常、を使用してSQL Serverに接続するとMultipleActiveResultSets=True、正常に機能します。しかし、postgresqlデータベースで同じように設定することはできません。

これを使用すると、次のエラーが発生しました

このコマンドに関連付けられている開いているDataReaderがすでにあり、最初に閉じる必要があります。

この問題を解決するにはどうすればよいですか。

4

2 に答える 2

11

複数のアクティブな結果セット(MARS)は、SQL Server 2005で導入された機能であり、postgresなどの他のデータベースシステムでは使用できないため、接続文字列でオンにすることはできません。

直面しているエラーは、1つのオープンデータリーダーで2つのクエリを実行しようとした結果です。ie Entity Frameworkを使用する場合、これは通常、遅延読み込みがオンになっていて、遅延プロパティが親エンティティと同じリーダーに読み込まれるときに発生します。たとえば、これに類似したコードは次のエラーを生成する可能性があります。

var users = context.Users.Where(u => u.FirstName.StartsWith("Ha"));
foreach (var user in users)
{
    Console.WriteLine(user.Address.StreetName);
}

1行目では、Linqクエリのみを準備しているため、データはフェッチされません。開始すると、foreachaDataReaderが開かれ、条件に一致するユーザーのコレクションが照会されますが、リーダーは閉じられません。次に、内部foreachで遅延読み込みされているUserのAddressプロパティに到達します。この遅延読み込みにより、同じオープンでクエリが実行されDataReader、例外が発生します。エラーを取り除きたい場合はToList()、次のように行の最後に(またはクエリを実行させるもの)を追加するだけです。

var users = context.Users.Where(u => u.FirstName.StartsWith("Ha")).ToList();

これがお役に立てば幸いです。

于 2012-01-10T21:29:59.630 に答える
6

postgresQL接続文字列にpreloadreader=trueを追加するだけです。

  <connectionStrings>

    <add name="PostgresQL Npgsql" connectionString="server=srvubuntu01;user id=postgres;password=postgres;database=WinUnified;preload reader=true" providerName="Npgsql" />

  </connectionStrings>
于 2015-07-20T09:56:40.067 に答える