2011-02-04 62 views
5

Tengo que mantener un .csv en mi base de datos, pero para una aplicación más comprobable prefiero no usar procedimientos. Básicamente, solo genero un archivo y la siguiente instrucción se coloca en la base de datos.Insertar blob en la base de datos Oracle con C#

¿Alguien tiene alguna pista sobre la mejor manera de hacer esto en el código?

+1

Para mayor claridad, está buscando la cadena SQL para insertar el BLOB o, el C# tipo de datos a usar cuando se manejan datos BLOB? Si el más tarde, creo que es una matriz de bytes. –

+0

Debe utilizar ** Oracle Data Provider for .NET ** en su proyecto C#. Hay muchas clases útiles con todas las funcionalidades necesarias. http://www.oracle.com/technetwork/topics/dotnet/index-085163.html – Johnny

+1

Garotão: http://blog.calyptus.eu/seb/2009/03/large-object-storage-for-nhibernate- and-ddd-part-1-blobs-clobs-and-xlobs/ – Fernando

Respuesta

7

Aquí hay un ejemplo para insertar datos de blobs en Oracle usando C# y procedimientos (usted dice que prefiere eso significa que puede).

using System; 
using System.Data; 
using Oracle.DataAccess.Client; 
using Oracle.DataAccess.Types; 
using System.IO; 
using System.Text; 

//Step 1 
// Connect to database 
// Note: Modify User Id, Password, Data Source as per your database setup 
string constr = "User Id=Scott;Password=tiger;Data Source=orcl9i"; 

OracleConnection con = new OracleConnection(constr); 
con.Open(); 
Console.WriteLine("Connected to database!"); 

// Step 2 
// Note: Modify the Source and Destination location 
// of the image as per your machine settings 
String SourceLoc = "D:/Images/photo.jpg"; 
String DestinationLoc = "D:/Images/TestImage.jpg"; 

// provide read access to the file 

FileStream fs = new FileStream(SourceLoc, FileMode.Open,FileAccess.Read); 

// Create a byte array of file stream length 
byte[] ImageData = new byte[fs.Length]; 

//Read block of bytes from stream into the byte array 
fs.Read(ImageData,0,System.Convert.ToInt32(fs.Length)); 

//Close the File Stream 
fs.Close(); 

// Step 3 
// Create Anonymous PL/SQL block string 
String block = " BEGIN " + 
       " INSERT INTO testblob (id, photo) VALUES (100, :1); " + 
       " SELECT photo into :2 from testblob WHERE id = 100; " + 
       " END; "; 

// Set command to create Anonymous PL/SQL Block 
OracleCommand cmd = new OracleCommand(); 
cmd.CommandText = block; 
cmd.Connection = con; 


// Since executing an anonymous PL/SQL block, setting the command type 
// as Text instead of StoredProcedure 
cmd.CommandType = CommandType.Text; 

// Step 4 
// Setting Oracle parameters 

// Bind the parameter as OracleDbType.Blob to command for inserting image 
OracleParameter param = cmd.Parameters.Add("blobtodb", OracleDbType.Blob); 
param.Direction = ParameterDirection.Input; 


// Assign Byte Array to Oracle Parameter 
param.Value = ImageData; 

// Bind the parameter as OracleDbType.Blob to command for retrieving the image 
OracleParameter param2 = cmd.Parameters.Add("blobfromdb", OracleDbType.Blob); 
param2.Direction = ParameterDirection.Output; 

// Step 5 
// Execute the Anonymous PL/SQL Block 

// The anonymous PL/SQL block inserts the image to the 
// database and then retrieves the images as an output parameter 
cmd.ExecuteNonQuery(); 
Console.WriteLine("Image file inserted to database from " + SourceLoc); 

// Step 6 
// Save the retrieved image to the DestinationLoc in the file system 

// Create a byte array 
byte[] byteData = new byte[0]; 

