Есть ли какой-нибудь общий способ SQL получить имена таблиц и создавать таблицы? - PullRequest
1 голос
/ 24 февраля 2011

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

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

Ответы [ 5 ]

2 голосов
/ 24 февраля 2011

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

select table_name from information_schema.tables

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

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

2 голосов
/ 24 февраля 2011

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

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

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

1 голос
/ 24 февраля 2011

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

1 голос
/ 24 февраля 2011

Вы можете использовать функцию GetSchema ADO, чтобы получить DataTable почти со всеми данными схемы.

В этом примере используется SQLConnection, но можно использовать функциюв любом соединении ODBCC.

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("============================");
     }
  }
}
1 голос
/ 24 февраля 2011

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

SELECT DISTINCT Name FROM sysobjects WHERE xtype='U'
...