Есть ли общий способ SQL для получения имен таблиц и создания таблиц?

С «именами таблиц» я имею в виду только имя нормального (не запросы или подобные вещи), простые старые таблицы. Это связано с тем, что я работаю над проектом, который в настоящее время подключается к движку Jet и среди других функций, он показывает список таблиц, которые пользователь дважды кликнет, чтобы увидеть содержимое конкретной конкретной таблицы. Но теперь я хочу, чтобы пользователь мог изменить двигатель из списка установленных движков. Но для моей программы для работы с другими двигателями ей нужно будет получить имена таблиц таким образом, чтобы они работали для каждого SQL-движка (или, по крайней мере, для большинства из них). Мне также нужно иметь возможность получить все имена столбцов для конкретной таблицы, а также иметь возможность создавать запрос «CREATE TABLE» таким образом, чтобы он работал с каждым возможным движком (так как пользователь может создавать таблицы из мастер, и моя программа генерирует запрос). Я действительно сомневаюсь, что это возможно, но, насколько я знаю, Visual Studio может создавать таблицы из мастера для разных движков базы данных. Как им удается это сделать? Должен ли я иметь другой запрос «CREATE TABLE» для каждого возможного механизма SQL?

Мне интересно, поможет ли ADO в этом, поскольку, похоже, все стандартизовано.

Нет, к сожалению, нет общего способа сделать это, насколько я знаю. У всех двигателей БД есть несколько разные диалекты DDL и SQL, поддержка разных наборов типов данных и различные способы управления их метаданными и т. Д. Если вы придерживаетесь абсолютного наименьшего знаменателя функций, я думаю, вы могли бы полагаться на стандартный SQL / DDL, но это будет очень ограниченным.

Обычно это решается путем создания абстрактного слоя данных с несколькими различными реализациями, которые обрабатывают различия.

ADO решает только часть проблемы, поскольку она предлагает общий интерфейс для отправки запросов к базе данных, но SQL в запросах должен быть указан клиентом.

Если вы хотите получить какойлибо сервер, всегда будет тот, который не работает, но почти каждый внутренний сервер позволит:

select table_name from information_schema.tables 

Ваши базовые команды создания таблиц с ключами и индексами легко кодируются, чтобы быть совместимыми почти с каждым контентом , execpt для ключей с автоматическим добавлением целых чисел, которые имеют различный синтаксис на каждом конце.

Поэтому ответ «в основном да, наверное, больше, чем вы думаете, но не на 100%». Поскольку причуды небольшие, можно написать некоторый общий код с некоторыми настройками для конкретного контента.

Это должно сделать это для вас в MSSQL. Я предполагаю, что это будет очень похоже на другие реализации SQL.

 SELECT DISTINCT Name FROM sysobjects WHERE xtype='U' 

Вы можете использовать функцию ADO GetSchema для получения 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("============================"); } } } 

В Visual Studio он реализуется с использованием расширения Data Designer Extensibility (DDEX), где конкретный поставщик должен предоставить метод GetSchema для поиска метаданных. Здесь вы можете получить некоторые идеи.