// fetch the value of Oracle parameter into the byte array 
byteData = (byte[])((OracleBlob)(cmd.Parameters[1].Value)).Value; 

// get the length of the byte array 
int ArraySize = new int(); 
ArraySize = byteData.GetUpperBound(0); 

// Write the Blob data fetched from database to the filesystem at the 
// destination location 
FileStream fs1 = new FileStream(@DestinationLoc, 
           FileMode.OpenOrCreate, FileAccess.Write); 
fs1.Write(byteData, 0,ArraySize); 
fs1.Close(); 

Console.WriteLine("Image saved to " + DestinationLoc + " successfully !"); 
Console.WriteLine(""); 
Console.WriteLine("***********************************************************"); 
Console.WriteLine("Before running this application again, execute 'Listing 1' "); 
+0

No tengo una ubicación de código codificada cuando el cliente carga el archivo. Entonces, ¿cómo puedo abrir ese archivo ya que no tengo la ruta completa para abrir el archivo con el objeto filestream? –

4
private void btnSave_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      //Read Image Bytes into a byte array 
      byte[] blob = ReadFile(txtPath.Text); 

      //Initialize Oracle Server Connection 
      con = new OracleConnection(conString); 

      //Set insert query 
      string qry = "insert into Imgpn (imgpath,photo) values('" + txtPath.Text + "'," + " :BlobParameter)"; 
      OracleParameter blobParameter = new OracleParameter(); 
      blobParameter.OracleType = OracleType.Blob; 
      blobParameter.ParameterName = "BlobParameter"; 
      blobParameter.Value = blob; 

      //Initialize OracleCommand object for insert. 
      cmd = new OracleCommand(qry, con); 

      //We are passing Name and Blob byte data as Oracle parameters. 
      cmd.Parameters.Add(blobParameter); 

      //Open connection and execute insert query. 
      con.Open(); 
      cmd.ExecuteNonQuery(); 

      MessageBox.Show("Image added to blob field"); 
      GetImagesFromDatabase(); 
      cmd.Dispose(); 
      con.Close(); 
      //this.Close(); 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 
    byte[] ReadFile(string sPath) 
    { 
     //Initialize byte array with a null value initially. 
     byte[] data = null; 

     //Use FileInfo object to get file size. 
     FileInfo fInfo = new FileInfo(sPath); 
     long numBytes = fInfo.Length; 

     //Open FileStream to read file 
     FileStream fStream = new FileStream(sPath, FileMode.Open, FileAccess.Read); 

     //Use BinaryReader to read file stream into byte array. 
     BinaryReader br = new BinaryReader(fStream); 

     //When you use BinaryReader, you need to supply number of bytes to read from file. 
     //In this case we want to read entire file. So supplying total number of bytes. 
     data = br.ReadBytes((int)numBytes); 
     return data; 
    } 
    void GetImagesFromDatabase() 
    { 
     try 
     { 
      //Initialize Oracle connection. 
      con = new OracleConnection(conString); 
      //MessageBox.Show("Connection Successfull"); 
      //Initialize Oracle adapter. 
      OracleDataAdapter oda = new OracleDataAdapter("Select * from Imgpn", con); 

      //Initialize Dataset. 
      DataSet DS = new DataSet(); 

      //Fill dataset with ImagesStore table. 
      oda.Fill(DS, "Imgpn"); 

      //Fill Grid with dataset. 

      dataGridView1.DataSource = DS.Tables["Imgpn"]; 
      // 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 

aquí es la forma sencilla de insertar una imagen en ane base de datos Oracle recuperar espectáculo ane en DataGridView

+0

Debe ser '.OracleDbType', no' .OracleType', en 'blobParameter'. – vapcguy

+0

Su código es vulnerable a [Inyección SQL] (https://www.troyhunt.com/2013/07/everything-you-wanted-to-know-about-sql.html). ** NUNCA ** usa la concatenación de cadenas para crear una consulta SQL. ** SIEMPRE ** usa una consulta parametrizada. –

Cuestiones relacionadas