2011-02-24 5 views
1

"테이블 이름"을 사용하면 일반적인 이름 (쿼리 나 물건이 아닌), 일반 오래된 테이블을 의미합니다. 이는 현재 Jet 엔진에 연결되어있는 다른 프로젝트에서 작업 중이기 때문에 사용자가 테이블의 특정 내용을보기 위해 두 번 클릭하는 테이블 목록을 보여줍니다. 하지만 이제는 사용자가 설치된 엔진 목록에서 엔진을 변경할 수 있어야합니다. 그러나 내 프로그램이 다른 엔진에서 작동하려면 모든 SQL 엔진 (또는 적어도 대부분의 엔진)에서 작동하는 방식으로 테이블 이름을 가져와야합니다. 또한 실제로 특정 테이블의 모든 열 이름을 가져올 수 있어야하며 가능한 모든 엔진에서 작동하는 방식으로 "CREATE TABLE"쿼리를 만들 수 있어야합니다 (사용자가 마법사, 그리고 내 프로그램이 쿼리를 생성). 저는 이것이 실제로 가능할 지 의심 스럽지만, Visual Studio는 다른 데이터베이스 엔진을 위해 마법사에서 테이블을 생성 할 수 있습니다. 그들은 어떻게이 일을 처리합니까? 가능한 모든 SQL 엔진에 대해 다른 "CREATE TABLE"쿼리를 사용해야합니까?테이블 이름을 가져 와서 테이블을 생성하는 일반적인 SQL 방법이 있습니까?

어떻게 든 표준화 된 것으로 보이는 ADO가이 문제를 해결할 수 있는지 궁금합니다.

답변

2

아니요, 안타깝게도 제가 아는 한 이러한 일을하는 일반적인 방법은 없습니다. 모든 DB 엔진은 DDL과 SQL의 약간 다른 방언을 가지고 있으며, 데이터 유형의 다른 세트를 지원하고, 메타 데이터 등을 관리하는 다른 방법을 가지고 있습니다. 당신이 표준 SQL/DDL에 의존 할 수있는 기능의 가장 낮은 분모를 유지한다면 매우 제한 될 것입니다.

일반적으로 차이점을 처리하는 여러 가지 구현을 사용하여 추상 데이터 레이어를 작성하면이 문제를 해결할 수 있습니다.

ADO는 데이터베이스에 쿼리를 보내기위한 공통 인터페이스를 제공하지만 쿼리의 SQL은 클라이언트가 지정해야하므로 문제의 일부만 해결합니다.

1

MSSQL에서이 작업을 수행해야합니다. 나는 다른 SQL 구현과 매우 유사하다고 상상한다. 당신이 어떤 백엔드 를 원하는 경우

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

또는 더 나은 방법은'sy'bjects 대신 SQL Server 2005에서 소개 된'sys' 카탈로그 뷰를 사용하는 것입니다 : 쿼리는 다음과 같습니다 : SELECT 이름 FROM sys.tables' –

2

, 항상 작동하지 않는 일이있을 것이다, 그러나 거의 모든 백엔드 수 :

select table_name from information_schema.tables 

귀하의 기본 만들 테이블 명령을 함께 키 및 인덱스는 거의 모든 백엔드와 호환되도록 쉽게 코드화됩니다. 실행 코드 자동 증분 정수 키는 모든 백엔드마다 구문이 다릅니다.

그래서 "대부분 그렇습니다. 아마 생각보다 많을 지 모르지만 100 %는 아닙니다." 단점은 크기가 작기 때문에 특정 백엔드에 대한 몇 가지 조정을 통해 일반 코드를 작성할 수 있습니다.

+0

http : //www.petefreitag. com/item/666.cfm "거의 모든 사람"이 오라클을 제외하면, Firebird – RichardTheKiwi

+0

네, 오라클이 지원하지 않는다는 것을 상기 시켰습니다. 비틀기는 똑같은 모습을 보여줄 것입니다. –

1

GetSchema ADO 함수를 사용하면 거의 모든 스키마 데이터가있는 DataTable을 얻을 수 있습니다.

이 예 SQLConnection을 사용할 수 있지만 함수는 특정 공급자 있도록 GetSchema 방법을 노출한다 데이터 디자이너 확장 (DDEX)를 사용하여 구현되는 비주얼 스튜디오 임의 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

+0

모든 ODBC 드라이버가 불행히도 GetSchema 메서드를 지원하지는 않습니다. 또한 데이터 형식 등이 여전히 달라서 테이블 작성에 도움이된다고 생각하지 않습니다. –

+0

jsolid : nooo, MSDN에서 복사 붙여 넣기 (링크 확인) –

1

사용될 수있다 메타 데이터를 가져 오는 중. 몇 가지 아이디어를 얻을 수 있습니다 here.

관련 문제