public DataSet MultiShardQuery(string commandText)
 {
     DataSet _ds = new DataSet();
     try
     {
         RetryPolicy.DefaultExponential.ExecuteAction(() =>
         {
             using (MultiShardCommand cmd = new MultiShardConnection(lsm.GetShards(), shardConnectionString).CreateCommand())
             {
                 cmd.CommandText = commandText;
                 cmd.CommandType = CommandType.Text;
                 cmd.ExecutionOptions = MultiShardExecutionOptions.None;
                 //04/23/2015 by Mark Berman - switched to Partial results versus CompleteResults as timeout exception was being thrown
                 cmd.ExecutionPolicy = MultiShardExecutionPolicy.PartialResults;
                 using (MultiShardDataReader sdr = cmd.ExecuteReader())
                 {
                     if (sdr.Read())
                     {
                         // the multi-shard query does not return a dataset or datarow.
                         // we have to manually re-create a table structure, then fill it with data.
                         object[] sqlValues = new object[sdr.FieldCount];
                         sdr.GetSqlValues(sqlValues);
                         DataTable dtValues = new DataTable();
                         foreach (var column in sqlValues)
                             dtValues.Columns.Add(new DataColumn { DataType = column.GetType() });
                         _ds.Tables.Add(dtValues);
                         _ds.Tables[0].Rows.Add(sqlValues);
                         while (sdr.Read())
                         {
                             sdr.GetSqlValues(sqlValues);
                             _ds.Tables[0].Rows.Add(sqlValues);
                         }
                     }
                 }
             }
         });
     }
     catch { _ds = null; }
     return _ds;
 }