2016-10-04 10 views
0

特定のテーブルのスキーマを取得しようとしていますが、カラムがnullになっています。私はクラスの下に、この中で結果を取得しようとしています特定のテーブルのカラムが取得されない

Reference

public class Tables 
    { 
     public string Name { get; set; } 
     public string[] Columns { get; set; } 
    } 

コード:

string[] selectedTables = { "Table1", "Table2"}; 
    var conectionString = new SqlConnection("MyconnectionString"); 
    var data = new List<Tables>(); 
    data = conectionString.GetSchema("Tables").AsEnumerable() 
     .Select 
     (
     t => new Tables 
     { 
      Name = t[2].ToString(), 
      Columns = conn.GetSchema("Columns", 
        new string[] { databaseName,t[2].ToString() }).AsEnumerable() // t[2].ToString() represent tablename 
        .Where(c => selectedTables.Contains(t[2].ToString())) 
        .Select(c => c[3].ToString()).ToArray() // c[3].ToString() represent Columns 
     }).ToList(); 

return data; 

データに私はテーブルすなわちTable0,Table1,Table2,Table3などのリストを取得していますが、私はこのTable1 and Table2選択されたテーブルの列を取得していません。

更新:私はこのような何かを探しています:

// You can specify the Catalog, Schema, Table Name, Table Type to get 
     // the specified table(s). 
     // You can use four restrictions for Table, so you should create a 4 members array. 
     String[] tableRestrictions = new String[4]; 

     // For the array, 0-member represents Catalog; 1-member represents Schema; 
     // 2-member represents Table Name; 3-member represents Table Type. 
     // Now we specify the Table Name of the table what we want to get schema information. 
     tableRestrictions[2] = "Course"; 

     DataTable courseTableSchemaTable = conn.GetSchema("Tables", tableRestrictions); 

data = conectionString.GetSchema("Tables").AsEnumerable() 
     .Select 
     (
     t => new Tables 
     { 
      Name = t[2].ToString(), 
      Columns = (from useTable in selectedTables 
      let columns = conn.GetSchema("Columns",new string[] { databaseName, t["TABLE_SCHEMA"].ToString(), useTable }) 
        select new { columns[3]}) //Error 
     }).ToList(); 

は、どのように私は私のselectedTablesを注入していますか?

答えて

1

目的を達成するにはいくつかの方法があります。

一つの方法は、すべてのテーブルを取得し、テーブル名で結果をフィルタリングして、選択した各テーブルの列を取得することができます

string[] selectedTables = { "Table1", "Table2"}; 
using (var conection = new SqlConnection("MyconnectionString")) 
{ 
    connection.Open(); 

    var tables = (
     from table in connection.GetSchema("Tables").AsEnumerable() 
     let name = (string)table["TABLE_NAME"] 
     where selectedTables.Contains(name) 
     let catalog = (string)table["TABLE_CATALOG"] 
     let schema = (string)table["TABLE_SCHEMA"] 
     select new Tables // this should really be called Table 
     { 
      Name = name, 
      Columns = (
       from column in connection.GetSchema("Columns", new [] { catalog, schema, name }).AsEnumerable() 
       select (string)column["COLUMN_NAME"]).ToArray() 
     }).ToList(); 

    return tables; 
} 

更新:のコメントによると、あなたは実際にすべての希望選択されたもののためにのみ移入列を持つ表けど、その代わりにwhereのあなたは、条件付きの列の集団に対して同じ基準を使用することができます。これは、時間に対するあなたの親切な努力のためにたくさんfine.Thanksを働いている

 from table in connection.GetSchema("Tables").AsEnumerable() 
     let name = (string)table["TABLE_NAME"] 
     let catalog = (string)table["TABLE_CATALOG"] 
     let schema = (string)table["TABLE_SCHEMA"] 
     select new Tables // this should really be called Table 
     { 
      Name = name, 
      Columns = selectedTables.Contains(name) ? (
       from column in connection.GetSchema("Columns", new [] { catalog, schema, name }).AsEnumerable() 
       select (string)column["COLUMN_NAME"]).ToArray() : null 
     }).ToList(); 
+1

私を怒らせて、このように助けてください:) –

関連する問題