예제 #1
0
 protected virtual void SyncRequestedPage(PageRequest request, ViewPage page, DbConnection connection)
 {
     if (((request.SyncKey == null) || (request.SyncKey.Length == 0)) || (page.PageSize < 0))
         return;
     List<DataField> keyFields = new List<DataField>();
     foreach (DataField field in page.Fields)
         if (field.IsPrimaryKey)
             keyFields.Add(field);
     if ((keyFields.Count > 0) && (keyFields.Count == request.SyncKey.Length))
     {
         DbCommand syncCommand = CreateCommand(connection);
         ConfigureCommand(syncCommand, page, CommandConfigurationType.Sync, null);
         bool useSkip = (_serverRules.EnableResultSet || SupportsSkipInSelect(syncCommand));
         if (!(useSkip))
             for (int i = 0; (i < keyFields.Count); i++)
             {
                 DataField field = keyFields[i];
                 DbParameter p = syncCommand.CreateParameter();
                 p.ParameterName = String.Format("{0}PrimaryKey_{1}", _parameterMarker, field.Name);
                 AssignParameterValue(p, field.Type, request.SyncKey[i]);
                 syncCommand.Parameters.Add(p);
             }
         DbDataReader reader;
         if (_serverRules.EnableResultSet)
             reader = ExecuteResultSetReader(page);
         else
             reader = syncCommand.ExecuteReader();
         if (!(useSkip))
         {
             if (reader.Read())
             {
                 long rowIndex = Convert.ToInt64(reader[0]);
                 page.PageIndex = Convert.ToInt32(Math.Floor((Convert.ToDouble((rowIndex - 1)) / Convert.ToDouble(page.PageSize))));
                 page.PageOffset = 0;
             }
         }
         else
         {
             long rowIndex = 1;
             List<int> keyFieldIndexes = new List<int>();
             foreach (DataField pkField in keyFields)
                 keyFieldIndexes.Add(reader.GetOrdinal(pkField.Name));
             while (reader.Read())
             {
                 int matchCount = 0;
                 foreach (int primaryKeyFieldIndex in keyFieldIndexes)
                     if (Convert.ToString(reader[primaryKeyFieldIndex]) == Convert.ToString(request.SyncKey[matchCount]))
                         matchCount++;
                     else
                         break;
                 if (matchCount == keyFieldIndexes.Count)
                 {
                     page.PageIndex = Convert.ToInt32(Math.Floor((Convert.ToDouble((rowIndex - 1)) / Convert.ToDouble(page.PageSize))));
                     page.PageOffset = 0;
                     page.ResetSkipCount(false);
                     break;
                 }
                 else
                     rowIndex++;
             }
         }
         reader.Close();
     }
 }
예제 #2
0
 DbDataReader ExecuteResultSetReader(ViewPage page)
 {
     if (_serverRules.ResultSet == null)
         return null;
     SelectClauseDictionary expressions = new SelectClauseDictionary();
     foreach (DataColumn c in _serverRules.ResultSet.Columns)
         expressions[c.ColumnName] = c.ColumnName;
     if (page.Fields.Count == 0)
     {
         PopulatePageFields(page);
         EnsurePageFields(page, null);
     }
     DataView resultView = new DataView(_serverRules.ResultSet);
     resultView.Sort = page.SortExpression;
     using (DbConnection connection = CreateConnection(false))
     {
         DbCommand command = connection.CreateCommand();
         StringBuilder sb = new StringBuilder();
         _resultSetParameters = command.Parameters;
         expressions.Add("_DataView_RowFilter_", "true");
         AppendFilterExpressionsToWhere(sb, page, command, expressions, String.Empty);
         string filter = sb.ToString();
         if (filter.StartsWith("where"))
             filter = filter.Substring(5);
         filter = Regex.Replace(filter, (Regex.Escape(_parameterMarker) + "\\w+"), DoReplaceResultSetParameter);
         resultView.RowFilter = filter;
         if (page.PageSize > 0)
             page.TotalRowCount = resultView.Count;
     }
     if (RequiresPreFetching(page))
         page.ResetSkipCount(true);
     return resultView.ToTable().CreateDataReader();
 }