using System; using System.Data; using System.Windows.Forms; using System.Data.SqlClient; using System.Xml.Serialization; using ServerExplorer.Code; using System.Collections.Generic; using ServerExplorer.Code.DataTransfer; using ServerExplorer.Code.DataAccess; using System.IO; namespace ServerExplorer.UI { public partial class FrmBaseDatos : Form { private SqlConnection _cnx; private Config _config; private String _tableSchema; private String _tableName; private void Initialize() { // Establecer conexion txtConString.Text = _config.ConnectionString; _cnx = new SqlConnection(_config.ConnectionString); List tables = TableDA.Table_GetRegs(_config.ConnectionString); lsvTablas.Items.Clear(); foreach (Table table in tables) { ListViewItem item = lsvTablas.Items.Add(table.Schema); item.SubItems.Add(table.Name); item.SubItems.Add(table.Type); } TablesToListView(); lsvColumnas.Items.Clear(); } /// /// Metodo para copiar las tablas seleccionadas en el listview a la configuracion /// private void TablesFromListView() { _config.Tablas.Clear(); foreach (ListViewItem item in lsvTablas.Items) { if (item.Checked) { _config.Tablas.Add(new TablaInfo { Esquema = item.SubItems[0].Text, Nombre = item.SubItems[1].Text }); } } } /// /// Metodo para seleccionar las tablas en le listview desde la configuracion /// private void TablesToListView() { int j; // Desmarcar todos en caso de no haber ninguna tabla if (_config.Tablas.Count == 0) { foreach (ListViewItem item in lsvTablas.Items) item.Checked = false; return; } // Recorrer items marcando los que estan en la configuracion int n = _config.Tablas.Count; int i = j = 0; foreach (ListViewItem item in lsvTablas.Items) { item.Checked = false; do { if (String.Compare(_config.Tablas[i].Esquema, item.SubItems[0].Text, StringComparison.Ordinal) == 0 && String.Compare(_config.Tablas[i].Nombre, item.SubItems[1].Text, StringComparison.Ordinal) == 0) { item.Checked = true; break; } i = (i + 1) % n; } while (i != j); j = i; } } public DatabaseDesc CrearDatabaseDesc() { var db = new DatabaseDesc { Nombre = _cnx.Database }; foreach (TablaInfo t in _config.Tablas) { var td = new TablaDesc(); td.FillDesc(t.Esquema, t.Nombre, _cnx); db.Tablas.Add(td); } return (db); } public FrmBaseDatos(String connectionString) { InitializeComponent(); _config = new Config {ConnectionString = connectionString}; } public FrmBaseDatos(Config config) { InitializeComponent(); _config = config; } private void frmBaseDatos_Load(object sender, EventArgs e) { Initialize(); // Establecer titulos lblTituloDB.Text = _cnx.Database; lblTituloTabla.Text = ""; } private void btnCopiarConString_Click(object sender, EventArgs e) { // Copiar la cadena de conexion al portapapeles Clipboard.SetText(txtConString.Text); } private void lsvTablas_SelectedIndexChanged(object sender, EventArgs e) { if (lsvTablas.SelectedItems.Count != 1) { return; } // Determinar tabla seleccionada ListViewItem item = lsvTablas.SelectedItems[0]; // Recordar tabla seleccionada _tableSchema = item.SubItems[0].Text; _tableName = item.SubItems[1].Text; // Establecer titulo de la lista de columnas lblTituloTabla.Text = _tableSchema + @"." + _tableName; // Obtener descripcion de tabla var td = new TablaDesc(); td.FillDesc(_tableSchema, _tableName, _cnx); // Mostrar "columnas" de las tablas lsvColumnas.Items.Clear(); foreach (ColumnaDesc col in td.Columnas) { ListViewItem subitem = lsvColumnas.Items.Add(col.Nombre); subitem.SubItems.Add(col.Tipo); subitem.SubItems.Add((col.Tamanho >= 0) ? String.Format("{0}", col.Tamanho) : string.Empty); subitem.SubItems.Add(col.Primaria ? "PK" : string.Empty); subitem.SubItems.Add(col.Nullable ? "Null" : "NotNull"); } } private void menuCargar_Click(object sender, EventArgs e) { var dialogo = new OpenFileDialog(); if (dialogo.ShowDialog() == DialogResult.OK) { _config = Config.Cargar(dialogo.FileName); Initialize(); } } private void menuGuardar_Click(object sender, EventArgs e) { var dialogo = new SaveFileDialog(); if (dialogo.ShowDialog() == DialogResult.OK) { TablesFromListView(); _config.Guardar(dialogo.FileName); } } private void menuConfiguracion_Click(object sender, EventArgs e) { //// Llamar a la ventana de configuracion //FrmCodeGenConfig frm = new FrmCodeGenConfig(config); //frm.ShowDialog(); } private void btnVerDatos_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(_tableSchema) || string.IsNullOrEmpty(_tableName)) { return; } // Obtener descripcion de tabla var td = new TablaDesc(); td.FillDesc(_tableSchema, _tableName, _cnx); // Crear y mostrar el formulario de los datos. var form = new FrmDatos(td, _config.ConnectionString); FrmPrincipal.AddForm(form); } private void btnProcs_Click(object sender, EventArgs e) { // Crear y mostrar el formulario de los procedimientos. var form = new FrmProcedimientos(_config.ConnectionString); FrmPrincipal.AddForm(form); } private void btnExec_Click(object sender, EventArgs e) { // Crear y mostrar el formulario de exec. var form = new FrmExec(_config.ConnectionString); FrmPrincipal.AddForm(form); } private void menuBaseDatos_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { } private void btnGenerar_Click(object sender, EventArgs e) { TablesFromListView(); DatabaseDesc db = CrearDatabaseDesc(); var seriador = new XmlSerializer(typeof(DatabaseDesc)); seriador.Serialize(Console.Out, db); //CodeGen.GenerarCodigo(config, db); } private void btnDocGen_Click(object sender, EventArgs e) { // Hacer insensible la ventana Parent.Enabled = false; // Obtener informacion. TablesFromListView(); DatabaseDesc db = CrearDatabaseDesc(); // Escribir documentacion DocGen.GenerarDocumentacion(db); // Hace sensible la ventana Parent.Enabled = true; /* tablas_delistview(); Thread hilo=new Thread(new ThreadStart(instancia.GenerarDoc)); hilo.Start(); */ } public void GenerarDoc() { // Hacer insensible la ventana Enabled = false; // Obtener informacion. DatabaseDesc db = CrearDatabaseDesc(); // Escribir documentacion DocGen.GenerarDocumentacion(db); // Hace sensible la ventana Enabled = true; } private void btnRefresh_Click(object sender, EventArgs e) { Initialize(); } private void btnExportData_Click(object sender, EventArgs e) { // Hacer insensible la ventana Parent.Enabled = false; // Obtener informacion. TablesFromListView(); DatabaseDesc db = CrearDatabaseDesc(); // Preparar cabecera del script var listCmds = new List(); listCmds.Add("SET NOCOUNT ON;"); listCmds.Add(string.Empty); //// Comandos de desactivacion de FKs //foreach (TablaDesc t in db.Tablas) //{ // string tableName = string.Format("{0}.{1}", t.Esquema, t.Nombre); // listCmds.Add(string.Format("ALTER TABLE {0} NOCHECK CONSTRAINT all;", tableName)); //} //listCmds.Add("GO"); //listCmds.Add(string.Empty); // Desactivar todas las FKs listCmds.Add("-- Disable all constraints"); listCmds.Add("EXEC sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'"); listCmds.Add("GO"); listCmds.Add(string.Empty); // Prepara informacion a exportar foreach (TablaDesc t in db.Tablas) { string tableName = string.Format("{0}.{1}", t.Esquema, t.Nombre); listCmds.Add(string.Format("PRINT '*** Importing data of {0}....';", tableName)); List listCmdsTableData = ExportData(tableName); listCmds.AddRange(listCmdsTableData); } //// Comandos de activacion de FKs //foreach (TablaDesc t in db.Tablas) //{ // string tableName = string.Format("{0}.{1}", t.Esquema, t.Nombre); // listCmds.Add(string.Format("ALTER TABLE {0} WITH CHECK CHECK CONSTRAINT all;", tableName)); //} //listCmds.Add("GO"); //listCmds.Add(string.Empty); // Activar todas las FKs listCmds.Add("-- Enable all constraints"); listCmds.Add("EXEC sp_MSforeachtable @command1='print ''?''', @command2='ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'"); listCmds.Add("GO"); listCmds.Add(string.Empty); // Escribir script string fixedDatabaseName = db.Nombre.Replace(' ', '_'); var escritor = new StreamWriter(fixedDatabaseName + ".data.sql"); foreach (string cmd in listCmds) { escritor.WriteLine(cmd); } escritor.Close(); // Hace sensible la ventana Parent.Enabled = true; } private List ExportData(string tableName) { DataTable dtData = Exec(string.Format("SELECT * FROM {0}", tableName)); var listCmds = new List(); List listCmdsInsert = Utiles.DataTable_GenerateInserts(dtData, tableName); listCmds.Add(string.Format("-- {0}", tableName)); listCmds.Add(string.Format("DELETE FROM {0};", tableName)); listCmds.Add(string.Format("DBCC CHECKIDENT ('{0}', RESEED, 0);", tableName)); listCmds.Add(string.Format("SET IDENTITY_INSERT {0} ON;", tableName)); listCmds.AddRange(listCmdsInsert); listCmds.Add(string.Format("SET IDENTITY_INSERT {0} OFF;", tableName)); listCmds.Add("GO"); listCmds.Add(string.Empty); return listCmds; } private DataTable Exec(string cmd) { var cnx = new SqlConnection(_config.ConnectionString); var da = new SqlDataAdapter(cmd, cnx); var dt = new DataTable(); cnx.Open(); da.Fill(dt); cnx.Close(); return dt; } } }