2012-02-29 90 views
1

我从我的数据库中获得一个NULL列的数据表。默认情况下,数据类型是Int32。 如果我改变了数据类型像下面这样说的:null列更改数据类型

不能更改列的数据类型,一旦有数据

_object.datatable.Columns[coll].DataType = typeof (decimal); 

有没有办法让列小数或改变代码中的数据类型?

+3

这张桌子从哪里来?你在建立记忆吗?如果是这样,请更改构建它的类型。你从数据库结果中得到它吗?如果你是,你确定它适合给它一个不同的类型? (如果是这样,是否更适合在数据库中进行更改。) – 2012-02-29 14:37:02

+0

我正在从存储过程获取数据表。我需要在用户界面中的空白列,所以得到一个像NULL'AS'测试' – user982129 2012-02-29 14:38:31

+0

如果你需要一个空白列,你不能简单地添加一个适当的类型。 'table.Columns.Add(“Test”,typeof(decimal));' – 2012-02-29 14:39:53

回答

0

您无法将整列自动转换为新的datatytpe。

decimal dec = (decimal)(int)_object.datatable[rownum][col1]; 

注:

吧的时候读它你可以将一个特定的值,如果实际值是一个Int32,你需要通过铸造为int,然后才能转换为十进制拆箱它。

+0

他有另一个问题(现在删除),他试图将3.11填充到整数列中。问题不在于读取存储。 – 2012-02-29 14:41:02

1

我偶然发现了好几次。

您有三种选择。

  1. 自己创建的列

    var table = new DataTable(); 
    table.Columns.Add("id", typeof(int)); 
    table.Columns.Add("col1", typeof(decimal)); 
    
    DataAdapter.Fill(table); 
    

如果您使用DataAdapter或DataReader的填写表格,列才会自动如果你还没有自己以前做过创建

  1. 如果您需要关系的其他数据类型,只需添加表达式列

    table.Columns.Add("col1_decimal", typeof(decimal), "col1"); 
    

该列将是只读的,但是只适用于关系工作。

  1. 添加另一列,复制数据,删除第一列,重命名新的

    table.Columns.Add("tmp", typeof(decimal)); 
    
    foreach(var row in table.Rows()) 
        row["tmp"] = row["col1"]; 
    
    table.Columns.Remove(table.Columns["col1"]); 
    table.Columns["tmp"].ColumnName = "col1"; 
    

这可能是许多行的性能瓶颈。

+0

好的,谢谢我需要一个关系,所以会增加表达 – user982129 2012-02-29 14:55:30