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

Responder a