2011-06-19 82 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获得数据类型和长度的集合。不需要解析用户字符串中的列。 –