2011-01-29 27 views
2

我需要能夠從DbConnection.GetSchema()返回的DataTable中確定SQL Server表中的特定列是否爲identity/auto-increment或不。我不能直接查詢系統表。如果我通過ODBC連接到SQL Server,奇怪的是,這樣的列的返回數據類型返回爲「int identity」(或「bigint identity」等),但如果我使用本地SQL Server驅動程序,那麼似乎在「int」列和「int identity」列之間沒有區別。有其他的方式可以推斷出這些信息嗎?如何在C#中確定SQL Server數據庫列是否爲自動增量?

+0

它看起來不像GetSchema()集合中可用的那條信息。爲什麼你不能查詢系統目錄視圖?那些肯定會保存這些信息! – 2011-01-29 07:54:09

+0

我需要一個獨立於數據庫的方式。看起來,查詢每個單獨的表並檢查DatabaseReader.GetSchemaTable()的輸出是唯一可行的方法。 – Dan 2011-01-31 15:56:02

回答

4

DataTableColumns財產和DataColumna property表明自動遞增:

bool isAutoIncrement = dataTable.Columns[iCol].AutoIncrement 
+0

他需要從`GetSchema()`GetSchema()返回一個`DataTable`關於模式的信息*,而不是模式本身。 – 2011-01-29 02:01:45

0

我遇到了相同的。據我發現here「根據您使用的數據庫類型,自動增量列的實現方式不同,它不通過GetOleDbSchema公開。」

我沒有找到任何其他方式,然後「kelloti」提到。所以目前我對這個解決方案很好,因爲此刻我需要知道列是否是AutoIncrement,我已經在內存中擁有表,所以我不需要再次查詢數據庫。

(我願意把我的意見爲意見,但我不能評論,所以我希望我不會讓它凌亂太多...)

3

This StackOverflow thread

GetSchema()功能將不會返回你想要的信息。也不會檢查DataTable模式屬性。你必須去一個較低的級別,這將取決於DBMS和可能的版本。

下面的成員檢索具有標識列的所有表,然後查找與作爲參數傳遞的特定表匹配。該代碼可以修改爲返回所有表或者查詢優化以僅查找感興趣的表。

// see: https://stackoverflow.com/questions/87747/how-do-you-determine-what-sql-tables-have-an-identity-column-programatically 
private static string GetIdentityColumnName(SqlConnection sqlConnection, Tuple<string, string> table) 
{ 
    string columnName = string.Empty; 

    const string commandString = 
     "select TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS " 
     + "where TABLE_SCHEMA = 'dbo' and COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1 " 
     + "order by TABLE_NAME"; 

    DataSet dataSet = new DataSet(); 
    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); 
    sqlDataAdapter.SelectCommand = new SqlCommand(commandString, sqlConnection); 
    sqlDataAdapter.Fill(dataSet); 

    if (dataSet.Tables.Count > 0 && dataSet.Tables[0].Rows.Count > 0) 
    { 
     foreach (DataRow row in dataSet.Tables[0].Rows) 
     { 
      // compare name first 
      if (string.Compare(table.Item2, row[1] as string, true) == 0) 
      { 
       // if the schema as specified, we need to match it, too 
       if (string.IsNullOrWhiteSpace(table.Item1) || string.Compare(table.Item1, row[0] as string) == 0) 
       { 
        columnName = row[2] as string; 
        break; 
       } 
      } 
     } 
    } 
    return columnName; 
} 
相關問題