예제 #1
0
        /// <summary>
        /// Exporta los campos binarios de una tabla en archivos.
        /// </summary>
        public void ExportBlobs(qGen.Select ComandoSelect, string Carpeta)
        {
            if (char.Parse(Carpeta.Substring(Carpeta.Length - 1, 1)) != System.IO.Path.DirectorySeparatorChar)
            {
                Carpeta += System.Convert.ToString(System.IO.Path.DirectorySeparatorChar);
            }

            using (System.Data.DataTable Tabla = Lfx.Workspace.Master.MasterConnection.Select(ComandoSelect.ToString())) {
                foreach (System.Data.DataRow Registro in Tabla.Rows)
                {
                    foreach (System.Data.DataColumn Campo in Tabla.Columns)
                    {
                        if (Campo.DataType.Name == "Byte[]" && Registro[Campo.ColumnName] != null && ((byte[])(Registro[Campo.ColumnName])).Length > 5)
                        {
                            byte[] Contenido     = ((byte[])(Registro[Campo.ColumnName]));
                            string NombreArchivo = ComandoSelect.Tables + "_" + Campo.ColumnName + "_" + Registro[0].ToString() + ".blb";
                            using (System.IO.FileStream Archivo = new System.IO.FileStream(Carpeta + NombreArchivo, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write)) {
                                Archivo.Write(Contenido, 0, Contenido.Length);
                                Archivo.Close();
                            }

                            using (System.IO.FileStream Archivo = new System.IO.FileStream(Carpeta + "blobs.lst", System.IO.FileMode.Append, System.IO.FileAccess.Write)) {
                                System.IO.StreamWriter Escribidor = new System.IO.StreamWriter(Archivo);
                                Escribidor.WriteLine(ComandoSelect.Tables + "," + Campo.ColumnName + "," + Tabla.Columns[0].ColumnName + "='" + Registro[0].ToString() + "'," + NombreArchivo);
                                Escribidor.Close();
                                Archivo.Close();
                            }
                        }
                    }
                }
            }
        }
예제 #2
0
        public System.Data.DataTable Select(qGen.Select selectCommand)
        {
            if (this.IsOpen() == false)
            {
                this.Open();
            }

            return(this.Select(this.Factory.Formatter.SqlText(selectCommand)));
        }
예제 #3
0
        /// <summary>
        /// Exporta una tabla a un archivo de texto con una secuencia de comandos SQL.
        /// </summary>
        public void ExportTable(qGen.Select Comando, bool ExportarBlobs, System.IO.StreamWriter writer)
        {
            System.Data.DataTable Tabla = Lfx.Workspace.Master.MasterConnection.Select(Comando);

            string NombresCampos = null;

            // Hago un dump de los campos
            foreach (System.Data.DataColumn Campo in Tabla.Columns)
            {
                if (NombresCampos == null)
                {
                    NombresCampos = Campo.ColumnName;
                }
                else
                {
                    NombresCampos += ", " + Campo.ColumnName;
                }
            }

            foreach (System.Data.DataRow Registro in Tabla.Rows)
            {
                string Valores = "";
                foreach (System.Data.DataColumn Campo in Tabla.Columns)
                {
                    string Valor = "";
                    if (Registro[Campo.ColumnName] == DBNull.Value || Registro[Campo.ColumnName] == null)
                    {
                        Valor = "NULL";
                    }
                    else
                    {
                        switch (Campo.DataType.Name)
                        {
                        case "Byte[]":
                            if (ExportarBlobs)
                            {
                                // FIXME: exportar BLOBS
                            }
                            else
                            {
                                Valor = "NULL";
                            }
                            break;

                        case "SByte":
                        case "Byte":
                        case "Int16":
                        case "Int32":
                        case "Int64":
                            Valor = Registro[Campo.ColumnName].ToString();
                            break;

                        case "Single":
                        case "Double":
                            Valor = System.Convert.ToDouble(Registro[Campo.ColumnName]).ToString(System.Globalization.CultureInfo.InvariantCulture);
                            break;

                        case "Decimal":
                            Valor = System.Convert.ToDecimal(Registro[Campo.ColumnName]).ToString(System.Globalization.CultureInfo.InvariantCulture);
                            break;

                        case "DateTime":
                            Valor = "'" + Lfx.Types.Formatting.FormatDateTimeSql(System.Convert.ToDateTime(Registro[Campo.ColumnName])) + "'";
                            break;

                        case "String":
                            Valor = "'" + Lfx.Workspace.Master.MasterConnection.EscapeString(System.Convert.ToString(Registro[Campo.ColumnName])).Replace("\r", @"\r").Replace("\n", @"\n") + "'";
                            break;

                        default:
                            Lfx.Workspace.Master.RunTime.Toast("No se puede restaurar campo tipo " + Campo.DataType.Name, "Error");
                            Valor = "'" + Lfx.Workspace.Master.MasterConnection.EscapeString(Registro[Campo.ColumnName].ToString()) + "'";
                            break;
                        }
                    }
                    //Quito el primer ", "
                    Valores += ", " + Valor;
                }
                Valores = Valores.Substring(2, Valores.Length - 2);
                writer.WriteLine("$INSERTORREPLACE$ " + Comando.Tables + " (" + NombresCampos + ") VALUES (" + Valores + ")" + ";");
            }
            writer.WriteLine("");
            writer.WriteLine("");
            return;
        }
