2011-06-19 84 views
1

如何獲取DataColumn對象的原始數據格式(在數據庫中)?獲取DataColumn的原始數據格式

我有一個DataTable中的DataColumn對象,它是打開DBCommand SQL「select」查詢結果的一部分。

如何獲取查詢返回的原始數據格式(即「varchar [50]」等)的信息。

我知道DataColumn.DataType,但這裏的信息不夠具體,例如不能區分varchar和char或區分日期和時間戳或獲取varchar字段的最大長度等等。

從服務器數據庫方案直接獲取信息不是我正在尋找的解決方案,因爲查詢文本是由用戶輸入的,我不想自己解析文本以找出哪些表是什麼列因爲可能有列在數據庫中沒有相應的條目(例如,從MyTable中選擇ColumnA || Column B,'SomeLiteral',12 * ColumnC,null)

回答

1

你可以嘗試這樣的事情,並檢查結果(在schemaTable表)

DataTable schemaTable; 

String sql = "select * from ..."; 

using (SqlConnection cnx = new SqlConnection(Properties.Settings.Default.ConnectionString)) 
{ 
    using (SqlCommand cmd = new SqlCommand(sql, cnx)) 
    { 
    cnx.Open(); 

    using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.KeyInfo)) 
    { 
     schemaTable = rdr.GetSchemaTable(); 
    } 
    } 
} 
1

聽起來像你正在使用一個ad-hoc字符串,獲取一個DataTable,並試圖確定它的數據類型和長度。

直接通過查詢SQL Server嘗試另一種方法。正如你發現的那樣,DataColumn沒有你需要的所有信息。

var cols = GetTableDetails("MyTable"); 
DataTable dt = GetDataTableFromUserSpecifiedQuery(userSqlQuery); 
foreach (var col in dt.Columns) 
{ 
    var matching = cols.SingleOrDefault(x=>x.Name == col.ColumnName); 
    if (matching !=null) 
    { 
     //you now have the name, datatype, and length of the column 
     //matched from your table. 
    } 
} 

public List<Col> GetTableDetails(string tableName) 
{ 
    List<Col> cols = new List<Col>(); 
    using (var conn = new SqlConnection("Data Source=server;Initial Catalog=Test1;Integrated Security=true;")) 
    using (var cmd = conn.CreateCommand()) 
    { 
     conn.Open(); 
     cmd.CommandText = @"SELECT syscolumns.name AS COLUMN_NAME, 
            systypes.name AS DATA_TYPE, 
            syscolumns.LENGTH AS LENGTH 
          FROM  sysobjects 
          INNER JOIN syscolumns ON sysobjects.id = syscolumns.id 
          INNER JOIN systypes ON syscolumns.xtype = systypes.xtype 
          WHERE  (sysobjects.xtype = 'U') and 
          sysobjects.name = @tableName 
          ORDER BY sysobjects.name, syscolumns.colid;"; 
     cmd.Parameters.AddWithValue("@tableName", tableName); 
     SqlDataReader dr = cmd.ExecuteReader(); 
     while (dr.Read()) 
     {     
      cols.Add(new Col { Name= dr["COLUMN_NAME"], 
           DataType= dr["DATA_TYPE"], 
           Len = dr["LENGTH"] });     
     } 
     return cols; 
    } 
} 


public class Col { 
    public string Name{get;set;} 
    public string DataType{get;set;} 
    public int Len{get;set;} 
} 

enter image description here

+0

謝謝,但我添加文本的問題,解釋爲什麼這不是我期待的 – NineBerry

+0

@nine您可以解決的事實,這是一個用戶查詢其列可能不匹配表中的解決方案。採取用戶的即席查詢,並與您的表匹配。你真正需要的是表名。從那裏你可以從SQL Server獲得數據類型和長度的集合。不需要解析用戶字符串中的列。 –