2015-05-26 15 views
1

我從下面的代碼,這對節目表數據數據是在我的情況下,空在我的List.Add

數據是空的書面得到一個錯誤。無法在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

它比''reader''中的數據更有可能比你指出的特定行更有可能。這一行技術上繼續到'});' – 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

我認爲問題在於將十進制類型轉換爲雙精度型。 如果21和22的值返回DbNull,則不能將該類型轉換爲double。我建議:

  1. 確保索引21和22處的值返回有效的十進制數。您可以在sql查詢中使用IsNull()函數來執行此操作。
  2. 嘗試使用reader.GetDouble(21)和reader.GetDouble(22)來代替類型轉換,如果您的意圖是獲得double值。

或者,您也可以通過做提取物的小調試該對象的初始化代碼爲較小的部分:

 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和decimal是不同的。我使用雙數來計算數學或分數;貨幣數據類型的十進制數,在財務計算中提供更高的準確性。 –

+0

啊。好的..所以我會用非貨幣和小數的雙重貨幣? – Mijevoli

相關問題