2017-04-24 41 views
0

從我的WCF客戶端調用服務的方法。作爲參數我通過比特的陣列是我的自定義類的序列化對象:DataContractSerializer - DBNull.Value

public class MySqlCommand 
{ 
    public string CommandText; 
    public List<object[]> Parameters; 

    public MySqlCommand() 
    { 
     Parameters = new List<object[]>(); 
    } 
    public static MySqlCommand GetSQLCommand(string CommandID) 
    { 
     MySqlCommand command = new MySqlCommand(); 
     command.CommandText = CommandID; 
     return command; 
    } 
} 

的問題是,在列表中的參數的陣列可以包含DBNull.Value,這是不通過DataContractSerializer的由支持默認。如果我將DBNull添加到支持的類型中,代碼會變慢很多,所以我無法以這種方式解決問題。我怎樣才能使它工作?

+2

你說的意思是「它會減慢了很多」?相比「即刻不工作」?它肯定會......可能弄清楚爲什麼它在工作時很慢?哦,粘貼一些代碼,你粘貼的代碼與你的問題的文本無關。 – nvoigt

回答

1

我不確定這是你想要的,但它可能有幫助。用這種方法可以檢查DataSet空值和替換它們:

public static DataSet DBNull(DataSet dataSet) 
    { 
     try 
     { 
      foreach (DataTable dataTable in dataSet.Tables) 
       foreach (DataRow dataRow in dataTable.Rows) 
        foreach (DataColumn dataColumn in dataTable.Columns) 
         if (dataRow.IsNull(dataColumn)) 
         { 
          if (dataColumn.DataType.IsValueType) dataRow[dataColumn] = Activator.CreateInstance(dataColumn.DataType); 
          else if (dataColumn.DataType == typeof(bool)) dataRow[dataColumn] = false; 
          else if (dataColumn.DataType == typeof(Guid)) dataRow[dataColumn] = Guid.Empty; 
          else if (dataColumn.DataType == typeof(string)) dataRow[dataColumn] = string.Empty; 
          else if (dataColumn.DataType == typeof(DateTime)) dataRow[dataColumn] = DateTime.MaxValue; 
          else if (dataColumn.DataType == typeof(int) || dataColumn.DataType == typeof(byte) || dataColumn.DataType == typeof(short) || dataColumn.DataType == typeof(long) || dataColumn.DataType == typeof(float) || dataColumn.DataType == typeof(double)) dataRow[dataColumn] = 0; 
          else dataRow[dataColumn] = null; 
         } 

      return dataSet; 
     } 
     catch (Exception ex) 
     { 
      return dataSet; 
     }