2011-06-19 19 views
1

DataColumnオブジェクトの元のデータ形式(データベース内)を取得するにはどうすればよいですか?DataColumnの元のデータ形式を取得

DBCommand SQLの「選択」クエリを開いた結果の一部であるDataTableのDataColumnオブジェクトがあります。

クエリから返された元のデータ形式に関する情報(「varchar [50]」など)を取得するにはどうすればよいですか。

私はDataColumn.DataTypeを知っていますが、ここでの情報は十分ではありません。たとえば、varcharとcharを区別したり、日付とタイムスタンプを区別したり、varcharフィールドの最大長を取得するなどはできません。

サーバーデータベーススキームから直接情報を取得するのは、私が探している解決策ではありません。なぜなら、クエリテキストはユーザーによって入力されたため、自分自身でテキストを解析して、使用しているデータベースに対応するエントリがない列がある可能性があります(たとえば、ColumnA || Column B、 'SomeLiteral'、MyBableからの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

アドホックな文字列、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からデータ型と長さのコレクションを取得できます。ユーザーストリングの列を解析する必要はありません。 –

関連する問題