2015-05-26 6 views
1

Я получаю сообщение об ошибке с помощью следующего кода, который написал для шоу таблицы данныхДанные Null в моем случае в моем List.Add

Данные Null. Этот метод или свойство не может быть вызван значениями Null.

Итак, вот мой код, чтобы вы могли помочь мне исследовать его.

public static List<NomsPRRequest> LoadPRfromDB_withParams(DateTime from, DateTime to, string EntityID, 
     string DepartmentID) 
    { 
     string sScript = m_sReport + ((EntityID == "") ? "" : " AND d.[EntityID]=" + EntityID) + ((DepartmentID == "") ? "" : " AND d.[DepartmentID]=" + DepartmentID) 
      + " and [RequestDate] between '" + from.ToString("yyyy-MM-dd HH:mm:ss") + "' and '" + to.ToString("yyyy-MM-dd HH:mm:ss") + "'"; 
     Dictionary<long, NomsPRRequest> data = new Dictionary<long, NomsPRRequest>(); 
     long key; 
     double dAmount; 
     using (SqlConnection con = new SqlConnection(m_sConnectionString)) 
     { 
      con.Open(); 
      using (SqlCommand command = new SqlCommand(sScript, con)) 
      { 
       SqlDataReader reader = command.ExecuteReader(); 
       while (reader.Read()) 
       { 
        key = reader.GetInt64(0); 
        if (!data.ContainsKey(key)) 
        { 
         data.Add(key, new NomsPRRequest() 
         { 
          RequestID = key, 
          RequestDate = reader.GetDateTime(1), 
          PARNumber = reader.GetString(2), 
          DepartmentName = reader.GetString(10), 
          DepartmentID = reader.GetInt64(11), 
          StatusID = reader.GetInt64(3), 
          FullName = reader.GetString(7), 
          InboxLearUID = reader.GetString(12), 
          ProgramName = reader.GetString(14), 
          ItemList = new List<NomsPRItem>(), 
          TotalAmount = 0.0 
         }); 
        } 
        dAmount = (double)reader.GetDecimal(21) * (double)reader.GetDecimal(22); 
        data[key].TotalAmount += dAmount; 
        ****data[key].ItemList.Add(new NomsPRItem()**** 
        { 
         RequestID = key, 
         PartDesc = reader.GetString(17), 
         PartNumber = reader.GetString(23), 
         SupplierID = reader.GetString(18), 
         FullName = reader.GetString(7), 
         AccountType = reader.GetString(19), 
         CurrName = reader.GetString(20), 
         PartQuantity = (double)reader.GetDecimal(21), 
         PiecePrice = (double)reader.GetDecimal(22), 
         Amount = dAmount 
        }); 
       } 
      } 
     } 

     return data.Values.ToList(); 
    } 

Я получаю ошибку на этой части

