2011-02-24 40 views
1

與「表名」我的意思是正常的名稱(而不是查詢或類似的東西),普通的舊錶。這是因爲我正在處理當前連接到Jet引擎的項目以及其他功能,它顯示了用戶雙擊以查看特定表格內容的表格列表。但是現在我希望用戶能夠從已安裝的引擎列表中更改引擎。但是爲了讓我的程序能夠與其他引擎一起工作,它需要以適用於每個SQL引擎(或者至少大多數引擎)的方式獲取表名。實際上,我也需要能夠獲取特定表的所有列名稱,並且還能夠以適用於每個可能引擎的方式創建「CREATE TABLE」查詢(因爲用戶可以從嚮導,我的程序生成查詢)。實際上我很懷疑這是可能的,但據我所知,Visual Studio可以通過嚮導爲不同的數據庫引擎創建表。他們如何設法做到這一點?我需要爲每個可能的SQL引擎都有不同的「CREATE TABLE」查詢嗎?是否有任何通用的SQL方法來獲取表名稱和創建表?

我想知道ADO是否可以提供幫助,因爲它似乎具有某種標準化的一切。

回答

2

不,不幸的是,據我所知,沒有通用的方法去做這些事情。所有數據庫引擎的DDL和SQL的方言略有不同,支持不同的數據類型集,以及管理元數據的不同方式等。如果你保持絕對最低的特徵分母,我想你可以依靠標準的SQL/DDL,但是將非常有限。

通常這是通過創建一個抽象數據層和幾個不同的處理差異的實現來解決的。

ADO只解決了部分問題,因爲它提供了一個用於向數據庫發送查詢的通用接口,但查詢中的SQL必須由客戶端指定。

1

這應該在MSSQL中爲你做。我想對於其他SQL實現它會非常相似。

SELECT DISTINCT Name FROM sysobjects WHERE xtype='U' 
+0

還有更好的方法:使用'SQL'目錄視圖,在SQL Server 2005中引入而不是棄用的'sysobjects' - 您的查詢將是:'SELECT Name FROM sys.tables' – 2011-02-24 17:31:52

2

如果你想任何後端,總是會有一個不工作,但幾乎每個後端將允許:

select table_name from information_schema.tables 

你的基本的創建表命令,用密鑰和索引,很容易編碼爲幾乎每個後端都兼容,對於自動遞增的整數密鑰,它們在每個後端都有不同的語法,因此可以執行執行

所以答案是「主要是,可能比你想象的要多,但不是100%」。由於怪癖很小,因此可以編寫一些通用代碼,並針對特定的後端進行一些調整。

+0

http://www.petefreitag。 com/item/666.cfm如果你的意思是「幾乎所有」,除了Oracle,Firebird – RichardTheKiwi 2011-02-24 17:54:17

+0

是的,我已經在這裏提醒過Oracle,Oracle不支持這一點 - 我認爲它通常是你發表評論:)我假設調整將是一些看起來一樣的視圖。 – 2011-02-24 18:30:51

1

您可以使用GetSchema ADO函數獲取具有幾乎所有模式數據的DataTable

本例使用的SQLConnection,但功能可以以任何ODBCConnection.

using System; 
using System.Data; 
using System.Data.SqlClient; 

class Program 
{ 
    static void Main() 
    { 
    string connectionString = GetConnectionString(); 
    sing (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
    // Connect to the database then retrieve the schema information. 
    connection.Open(); 
    DataTable table = connection.GetSchema("Tables"); 

    // Display the contents of the table. 
    DisplayData(table); 
    Console.WriteLine("Press any key to continue."); 
    Console.ReadKey(); 
    } 
} 

    private static string GetConnectionString() 
    { 
    // To avoid storing the connection string in your code, 
    // you can retrieve it from a configuration file. 
    return "Data Source=(local);Database=AdventureWorks;" + 
     "Integrated Security=true;"; 
    } 

    private static void DisplayData(System.Data.DataTable table) 
    { 
    foreach (System.Data.DataRow row in table.Rows) 
    { 
     foreach (System.Data.DataColumn col in table.Columns) 
     { 
      Console.WriteLine("{0} = {1}", col.ColumnName, row[col]); 
     } 
    Console.WriteLine("============================"); 
    } 
    } 
} 
+0

你剛纔寫了所有的代碼嗎?只是好奇。 – Juan 2011-02-24 17:46:17

+0

不幸的是,並不是所有的ODBC驅動程序都支持GetSchema方法。另外,我認爲它不會幫助創建表,因爲數據類型等依然不同。 – 2011-02-24 17:55:29

+0

jsolid:nooo,從MSDN複製粘貼(檢查鏈接) – 2011-02-24 18:06:19

1

在Visual Studio中使用它正在使用的數據設計擴展性(DDEX)其中特定提供者應該暴露的getSchema方法來幫助實現檢索元數據。你可以得到一些想法here

相關問題