WebプロジェクトとNserviceBusホストでホストされるクラスライブラリで次のコードを実行しています。SqlConnectionはWebプロジェクトとNserviceBusのホストサービスで異なる動作をします
public static TravellerChannelModel GetTravellerInfo(Guid travellerId)
{
using (var conn = new SqlConnection(_travellerConnectionString))
{
var repo = new TravellerChannelRepository(_log, conn);
var travellerModel = repo.FindAll(travellerId).FirstOrDefault();
return travellerModel;
}
}
ウェブプロジェクトでは正常に動作します。クラスライブラリでは、私は例外
ServiceBus.Unicast.Transport.TransportReceiverを取得するメッセージ のSystem.InvalidOperationExceptionの処理に失敗しました:のExecuteReaderはオープンと 利用可能な接続が必要です。接続の現在の状態は閉じられています。 System.Data.SqlClient.SqlCommand.ValidateCommand(文字列の方法、ブール 非同期)で ...
私は右の "使用" した後
conn.Open();
を追加した場合、それが動作します。誰もその理由を知っていますか?
UPDATE:
ここTravellerChannelRepositoryです。 SqlDataAdapterが使用されていませんでした。
データを照会して変更する前に接続を開く必要があることは知っています。この場合、私は明示的にそれを行うのではなく、接続を開くのは不思議です。
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using Dapper;
using DapperExtensions;
using log4net;
namespace Traveller
{
public class TravellerChannelRepository
{
private readonly ILog _log;
private readonly IDbConnection _connection;
public TravellerChannelRepository(ILog log, IDbConnection connection)
{
_log = log;
_connection = connection;
}
public IEnumerable<TravellerChannelModel> FindAll(Guid travellerId)
{
IFieldPredicate predicate = Predicates.Field<TravellerChannelModel>(x => x.TravellerId, Operator.Eq, travellerId);
return _connection.GetList<TravellerChannelModel>(predicate);
}
}
}
あなたは*使用する前に常に*接続を開く必要があります - あなたのウェブアプリケーションではうまくいくと思います.....使用する前に接続を開く*接続の習慣に入ります。あなたが完了した後すぐにそれを閉じる –
ええ。私はそれに入る - TravellerChannelRepositoryが接続を開かなければ、どこに関係なく、単にコードが壊れているので、Webプロジェクトでのあなたの主張は疑わしい。使用前に接続を開かなければなりません。 – TomTom