Hola Matias Esto que estas sufriendo lo pasamos cuando construimos cooperator, en realidad un tiempo antes cuando arme mi primer generador de código.
El motor de ing. inv. de coop permite obtener todo, te muestro un ejemplo de salida un poco mas abajo. Fijate que las Pks estan completas y las FKs tambien, te da todo lo que podes necesitar. Te podes bajar el ejemplo que genera la salida que pongo mas abajo desde aqui: http://www.danielcalvin.com.ar/EjemplosVarios/DBProvidersTool.rar Podes ver el conjunto de clases que representan el schema de la base de datos aqui: http://www.danielcalvin.com.ar/EjemplosVarios/DBReverse.jpg Ahora si lo que queres es generar código te recomiendo que te bajes coop completo, aunque quieras generar tu propio código. Si miras los fuentes vas a encontrar un generador al mejor estilo asp, con <% y %>, un objeto response y unas cuantas cosas que te facilitaran la vida. ( entre ellas un objeto de contexto que contiene el esquema de la db, en nuestro caso es bastante mas que eso.. ) Podes generar código en c# y vb.net..... Algo del fundamento del generador de código: http://danielcalvin.com.ar/EjemplosVarios/GodeGenerator.jpg Algo de un script en c#: Este genera el config de una aplicacion winforms: <?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="CooperatorConnectionString" connectionString="*<%Response.Write(parameters["**ConnectionString"]+"; Application Name=" + parameters["AppProjectName"] + ";**" );%>*"providerName= "System.Data.SqlClient" /> </connectionStrings> <appSettings> <add key="Enterprisename" value= "*<%Response.Write(parameters["** AppProjectName"]);%>"* /> </appSettings> </configuration> *<%Response.SaveBuffer(**"\\ConfigFiles\\App.Config");%> * Resalte en rojo/bold el código interpretado por el scripting host de coop. Fijate si algo de esto te ahorra trabajo, la ingenieria inversa funciona muy bien y el scripting host también. Ambos se pueden extender con suma facilidad. El motor de scripting es simple pero bastante interesante el código generado o mejor dicho los artefactos de texto generados son creados por una clase que se compila en tiempo de ejecución. Le dedique bastante al tema y podes hacer mucho de lo que hace el scripting host de ms. Te invito a que mires el código tal vez puedas aprovechar bastante de nuestro trabajo. Coop completo con sus fuentes lo podes bajar de: http://www.codeplex.com/cooperator Espero te sirva y puedas aprovechar algo de todo lo que escribimos. Saludos, Daniel PD: Sigue abajo... :)) Te pego el cuerpo del programa que genera la salida de la base northwind: DBReverseEngine dbre = new DBReverseEngine(factory); DataBase databaseSchema = dbre.GetSchema(); Console.WriteLine("Base de datos: {0}",databaseSchema.Name); foreach (DBTable dbt in databaseSchema.Tables) { Console.WriteLine("\tTabla: {0}", dbt.Name); Console.WriteLine("\t\tPK : {0}",dbt.PrimaryKey.Name); foreach (DBFieldKey pkf in dbt.PrimaryKey.Fields) { Console.WriteLine("\t\t\tCampo: {0}, Orden: {1}", pkf.Name, pkf.Order); } DBForeignKey dbfk = dbt.ParentForeignKey; if (dbfk != null) { Console.WriteLine("\t\tFK : {0}, Tabla ref.: {1}", dbfk.Name, dbfk.RelatedTableName); foreach (DBFieldFKey fkfk in dbfk.Fields) { Console.WriteLine("\t\t\tCampo: {0}, Orden: {1}, Campo tabla ref.: {0}", fkfk.Name, fkfk.Order, fkfk.RelatedFieldName); } } Console.WriteLine("\t\tCampos :"); foreach (DBField dbf in dbt.Fields) { Console.WriteLine("\t\t\tCampo: {0} {1} {2}", dbf.Name, dbf.NativeType, dbf.UniversalType.Name); } } Base de datos: Northwind Tabla: Categories PK : PK_Categories Campo: CategoryID, Orden: Asc Campos : Campo: CategoryID int Int32 Campo: CategoryName nvarchar String Campo: Description ntext String Campo: Picture image Byte[] Tabla: CustomerCustomerDemo PK : PK_CustomerCustomerDemo Campo: CustomerID, Orden: Asc Campo: CustomerTypeID, Orden: Asc FK : FK_CustomerCustomerDemo, Tabla ref.: CustomerDemographics Campo: CustomerTypeID, Orden: Unknown, Campo tabla ref.: CustomerTypeID Campos : Campo: CustomerID nchar String Campo: CustomerTypeID nchar String Tabla: CustomerDemographics PK : PK_CustomerDemographics Campo: CustomerTypeID, Orden: Asc Campos : Campo: CustomerTypeID nchar String Campo: CustomerDesc ntext String Tabla: Customers PK : PK_Customers Campo: CustomerID, Orden: Asc Campos : Campo: CustomerID nchar String Campo: CompanyName nvarchar String Campo: ContactName nvarchar String Campo: ContactTitle nvarchar String Campo: Address nvarchar String Campo: City nvarchar String Campo: Region nvarchar String Campo: PostalCode nvarchar String Campo: Country nvarchar String Campo: Phone nvarchar String Campo: Fax nvarchar String Tabla: Employees PK : PK_Employees Campo: EmployeeID, Orden: Asc Campos : Campo: EmployeeID int Int32 Campo: LastName nvarchar String Campo: FirstName nvarchar String Campo: Title nvarchar String Campo: TitleOfCourtesy nvarchar String Campo: BirthDate datetime DateTime Campo: HireDate datetime DateTime Campo: Address nvarchar String Campo: City nvarchar String Campo: Region nvarchar String Campo: PostalCode nvarchar String Campo: Country nvarchar String Campo: HomePhone nvarchar String Campo: Extension nvarchar String Campo: Photo image Byte[] Campo: Notes ntext String Campo: ReportsTo int Int32 Campo: PhotoPath nvarchar String Tabla: EmployeeTerritories PK : PK_EmployeeTerritories Campo: EmployeeID, Orden: Asc Campo: TerritoryID, Orden: Asc FK : FK_EmployeeTerritories_Employees, Tabla ref.: Employees Campo: EmployeeID, Orden: Unknown, Campo tabla ref.: Emp loyeeID Campos : Campo: EmployeeID int Int32 Campo: TerritoryID nvarchar String Tabla: Order Details PK : PK_Order_Details Campo: OrderID, Orden: Asc Campo: ProductID, Orden: Asc FK : FK_Order_Details_Orders, Tabla ref.: Orders Campo: OrderID, Orden: Unknown, Campo tabla ref.: OrderI D Campos : Campo: OrderID int Int32 Campo: ProductID int Int32 Campo: UnitPrice money Decimal Campo: Quantity smallint Int16 Campo: Discount real Double Tabla: Orders PK : PK_Orders Campo: OrderID, Orden: Asc Campos : Campo: OrderID int Int32 Campo: CustomerID nchar String Campo: EmployeeID int Int32 Campo: OrderDate datetime DateTime Campo: RequiredDate datetime DateTime Campo: ShippedDate datetime DateTime Campo: ShipVia int Int32 Campo: Freight money Decimal Campo: ShipName nvarchar String Campo: ShipAddress nvarchar String Campo: ShipCity nvarchar String Campo: ShipRegion nvarchar String Campo: ShipPostalCode nvarchar String Campo: ShipCountry nvarchar String Tabla: Products PK : PK_Products Campo: ProductID, Orden: Asc Campos : Campo: ProductID int Int32 Campo: ProductName nvarchar String Campo: SupplierID int Int32 Campo: CategoryID int Int32 Campo: QuantityPerUnit nvarchar String Campo: UnitPrice money Decimal Campo: UnitsInStock smallint Int16 Campo: UnitsOnOrder smallint Int16 Campo: ReorderLevel smallint Int16 Campo: Discontinued bit Boolean Tabla: Region PK : PK_Region Campo: RegionID, Orden: Asc Campos : Campo: RegionID int Int32 Campo: RegionDescription nchar String Tabla: Shippers PK : PK_Shippers Campo: ShipperID, Orden: Asc Campos : Campo: ShipperID int Int32 Campo: CompanyName nvarchar String Campo: Phone nvarchar String Tabla: Suppliers PK : PK_Suppliers Campo: SupplierID, Orden: Asc Campos : Campo: SupplierID int Int32 Campo: CompanyName nvarchar String Campo: ContactName nvarchar String Campo: ContactTitle nvarchar String Campo: Address nvarchar String Campo: City nvarchar String Campo: Region nvarchar String Campo: PostalCode nvarchar String Campo: Country nvarchar String Campo: Phone nvarchar String Campo: Fax nvarchar String Campo: HomePage ntext String Tabla: Territories PK : PK_Territories Campo: TerritoryID, Orden: Asc Campos : Campo: TerritoryID nvarchar String Campo: TerritoryDescription nchar String Campo: RegionID int Int32 El día 30/05/07, Matias Q <[EMAIL PROTECTED]> escribió:
Buenas lista, Estamos incursionando sobre el campo de los generadores de codigo y me encontre con un inconveniente al tratar de generar clases en base a tablas de una base de datos y a los esquemas. Aparentemente, el metodo GetSchema de SqlConnection (http://msdn2.microsoft.com/en-us/library/ms136365.aspx ) deberia traer en un DataTable(utilizando la MetaCollection "Tables") las columnas de la tabla, y varios otros datos mas de cada una, ademas de una coleccion de las PrimaryKeys... pero no, nunca en ningun momento la coleccion de PrimaryKeys tiene items, y es mas, viendo el documento del link, figura como Community Content la consulta SQL para traer las PrimaryKeys porque el metodo no lo hace. Y aun peor, utilizando el GetSchema con la Metacollection "ForeignKeys" para una Tabla en particular, trae todas las ForeignKeys en un DataTable, pero en ninguna de sus columnas figura que campo de la Tabla utiliza la ForeignKey ni en que campo de que Tabla esta la PrimaryKey que relaciona... Alguien conoce alguna forma de hacer esto sin recurrir a consultas SQL como dice en el articulo de MSDN? algun otro metodo quiza que no sea GetSchema o alguna variacion del mismo? Matias ------------------------------ Download Messenger. Start an i'm conversation. Support a cause. Join Now!<http://im.live.com/messenger/im/home/?source=TAGWL_MAY07>
-- Daniel A. Calvin Cooperator Team Member http://www.cooperator.com.ar Microsoft Certified Professional
