1

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

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

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

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

サーバーデータベーススキームから直接情報を取得することは、私が探している解決策ではありません。クエリテキストはユーザーによって入力され、テキストを自分で解析して、使用されているテーブルのどの列を見つけたくないからです。データベースに対応するエントリがない列が存在する可能性があります(たとえば、ColumnA || Column B、'SomeLiteral'、12 * ColumnC、MyTableからnullを選択します)

4

2 に答える 2

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;} 
}

ここに画像の説明を入力してください

于 2011-06-19T19:23:04.640 に答える
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();
     }
  }
}
于 2011-06-20T15:10:20.483 に答える