예제 #4
0
        /// <summary>
        /// Exporta una tabla en un formato binario propietario, incluyendo BLOBs.
        /// </summary>
        public void ExportTableBin(string nombreTabla, BackupWriter writer)
        {
            qGen.Select           Comando     = new qGen.Select(nombreTabla);
            System.Data.DataTable TablaBackup = Lfx.Workspace.Master.MasterConnection.Select(Comando);

            bool EmitiTabla = false;

            string[] Fields = null;
            foreach (System.Data.DataRow RegistroBackup in TablaBackup.Rows)
            {
                if (EmitiTabla == false)
                {
                    Fields = new string[TablaBackup.Columns.Count];
                    for (int i = 0; i < TablaBackup.Columns.Count; i++)
                    {
                        Fields[i] = TablaBackup.Columns[i].ColumnName;
                    }
                    string FieldList = string.Join(",", Fields);
                    writer.Write(":TBL" + Comando.Tables[0].Name.Length.ToString("0000") + Comando.Tables[0].Name);
                    writer.Write(":FDL" + FieldList.Length.ToString("0000") + FieldList);
                    EmitiTabla = true;
                }
                writer.Write(":ROW");

                for (int i = 0; i < TablaBackup.Columns.Count; i++)
                {
                    object ValorOrigen     = RegistroBackup[Fields[i]];
                    string TipoCampoOrigen = ValorOrigen.GetType().ToString().Replace("System.", "");
                    string TipoCampoDestino;
                    switch (TipoCampoOrigen)
                    {
                    case "Byte[]":
                        TipoCampoDestino = "B";
                        break;

                    case "SByte":
                    case "Byte":
                    case "Int16":
                    case "Int32":
                    case "Int64":
                        ValorOrigen      = ValorOrigen.ToString();
                        TipoCampoDestino = "I";
                        break;

                    case "Single":
                    case "Double":
                        double ValDouble = System.Convert.ToDouble(ValorOrigen);
                        ValorOrigen      = ValDouble.ToString(System.Globalization.CultureInfo.InvariantCulture);
                        TipoCampoDestino = "N";
                        break;

                    case "Decimal":
                        decimal ValDecimal = System.Convert.ToDecimal(ValorOrigen);
                        ValorOrigen      = ValDecimal.ToString(System.Globalization.CultureInfo.InvariantCulture);
                        TipoCampoDestino = "N";
                        break;

                    case "DateTime":
                        ValorOrigen      = ((DateTime)ValorOrigen).ToString(Lfx.Types.Formatting.DateTime.SqlDateTimeFormat);
                        TipoCampoDestino = "D";
                        break;

                    case "String":
                        TipoCampoDestino = "S";
                        break;

                    case "DBNull":
                        TipoCampoDestino = "U";
                        ValorOrigen      = "";
                        break;

                    default:
                        TipoCampoDestino = "S";
                        ValorOrigen      = ValorOrigen.ToString();
                        break;
                    }

                    byte[] ValorDestino;

                    if (ValorOrigen is byte[])
                    {
                        ValorDestino = (byte[])ValorOrigen;
                    }
                    else if (ValorOrigen is string)
                    {
                        ValorDestino = System.Text.Encoding.UTF8.GetBytes((string)ValorOrigen);
                    }
                    else
                    {
                        throw new NotImplementedException();
                    }

                    writer.Write(":FLD" + TipoCampoDestino + ValorDestino.Length.ToString("00000000"));
                    if (ValorDestino.Length > 0)
                    {
                        writer.Write(ValorDestino);
                    }
                }
                writer.Write(".ROW");
                //writer.Write(":REM0002" + Lfx.Types.ControlChars.CrLf);
            }

            writer.Write(".TBL");
        }