Escribir valores BLOB en una base de datos
Un objeto binario grande (BLOB) se puede escribir en una base de datos en forma de datos binarios o de caracteres, según el tipo de campo del origen de datos. Para escribir un valor BLOB en la base de datos, utilice la instrucción INSERT o UPDATE correspondiente y pase el valor BLOB como parámetro de entrada (vea Utilizar procedimientos almacenados con un comando). Si el BLOB se almacena como texto, por ejemplo, un campo text de SQL Server, puede pasar dicho BLOB como parámetro de cadena. Si el BLOB se almacena en formato binario, por ejemplo, un campo image de SQL Server, puede pasar una matriz de tipo byte como parámetro binario.
Nota Un BLOB puede ser bastante grande y, por lo tanto, es posible que utilice una gran cantidad de memoria del sistema cuando se escribe como un único valor, lo que produce una reducción del rendimiento de la aplicación. Para reducir la cantidad de memoria utilizada al escribir un valor BLOB, puede escribir el BLOB en la base de datos en "fragmentos". El proceso de escritura de un BLOB en una base de datos de esta forma depende de las características del origen de datos. Para ver un ejemplo sobre la forma de escribir un valor BLOB en SQL Server en "fragmentos", vea Conservar recursos al escribir valores BLOB en SQL Server.
En el siguiente ejemplo de código se agregan datos de los empleados a la tabla Employees de la base de datos Northwind. Se lee una foto del empleado desde un archivo y se agrega al campo Photo de la tabla, que es un campo image.
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
Public Class EmployeeData
Public Shared Sub Main()
Dim hireDate As DateTime = DateTime.Parse("5/21/99")
AddEmployee("Jones", "Mary", "Sales Representative", hireDate, 5, "jones.bmp")
End Sub
Public Shared Sub AddEmployee(lastName As String, firstName As String, title As String, hireDate As DateTime, _
reportsTo As Integer, photoFilePath As String)
Dim photo() as Byte = GetPhoto(photoFilePath)
Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;")
Dim addEmp As SqlCommand = New SqlCommand("INSERT INTO Employees (LastName, FirstName, Title, HireDate, ReportsTo, Photo) " & _
"Values(@LastName, @FirstName, @Title, @HireDate, @ReportsTo, @Photo)", nwindConn)
addEmp.Parameters.Add("@LastName", SqlDbType.NVarChar, 20).Value = lastName
addEmp.Parameters.Add("@FirstName", SqlDbType.NVarChar, 10).Value = firstName
addEmp.Parameters.Add("@Title", SqlDbType.NVarChar, 30).Value = title
addEmp.Parameters.Add("@HireDate", SqlDbType.DateTime).Value = hireDate
addEmp.Parameters.Add("@ReportsTo", SqlDbType.Int).Value = reportsTo
addEmp.Parameters.Add("@Photo", SqlDbType.Image, photo.Length).Value = photo
nwindConn.Open()
addEmp.ExecuteNonQuery()
nwindConn.Close()
End Sub
Public Shared Function GetPhoto(filePath As String) As Byte()
Dim fs As FileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)
Dim br As BinaryReader = new BinaryReader(fs)
Dim photo() As Byte = br.ReadBytes(fs.Length)
br.Close()
fs.Close()
Return photo
End Function
End Class
[C#]
using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;
public class EmployeeData
{
public static void Main()
{
DateTime hireDate = DateTime.Parse("5/21/99");
AddEmployee("Jones", "Mary", "Sales Representative", hireDate, 5, "jones.bmp");
}
public static void AddEmployee(string lastName, string firstName, string title, DateTime hireDate , int reportsTo, string photoFilePath)
{
byte[] photo = GetPhoto(photoFilePath);
SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;");
SqlCommand addEmp = new SqlCommand("INSERT INTO Employees (LastName, FirstName, Title, HireDate, ReportsTo, Photo) " +
"Values(@LastName, @FirstName, @Title, @HireDate, @ReportsTo, @Photo)", nwindConn);
addEmp.Parameters.Add("@LastName", SqlDbType.NVarChar, 20).Value = lastName;
addEmp.Parameters.Add("@FirstName", SqlDbType.NVarChar, 10).Value = firstName;
addEmp.Parameters.Add("@Title", SqlDbType.NVarChar, 30).Value = title;
addEmp.Parameters.Add("@HireDate", SqlDbType.DateTime).Value = hireDate;
addEmp.Parameters.Add("@ReportsTo", SqlDbType.Int).Value = reportsTo;
addEmp.Parameters.Add("@Photo", SqlDbType.Image, photo.Length).Value = photo;
nwindConn.Open();
addEmp.ExecuteNonQuery();
nwindConn.Close();
}
public static byte[] GetPhoto(string filePath)
{
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
byte[] photo = br.ReadBytes((int)fs.Length);
br.Close();
fs.Close();
return photo;
}
}
Vea también
Utilizar proveedores de datos de .NET Framework para obtener acceso a datos | Obtener valores BLOB a partir de una base de datos | OleDbCommand (Clase) | OdbcCommand (Clase) | SqlCommand (Clase)