2012-05-11 2 views
1

Я продолжаю получать эту ошибку, потому что VendorID является нулевым для этой записи. Я видел, что этот вопрос задавали пару раз, и мне кажется, что я должен просто проверить, есть ли значение null до того, как оно преобразует его и введет в dbtable, но я не уверен, как это сделать.Невозможно наложить объект типа «System.DBNull» на тип «System.String». Ошибка

public static PartOrder findPartOrder(string orderNo) 
    { 
     PartOrder aPartOrder = new PartOrder(); 
     OleDbDataAdapter myAdapter = new OleDbDataAdapter(); 
     if (aConnection.State == ConnectionState.Closed) 
      aConnection.Open(); 
     OleDbCommand cmd = aConnection.CreateCommand(); 
     OleDbDataReader dbReader = null; 
     cmd.CommandText = "SELECT * FROM PartOrder WHERE OrderNo = '" + orderNo + "'"; 
     dbReader = cmd.ExecuteReader(); 

     while (dbReader.Read()) 
     { 
      aPartOrder.OrderNo = (string)dbReader.GetValue(0); 
      aPartOrder.Length = (string)dbReader.GetValue(1); 
      aPartOrder.Finish = (string)dbReader.GetValue(2); 
      aPartOrder.Cost = (string)dbReader.GetValue(3); 
      aPartOrder.PartDrawingNo = (string)dbReader.GetValue(4); 
      aPartOrder.VendorId = (string)dbReader.GetValue(5); 
      aPartOrder.ShopId = (string)dbReader.GetValue(6); 
      aPartOrder.Completed = (string)dbReader.GetValue(7); 
     } 

     dbReader.Close(); 
     return aPartOrder; 
    } 

Опять же, строка "aPartOrder.VendorId = (строка) dbReader.GetValue (5);" получает ошибку, потому что VendorId имеет значение NULL.

ответ

3

для этой конкретной линии попробуйте это:

aPartOrder.VendorId = dbReader.GetValue(5)==DBNull?"":dbReader.GetValue(5).value; 

лучше было бы написать вспомогательную функцию:

private static string MyToString(object o) 
{ 
    if(o == DBNull.Value || o == null) 
     return ""; 

    return o.ToString(); 
} 

и использовать его:

aPartOrder.VendorId = MyToString(dbReader.GetValue(5)); 
+0

Мне это нравится, спасибо –

0

Используйте значение OleDbDataReader.IsDBNull(ordinal) для проверки значения поля.

if(!dbReader.IsDBNull(5)) 
    aPartOrder.VendorId = dbReader.GetString(5); 

Предложения: Всегда используйте параметры/прекомпилированный оператор SQL для предотвращения SQL-Injection атаки.

cmd.CommandText = "SELECT * FROM PartOrder WHERE OrderNo = @OrderNo"; 
cmd.Parameters.Add("@OrderNo",System.Data.OleDb.OleDbType.VarChar,20).Value=orderNo; 
dbReader = cmd.ExecuteReader(); 
+0

спасибо за предложение –

+1

+1 для параметра предложение! – TheVillageIdiot

1

One Line Answe г

aPartOrder.VendorId = dbReader.IsDBNull(5) ? "" :(string)dbReader.GetValue(5); 
0

dbReader.GetValue(5).HasValue ? dbReader.GetValue(5).ToString() : String.Empty

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