¿Hay alguna forma general de SQL para get nombres de tablas y crear tablas?

Con "nombres de tabla" me refiero solo al nombre de normal (no consultas o cosas por el estilo), tablas antiguas simples. Esto se debe a que estoy trabajando en un proyecto que actualmente se conecta al motor Jet y, entre otras funciones, muestra una list de tablas en las que el usuario haría doble clic para ver el contenido de la tabla de algún específico. Pero ahora quiero que el usuario pueda cambiar el motor de una list de motores instalados. Pero para que mi progtwig funcione con otros motores, necesitará get los nombres de las tablas de una manera que funcione para todos los motores SQL (o al less la mayoría de ellos). De hecho, también necesito poder get todos los nombres de columna para una tabla específica, y también, ser capaz de crear una consulta "CREATE TABLE" de manera que funcione con todos los motores posibles (ya que el usuario puede crear tablas desde asistente, y mi progtwig genera la consulta). En realidad, dudo mucho de que esto sea posible, pero, hasta donde sé, Visual Studio puede crear tablas desde un asistente para diferentes motores de database. ¿Cómo se las arreglan para hacer esto? ¿Tendré que tener una consulta diferente "CREATE TABLE" para cada motor SQL posible?

Me pregunto si ADO puede ayudar con esto, ya que parece tener todo estandarizado de alguna manera.

No, desafortunadamente no hay una manera general de hacer estas cosas hasta donde yo sé. Todos los motores de DB tienen dialectos ligeramente diferentes de DDL y SQL, admiten diferentes sets de types de datos y diferentes forms de administrar sus metadatos, etc. Si mantiene el denominador absoluto más bajo de las características, supongo que puede confiar en SQL / DDL estándar, pero eso será muy limitado

Por lo general, esto se resuelve creando una capa de datos abstracta con varias implementaciones diferentes que maneja las diferencias.

ADO solo resuelve parte del problema, ya que ofrece una interfaz común para enviar consultas a una database, pero el SQL en las consultas debe ser especificado por el cliente.

Si quieres un back-end, siempre habrá uno que no funcione, pero casi todos los back-end permitirán:

select table_name from information_schema.tables 

Sus commands básicos de creación de tabla, con keys e índices, se codifican fácilmente para que sean compatibles con casi todos los progtwigs de background, excepto para las keys de integers con incremento automático, que tienen una syntax diferente en cada back-end.

Entonces la respuesta, "sobre todo sí, probablemente más de lo que piensas, pero no al 100%". Debido a que los caprichos son pequeños, es posible escribir un código general con algunos ajustes para el back-end particular.

Esto debería hacerlo por usted en MSSQL. Me imagino que sería muy similar para otras implementaciones de SQL.

 SELECT DISTINCT Name FROM sysobjects WHERE xtype='U' 

Puede usar la function GetSchema ADO para get una DataTable con casi todos los datos de esquema.

Este ejemplo usa una SQLConnection, pero la function se puede usar en cualquier 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("============================"); } } } 

En Visual Studio, se implementa utilizando la Extensibilidad del Diseñador de Datos (DDEX) donde un proveedor específico debe exponer el método GetSchema para ayudar a recuperar los metadatos. Puedes get algunas ideas aquí .