【问题标题】:Get the original data format of a DataColumn获取DataColumn的原始数据格式
【发布时间】:2011-06-19 18:23:26
【问题描述】:

如何获取 DataColumn 对象的原始数据格式(在数据库中)?

我有来自 DataTable 的 DataColumn 对象,它是打开 DBCommand SQL“选择”查询结果的一部分。

如何获取有关查询返回的原始数据格式的信息(即“varchar[50]”等)。

我知道DataColumn.DataType,但是这里的信息不够具体,比如无法区分varchar和char,或者无法区分日期和时间戳,或者无法获取varchar字段的最大长度等等。

直接从服务器数据库方案获取信息不是我要找的解决方案,因为查询文本是用户输入的,我不想自己解析文本来找出是什么表的哪一列使用并且因为在数据库中可能存在没有相应条目的列(例如,select ColumnA || Column B, 'SomeLiteral', 12 * ColumnC, null from MyTable)

【问题讨论】:

    标签: .net sql database datacolumn


    【解决方案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();
         }
      }
    }
    

    【讨论】:

      【解决方案2】:

      听起来您正在获取一个临时字符串,获取一个 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;} 
      }
      

      【讨论】:

      • 谢谢,但我在问题中添加了文字,解释了为什么这不是我正在寻找的解决方案
      • @nine 您可以解决这样一个事实,即它是一个用户查询,其列可能与表不匹配。获取用户的临时查询,并匹配您的表。您真正需要的只是表名。从那里您可以从 SQL Server 获取数据类型和长度的集合。无需解析用户字符串中的列。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 2012-09-16
      • 2018-11-18
      • 1970-01-01
      • 2018-10-13
      • 2010-11-24
      • 2014-08-01
      相关资源
      最近更新 更多