Genial Daniel! Gracias mil por toda la informacion, voy a investigar y leerlos 
ejemplos y bajar el Cooperator.Los ejemplos de codigos parecen bastante faciles 
y practicos, en cuanto vuelva a la oficina empiezo con las pruebas =)De nuevo, 
muchas gracias por tu tiempo y tu respuesta!! =DMatiasDate: Wed, 30 May 2007 
19:12:13 -0300From: [EMAIL PROTECTED]: [EMAIL PROTECTED]: [puntonet] 
SqlConnection y GetSchemaHola 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.: 
EmployeeID                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.: OrderID               
 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!
-- Daniel A. CalvinCooperator Team Memberhttp://www.cooperator.com.ar
Microsoft Certified Professional 

_________________________________________________________________
Change is good. See what’s different about Windows Live Hotmail. 
http://www.windowslive-hotmail.com/learnmore/default.html?locale=en-us&ocid=RMT_TAGLM_HMWL_reten_changegood_0507

Responder a