C#数据表十进制精度

时间:2011-05-30 13:06:03

标签: c# datatable decimal

我有这个代码将新列添加到datatable:

DataColumn col = new DataColumn("column", typeof(decimal));      
col.Caption = "Column";
mytable.Columns.Add(col);

如何为此列指定小数精度,以便值始终采用我希望的格式?

3 个答案:

答案 0 :(得分:1)

你做不到。但是,您可以使用String.Format函数从表中检索值来格式化值:

String.Format("{0:0.##}", (Decimal) myTable.Rows[rowIndex].Columns[columnIndex]); 

答案 1 :(得分:1)

我自己也有同样的问题,我通过在应用启动时加载整个架构来修复它,然后根据我的需要从架构中引用列信息。

我只有一个Visual Basic示例,但希望转换为C#

非常容易

设置

' in whatever class you do your database communication:
Private _database As SqlDatabase
Private Shared _schema As DataTable

Sub New()
  ' or however you handle the connection string / database creation
  Dim connectionString as String = GetConnectionString()
  _database = New SqlDatabase(connectionString)

  RetrieveSchema()
End Sub


Private Function RetrieveSchema() as DataTable
  If _schema Is Nothing Then
    Using connection As SqlConnection = _database.CreateConnection()
      connection.Open()
      _schema = connection.GetSchema("Columns")
    End Using
  End If

  return _schema
End Function


Public Function GetColumnInformation(tableName As String, columnName As String) as DataRow
  Dim firstMatchingRow as DataRow = (
    From row In _schema.Rows _
    Where (
      row("TABLE_NAME") = tableName AndAlso row("COLUMN_NAME") = columnName)
    )).FirstOrDefault()

  Return firstMatchingRow
End Function

用法

Dim columnInformation As DataRow = Dal.GetColumnInformation(tableName, columnName)

' find the precision
Dim precision = columnInformation("NUMERIC_PRECISION")
Dim scale = columnInformation("NUMERIC_SCALE")

' convert the decimal to the column's format
' e.g.: 2.345 with a scale of 2 would result in 
'       2.35
value = Decimal.Round(value, scale)

答案 2 :(得分:0)

这个答案是NullVoxPopuli的答案的C#版本。因为我需要这个,所以我想我会分享它并为人们节省一些时间。

它将架构加载到 DataColumnCollection 中,然后将其添加到新的 DataTable。 如果要重用列定义,可以将两部分拆分为函数。

        var ConnectionString = "bla";
        DataColumnCollection Columns;
        
        using (SqlConnection con = new SqlConnection(ConnectionString))
        {
            con.Open();
            using(SqlCommand command = new SqlCommand("select top 1 * from trades", con))
            {
                using (var r = command.ExecuteReader())
                {
                    using(var dt = new DataTable())
                    {
                        dt.Load(r);
                        Columns = dt.Columns;
                    }
                }
                
            }
            con.Close();
        }
        
        
        
        DataTable DataTable = new DataTable();
        while(Columns.Count > 0)
        {
            DataColumn c = Columns[0];
            c.Table.Columns.Remove(c);

            DataTable.Columns.Add(c);
        }
        Columns = DataTable.Columns;
        
        // use DataTable;