Множественный набор результатов из SQL через LiNQ - PullRequest
0 голосов
/ 22 июня 2011

У меня есть хранимая процедура как

pr ___ GetArchiveData

Выбрать * из ТАБЛИЦЫ1

ВЫБРАТЬ * ИЗ ТАБЛИЦЫ2

ВЫБРАТЬ * ИЗ ТАБЛИЦЫ 3

Я хочу получить этот набор результатов в наборе данных.Или получить доступ к значениям трех запросов выбора!У меня есть файл DBML, в котором при перетаскивании хранимой процедуры генерируется код следующим образом: -

global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.pr___GetArchiveData")]
    public ISingleResult<pr___GetArchiveDataResult> pr___GetArchiveData([global::System.Data.Linq.Mapping.ParameterAttribute(DbType="UniqueIdentifier")] System.Nullable<System.Guid> projectID)
    {
        IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), projectID);
        return ((ISingleResult<pr__Project_pr___GetArchiveData>)(result.ReturnValue));
    }

В коде MVC3 Architecture + LINQ я написал код для получения набора результатов следующим образом.: -

using (HBDataContext hb = new HBDataContext())
                {
                    System.Data.DataSet ds = new System.Data.DataSet();

                    String connString = connString;

                    var conn = new System.Data.SqlClient.SqlConnection(connString);
                    var cmd = conn.CreateCommand();

                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.CommandText = "pr__GetArchiveData";
                    cmd.Connection.Open();

                    var mReader = cmd.ExecuteReader(System.Data.CommandBehavior.SequentialAccess);
                    //var reader = cmd.ExecuteReader();

                    //using (System.Data.SqlClient.SqlDataReader mReader = cmd.ExecuteReader())
                    //{
                    //  while (mReader.Read())
                    //{
                    // mReader.Read();

                    var tbl1 = hb.Translate<tbl1 >(mReader).ToList();

                  //  mReader = cmd.ExecuteReader();

                    mReader.NextResult();
                    var tbl2 = hb.Translate<tbl2 >(mReader).ToList();

                    mReader.NextResult();
                    var tbl3 = hb.Translate<tbl3>(mReader).ToList();


                    // }
                    // }
                }

Но во время работы выдает ошибку как -

"Недопустимая попытка вызвать NextResult, когда читатель закрыт."

IЯ не уверен, где я не прав !!

Я пытался использовать его как пока

(mReader.Read ())

Пожалуйста, предложите!!!!

Ответы [ 2 ]

1 голос
/ 23 июня 2011

Генератор кода для ISingleResult не предоставит несколько наборов результатов

Попробуйте добавить собственную оболочку IMultipleResults - см. Учебное пособие в http://blogs.msdn.com/b/dditweb/archive/2008/05/06/linq-to-sql-and-multiple-result-sets-in-stored-procedures.aspx

0 голосов
/ 27 июня 2011
  1. В файле .dbml для хранимой процедуры код будет выглядеть следующим образом:

    [global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.pr__Home_GetArchiveData")] public ISingleResult<pr__Home_GetArchiveData> pr__Home_GetArchiveData([global::System.Data.Linq.Mapping.ParameterAttribute(Name="AlbumID", DbType="UniqueIdentifier")] System.Nullable<System.Guid> albumID) { IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), albumID); return ((ISingleResult<pr__Album_GetAlbumsFilesResult>)(result.ReturnValue)); }

  2. Замените его на IMultipleResult, как показано ниже `

    [global :: System.Data.Linq.Mapping.FunctionAttribute (Name = "dbo.pr__Home_GetArchiveData")] [ResultType (typeof (tbl1))]] [ResultType (typeof (tbl2)))] [ResultType (typeof (tbl3))] [ResultType (typeof (tbl4))] public IMultipleResults pr__Home_GetArchiveData ([global :: System.Data.Linq.Mapping.ParameterAttribute (Name = "HOMEID", DbType = "UniqueIdentifier")] hOMENID) {IExecuteResult result = this.ExecuteMethodCall (this, ((MethodInfo) (MethodInfo.GetCurrentMethod ())), hOMEID);return ((IMultipleResults) result.ReturnValue);}

в коде.

 using (HBDataContext hb = new HBDataContext())
                {
                    using (System.Data.Linq.IMultipleResults _results = hb.pr__Home_GetArchiveData(model.HomeID))
                    {
                        List<tbl1> _tbl1= _results.GetResult<tbl1>().ToList();
                        List<tbl2> _tbl2= _results.GetResult<tbl2>().ToList();
                        List<tbl3> _tbl3= _results.GetResult<tbl3>().ToList();
                        List<tbl4> _tbl4= _results.GetResult<tbl4>().ToList();}}

Вы получите значения запросов Select из theStoredProcedure ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...