2016-05-02 114 views
0

我需要使用C#System.Data.SqlClient dll來查詢SQL數據庫。我知道我通常可以使用SQL查詢語句來查詢數據庫,如SELECT * FROM TABLE_NAME。但是,我不知道任何表,列或行的名稱,所以我不知道如何正確獲取我需要的信息。如何獲取每個表的所有表名和所有列名和行名?

public void PrintNames() // print table, column, and row names 
{ 
    SqlConnection connection = new SqlConnection(connectionString); 
    using (connection) 
    { 
     connection.Open(); 

     DataTable table = connection.GetSchema("Tables"); 
     Debug.Log(table.Columns.Count); 
     Debug.Log(table.Rows.Count); 

     foreach (DataColumn col in table.Columns) 
     { 
      foreach (DataRow row in table.Rows) 
      { 
       Debug.Log(col.ToString() + ", " + row.ToString()); 
      } 
     } 
    } 
} 

這只是導致打印以下:一遍又一遍TABLE_CATALOG, System.Data.DataRow

我另一種答案我看到了SO後嘗試下面的代碼了。

此外,如果你想知道爲什麼Debug.Log的東西,這是因爲我使用Unity3D,但這個問題與Unity無關,所以我沒有打擾爲它添加標籤。

任何幫助,非常感謝。

+0

row.ToString()會寫成DataRow;你需要嘗試索引它來得到一個單元格的值,比如行[col.ToString()]或者獲取索引器並且獲得索引器的數目 – techspider

+0

@techspider有道理,但爲什麼'col.ToString()'會打印一些東西呢? – bpgeck

+0

hmm ....放置一個斷點並通過col.ToString()來查看它正在嘗試寫入的屬性;看起來你寫代碼時不知道它幹了什麼! – techspider

回答

1

我不知道你是什麼意思是行名,但你可以使用Information Schema Views獲得有關數據庫元數據的信息。

INFORMATION_SCHEMA.TABLES爲當前數據庫中當前用戶具有權限的每個表返回一行。

INFORMATION_SCHEMA.COLUMNS爲當前數據庫中當前用戶可以訪問的每列返回一行。

SELECT TABLE_NAME      //SELECT ONLY THE NAME OF THE TABLE 
FROM INFORMATION_SCHEMA.TABLES   //READ FROM TABLES VIEW 
WHERE TABLE_CATALOG='database name'  //KEEP ONLY VALUES OF YOUR DATABASE 

並獲得表的所有列:

SELECT COLUMN_NAME      //SELECT ONLY THE NAME OF THE COLUMN 
FROM INFORMATION_SCHEMA.COLUMNS   //READ FROM COLUMNS VIEW 
WHERE TABLE_CATALOG='database name'  //KEEP ONLY VALUES OF YOUR DATABASE 
    AND TABLE_NAME='table name'   //AND A SPECIFIC TABLE 
+0

謝謝你的回答。一般來說,我不熟悉SQL和數據庫。你是否會通過我的答案走我,讓我知道每條線的作用? – bpgeck

+0

@bpgeck:好的,我正在更新我的答案。 –

+0

因此,數據庫名稱是我自己手動輸入的名稱? – bpgeck

1

您可以使用SQL Server的系統訪問量:

SELECT t.name AS TableName, c.Name AS ColumnName 
FROM sys.tables t 
INNER join sys.columns c 
    ON t.object_id = c.object_id 
ORDER BY t.name, c.column_id 

您可以添加條件爲,如果你的WHERE條款想要更多地過濾結果。