данные [ключ] .ItemList.Add (новый NomsPRItem()

Вот мой взгляд ..

<table data-ng-show="models != null" class="table table-striped table-bordered table-hover" 
       id="PRTable" > 

       <tr class="titlerow"> 
        <th> 
         <a href="#" data-ng-click="sorting='RequestDate'; reverse = !reverse">PR Date <span 
          data-ng-show="sorting == 'RequestDate'"></span> 
         </a> 
        </th> 

        <th> 
         <a href="#" data-ng-click="sorting='RequestID '; reverse = !reverse">PR # <span data-ng-show="sorting == 'RequestID '"></span> 
         </a> 
        </th> 

        <th> 
         <a href="#" data-ng-click="sorting='PARNumber '; reverse = !reverse">PAR # <span 
          data-ng-show="sorting == 'PARNumber '"></span> 
         </a> 
        </th> 

        <th> 
         <a href="#" data-ng-click="sorting='ProgramName '; reverse = !reverse">Program <span 
          data-ng-show="sorting == 'ProgramName '"></span> 
         </a> 
        </th> 

        <th> 
         <a href="#" data-ng-click="sorting='FullName '; reverse = !reverse">Requestor <span 
          data-ng-show="sorting == 'FullName '"></span> 
         </a> 
        </th> 

        <th> 
         <a href="#" data-ng-click="sorting='DepartmentName '; reverse = !reverse">Department <span 
          data-ng-show="sorting == 'FullName '"></span> 
         </a> 
        </th> 


        <th> 
         <a href="#" data-ng-click="sorting='PONo'; reverse = !reverse">PO # 
         </a> 
        </th> 
        <th> 
         <a href="#" data-ng-click="sorting='StatusID '; reverse = !reverse">PRStatus<span 
          data-ng-show="sorting == 'StatusID '"></span> 
         </a> 
        </th> 
        <th> 
         <a href="#" data-ng-click="sorting='Amount '; reverse = !reverse">Total Amount<span 
          data-ng-show="sorting == 'Amount '"></span> 
         </a> 
        </th> 

        <th> 
         <a href="#" data-ng-click="sorting='InboxLearUID '; reverse = !reverse">Last Action<span 
          data-ng-show="sorting == 'InboxLearUID '"></span> 
         </a> 
        </th> 
       </tr> 


       <tr data-ng-repeat="model in models | orderBy: sorting:reverse | filter : filterAllColumns | filter : filterOptions "> 

        <td>{{jsonDatetotext(model.RequestDate) | date:'MM/dd/yyyy'}}</td> 
        <td> 
         <a href="#" data-toggle="modal" data-target="#basicModalContent" data-ng-click="getSelectedPR(model)">{{model.RequestID}} 
         </a> 
        </td> 
        <td>{{model.PARNumber }}</td> 
        <td>{{model.ProgramName }}</td> 
        <td>{{model.FullName }}</td> 
        <td>{{model.DepartmentName | uppercase}}</td> 
        <td>{{model.PONo}}</td> 
        <td>{{StatusList[model.StatusID] | uppercase}}</td> 
        <td class="totalAmount"><span class="pull-right">{{model.TotalAmount | number:2}}</span> 
        </td> 
        <td>{{model.InboxLearUID | lowercase}}</td> 
       </tr> 
      </table> 
     </div> 
     <!-- /.Modal Na ni --> 

     <div class="modal fade" id="basicModalContent" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" 
      aria-hidden="true"> 
      <div class="modal-dialog"> 
       <div class="modal-content"> 
        <div class="modal-header"> 

         <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> 
        </div> 
        <div class="modal-body" id="exportablePRItems"> 
         <div class="table-responsive"> 
          <table class="table table-striped table-bordered table-hover" id="dataTables-example"> 
           <thead> 
            <tr> 

             <th>Item Code 
             </th> 
             <th>Item Description 
             </th> 
             <th>Supplier 
             </th> 
             <th>Account 
             </th> 
             <th>Currency 
             </th> 
             <th>Amount 
             </th> 
             <th>(USD) Amount 
             </th> 
            </tr> 
           </thead> 

           <tbody data-ng-repeat="selectedPR in selectedModal.ItemList"> 

            <tr> 
             <td>{{selectedPR.PartNumber}}</td> 
             <td>{{selectedPR.PartDesc}}</td> 
             <td>{{selectedPR.SupplierID }}</td> 
             <td>{{selectedPR.AccountType}}</td> 
             <td>{{selectedPR.CurrName }}</td> 
             <td data-ng-model="amount" class="amount">{{selectedPR.Amount | number:2}}</td> 
             <td>{{selectedPR.AmountUSD}}</td> 
            </tr> 
           </tbody> 
           <tr> 
            <td><span class="pull-right"><i class="glyphicon glyphicon-plus-sign"></i></span></td> 
            <td colspan="3"><b>{{selectedModal.RequestID}}</b> </td> 
            <td colspan="1"><b>Total : </b></td> 
            <td colspan="2">{{selectedModal.ItemList | sumbykey : 'Amount' | number:2}}</td> 
           </tr> 

          </table> 

         </div> 
         <footer> 
          <br /> 
          <button data-ng-click="exportDataItems()" class="btn btn-warning"><i class="glyphicon glyphicon-export"></i>Export Item </button> 
         </footer> 
        </div> 
        <div class="modal-footer"> 

         <button id="btnModalCancel" type="button" class="btn btn-default" data-dismiss="modal"> 
          Close</button> 
        </div> 
       </div> 
      </div> 
     </div> 
    </div> 
</div> 

Может кто-нибудь, пожалуйста, помогите мне исследовать эти коды, чтобы я мог ld переходите к моим следующим шагам?

+0

Вы можете разместить код NomsPrRequest? – brijber

+0

Скорее всего, это данные в «читателе», чем конкретная строка, на которую вы указали. Эта строка технически продолжается до '});' – ethorn10

+0

Первое, что вы, возможно, захотите сделать, - это реорганизовать ваш текст SqlCommand для использования SqlParameters, эти конкатенации строк, которые вы используете, сложны, а не говорят, что это почти запретительный подход. –

ответ

1

Лучше использовать IsDBNull .. просто как этот:

     RequestID = key, 
         PartDesc = reader.IsDBNull(17) ? null : reader.GetString(17), 
         PartNumber = reader.IsDBNull(23) ? null : reader.GetString(23), 
         SupplierID = reader.IsDBNull(18) ? null : reader.GetString(18), 
         FullName = reader.IsDBNull(7) ? null : reader.GetString(7), 
         AccountType = reader.IsDBNull(19) ? null : reader.GetString(19), 
         CurrName = reader.IsDBNull(20) ? null : reader.GetString(20), 
         PartQuantity = (double)reader.GetDecimal(21), 
         PiecePrice = (double)reader.GetDecimal(22), 
         Amount = dAmount 

Я надеюсь, что это может помочь

+0

Спасибо @anaiah .. Я действительно встречал эти виды объяснений, но вы его разработали :) – Mijevoli

