2017-04-24 45 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; 
     }