/// <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(); } } } } } }
public System.Data.DataTable Select(qGen.Select selectCommand) { if (this.IsOpen() == false) { this.Open(); } return(this.Select(this.Factory.Formatter.SqlText(selectCommand))); }
/// <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; }
/// <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"); }