2014-06-11 21 views
7

Có cách nào để biết chính xác loại cột trong số DataTable không? Ngay bây giờ tôi đang làm điều này:Cách lấy loại cột số chính xác bao gồm. quy mô và độ chính xác?

DataTable st = dataReader.GetSchemaTable(); 
foreach (DataColumn col in st.Columns) 
{ 
    var type = col.DataType; 
} 

Bây giờ với type.Name Tôi có thể tìm thấy nếu nó là một con số (int hay decimal ..) hoặc string nhưng vấn đề là tôi cần những loại chính xác, ví dụ nếu trong cơ sở dữ liệu giả sử cột RateNUMBER(4,3) thì ở đây trong mã của tôi, tôi chỉ nhận được loại là 'Thập phân' và không có thông tin về Định dạng 4,3.

Bây giờ, yêu cầu là tôi cần phải định dạng các giá trị theo loại của chúng cho ví dụ. nếu Rate=1.4, nó sẽ được hiển thị là 0001.400 (theo Định dạng NUMBER(4,3)). Do đó ở đây vì tôi không có thông tin tôi không thể xử lý các giá trị hơn nữa. Có cách nào để biết điều tương tự không?

Cảm ơn

+0

http://msdn.microsoft.com/en-IN/library/system.data.datacolumn.datatype.aspx – Bharadwaj

+0

loop Xuyên mỗi hàng aka DataRow và sử dụng getType phản chiếu của cá nhân .. –

+0

Bạn cần xem xét các thuộc tính bổ sung trên cột để xác định chính xác. Ví dụ: xem các thuộc tính NumericPrecision và NumericScale http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getschematable%28v=vs.110%29.aspx – dmarietta

Trả lời

5

Bạn có thể sử dụng NumericPrecisionNumericScale:

using (var con = new SqlConnection(Properties.Settings.Default.RM2ConnectionString)) 
using (var cmd = new SqlCommand("SELECT * FROM dbo.Test", con)) 
{ 
    con.Open(); 
    using (var reader = cmd.ExecuteReader()) 
    using (var schemaTable = reader.GetSchemaTable()) 
    { 
     foreach (DataRow row in schemaTable.Rows) 
     { 
      string column = row.Field<string>("ColumnName"); 
      string type = row.Field<string>("DataTypeName"); 
      short precision = row.Field<short>("NumericPrecision"); 
      short scale = row.Field<short>("NumericScale"); 
      Console.WriteLine("Column: {0} Type: {1} Precision: {2} Scale: {3}", column, type, precision, scale); 
     } 
    } 
} 

Mọi thông tin: GetSchemaTable

Tôi đã thử nghiệm nó với một bảng tươi với một cột duy nhất NumberColumn loại numeric(4, 3):

Column: NumberColumn Type: decimal Precision: 4 Scale: 3 
+1

Đây chính xác là những gì tôi đang tìm kiếm. Tôi đã thử điều này trong mã của tôi và có các giá trị mong muốn. Cảm ơn rất nhiều! +1 – IFlyHigh

+0

Chỉ là một câu hỏi bổ trợ. Có cách nào để có được datarow cột cụ thể từ tab Schema. Ví dụ chỉ cho cột Rate làm thế nào tôi có thể nhận được datarow. Tôi đã làm điều này: 1. Foreach Loop trên schemaTbale.rows 2. schemaColName = row.Field ("ColumnName"); 3. Nếu schemaColName = "Rate" nhận được tất cả dữ liệu khác. Tuy nhiên ở đây cho mỗi cột tôi đang đi qua schemaTable hoàn chỉnh .. Có cách nào tốt hơn để làm điều này? Cảm ơn trước. – IFlyHigh

+0

@LittleMissSunshine: tại sao lại là một vấn đề? Bạn không nên có hàng tá cột. Bạn có thể sử dụng LINQ (cũng là một vòng lặp ẩn): 'var row = tbl.AsEnumerable(). Đầu tiên (r => r.Field (" ColumnName ") ==" Rate ");' –

0

DataTable được trả về bởi dataReader.GetSchemaTable() là lược đồ của kết quả cơ bản. Bảng này chứa nhiều bản ghi như nhiều cột trong bảng bên dưới. Vì vậy, bạn cần phải lặp qua các hàng. Mỗi hàng chứa siêu dữ liệu của cột đơn của bảng bên dưới. Bạn có thể lấy siêu dữ liệu của các cột như sau

DataTable st = reader.GetSchemaTable(); 
        foreach (DataRow row in st.Rows) 
        { 
         Console.Write(string.Format("ColumnName:{0} DataType:{1} Ordinal:{2} Precision:{3} Size:{4} Scale:{5}", 
          row["ColumnName"], row["DataTypeName"], row["ColumnOrdinal"], 
          row["NumericPrecision"], row["ColumnSize"], row["NumericScale"])); 
        } 
Các vấn đề liên quan