+0

Ну. Добро пожаловать ;) – Anaiah

2

Я думаю, что проблема заключается в том, чтобы преобразовать десятичный тип в double. Если значение 21 и 22 возвращает DbNull, вы не можете преобразовать этот тип в double. Я бы предложил:

  1. Удостоверьтесь, что значение в индексах 21 и 22 возвращает действительное десятичное число. Для этого вы можете использовать функцию IsNull() в sql-запросе.
  2. Попробуйте использовать reader.GetDouble (21) и reader.GetDouble (22) вместо преобразования типов, если вы намерены получить двойное значение.

В качестве альтернативы, вы можете сделать небольшую отладку экстрактом, что объектный код инициализации на более мелкие части:

 var npri = new NomsPRItem(); 
     npri.RequestID = key; 
     npri.PartDesc = reader.GetString(17); 
     npri.PartNumber = reader.GetString(23); 
     npri.SupplierID = reader.GetString(18); 
     npri.FullName = reader.GetString(7); 
     npri.AccountType = reader.GetString(19); 
     npri.CurrName = reader.GetString(20); 
     npri.PartQuantity = (double)reader.GetDecimal(21); 
     npri.PiecePrice = (double)reader.GetDecimal(22); 
     npri.Amount = dAmount; 

Это будет указывать вниз точно, какой индекс столбца, который вызывает проблему.

+0

Зачем использовать var? и я думаю, что getDouble и getDecimal работают одинаково. – Mijevoli

+0

О, это просто моя привычка использовать var для отладки. Мне двойные и десятичные разные. Я использую double для вычисления математики или фракций; десятичный тип данных для денег, которые обеспечивают большую точность в финансовых расчетах. –

+0

Ahh. Хорошо. Итак, я буду использовать двойной для денег и десятичных денег за деньги? – Mijevoli

Смежные вопросы