Het lezen en schrijven van een bestand en naar een BLOB-kolom met opdelen in ADO.NET en Visual c#.NETTO

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 317043 - Bekijk de producten waarop dit artikel van toepassing is.
Voor een Microsoft Visual Basic.Net werk versie van dit artikel, Zie317034.
Voor een Microsoft Visual C++ .NETTO-versie van dit artikel, raadpleegt u317044.
Alles uitklappen | Alles samenvouwen

Op deze pagina

Samenvatting

In dit stapsgewijze artikel wordt beschreven hoe u de Microsoft SQL Server READTEXT en UPDATETEXT-instructies te lezen en schrijven van gegevens uit kolommen BLOB (LongVarBinary) in een data base tabel.

Als gevolg van net werk beperkingen u wellicht een groot BLOB-bestand in kleinere ophalen segmenten gedownload en vervolgens de segmenten elkaar in plaats van het ophalen van de hele BLOB stuk bestand in één keer. Echter, ADO.Geen netto gegevensprovidersGetChunkenAppendChunkmethoden beschikbaar voor het DAO (Data Access Object) en ActiveX Data Objects (ADO)Record setobjecten. Dit artikel beschrijft verschillende manieren om gegevens op te halen in kleinere delen.

Notities:
  • Dit artikel bevat voorbeelden voor zowel de SqlClient-Data Provider en de OLE DB.NETTO-gegevensprovider. De enige verschillen, afgezien van klasse namen, worden de verbindingsreeksen en de verklaring van SQL-parameters. De fundamentele techniek voor het ophalen van de instructies READTEXT en UPDATETEXT is hetzelfde.
  • De Test record in de tabel categorieën van het Noorden voorbeeld data base bestaat niet. U moet de Server Explorer of een andere hulp programma voor het toevoegen van een record met deCategorie naamingesteld opTest. Nadat u de volgende voorbeelden gebruiken, kunt u deze verwijderen record uit de data base. Typ de volgende opdracht in om de record te verwijderen, SQL Query Analyzer, en druk vervolgens op F5:
    use Northwind
    delete from Categories where CategoryName = 'Test'
    					

Vereisten

De volgende items beschrijven de aanbevolen hardware, software, net werk infrastructuur, vaardigheden en kennis en service packs die zijn vereist:
  • Microsoft Windows 2000 Professional, Windows 2000 Server Windows 2000 Advanced Server of Microsoft Windows NT 4. 0 Server
  • Microsoft Visual Studio.NETTO
  • Microsoft SQL Server 7. 0 of hoger
In dit artikel wordt ervan uitgegaan dat u bekend met ADO bent.NETTO basis begrippen en syntaxis.

Een project maken en toevoegen code

  1. Open SQL Query Analyzer.
  2. Typ de volgende opdracht en druk op F5 als u wilt wijzigen de standaard data base Noorden wind:
    use Northwind
  3. Typ de volgende opdracht en druk op F5 om een nieuwe invoegen record in de tabel categorieën van de Noordenwind-database:
    Insert into categories(categoryname) values ('Test')
    OpmerkingU hoeft deze record toevoegen aan de tabel categorieën als u in dit voorbeeld gebruiken zonder aanpassing van de bestaande gegevens in deze tabel.
  4. In Visual Studio.Net werk, maakt u een nieuwe Visual c#.Windows NET Application-project.
  5. Athe boven aan het bestand Form1.cs en voeg de volgende twee regels code verwijzingen naar uw project toevoegenSystem.data.SqlClientenSystem.data.OLEDB:
    using System.Data.SqlClient;
    using System.Data.OleDb;
  6. Voeg vier knoppen toe aan Form1. Wijziging deTeksteigenschap van de knoppenSQLBlob2File,OlDbBlob2File,File2OleDbBlob, enFile2SqlBlob, respectievelijk.
  7. Toevoegen van de volgende teken reeks declaraties van variabelen onder de Public class Form1:
    string destfilepath;
    string sourcefilepath;
    					
  8. Plak de volgende code in het formulierBelastinggebeurtenis:
    destfilepath = @"c:\mytest.bmp";
    sourcefilepath = @"c:\windows\coffee bean.bmp";
    					
  9. De procedures worden aangeroepen deKlik opgebeurtenis voor elke knop:
    // Click event for the button labeled SqlBlob2File.
    SqlChunkBlob2File(destfilepath);
    
    // Click event for the button labeled OLDbBlob2File.
    OlDbChunkBlob2File(destfilepath);
    
    // Click event for the button labeled File2OleDbBlob.
    ChunkFile2OleDbBlob(sourcefilepath);
    
    //Click event for the button labeled File2SqlBlob.
    ChunkFile2SqlBlob(sourcefilepath);
    					
  10. Plak de volgende vier functies in Form1:
    public void SqlChunkBlob2File(string DestFilePath)
    {
       try
       {
    	int PictureCol  = 0;  // position of Picture column in DataReader
    	int BUFFER_LENGTH  = 32768; // chunk size
    	SqlConnection cn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;");
    			
    	// Make sure Photo is non-NULL and return TEXTPTR to it.
    			
    	SqlCommand cmdGetPointer = new SqlCommand("SELECT @Pointer=TEXTPTR(Picture), @Length=DataLength(Picture) FROM Categories WHERE CategoryName='Test'", cn);
    	SqlParameter PointerOutParam = cmdGetPointer.Parameters.Add("@Pointer", SqlDbType.VarBinary, 100);
    	PointerOutParam.Direction = ParameterDirection.Output;
    	SqlParameter LengthOutParam  = cmdGetPointer.Parameters.Add("@Length", SqlDbType.Int);
    	LengthOutParam.Direction = ParameterDirection.Output;
    	cn.Open();
    	cmdGetPointer.ExecuteNonQuery();
    	if(PointerOutParam.Value == null) 
    	{
    		cn.Close();
    		// Add code to handle NULL BLOB.
    		return;
    	}
    			
    	// Set up READTEXT command, parameters, and open BinaryReader.
    			
    	SqlCommand cmdReadBinary = new SqlCommand("READTEXT Categories.Picture @Pointer @Offset @Size HOLDLOCK", cn);
    	SqlParameter PointerParam  = cmdReadBinary.Parameters.Add("@Pointer", SqlDbType.Binary, 16);
    	SqlParameter OffsetParam  = cmdReadBinary.Parameters.Add("@Offset", SqlDbType.Int);
    	SqlParameter SizeParam  = cmdReadBinary.Parameters.Add("@Size", SqlDbType.Int);
    	SqlDataReader dr; 
    	System.IO.FileStream fs = new System.IO.FileStream(DestFilePath, System.IO.FileMode.Create, System.IO.FileAccess.Write);
    	int Offset= 0;
    	OffsetParam.Value = Offset;
    	Byte []Buffer = new Byte[BUFFER_LENGTH ];
    
    			
    	// Read buffer full of data and write to the file stream.
    			
    	do
    	{
    		PointerParam.Value = PointerOutParam.Value;
    				
    		// Calculate buffer size - may be less than BUFFER_LENGTH for last block.
    				
    		if( (Offset + BUFFER_LENGTH) >= System.Convert.ToInt32(LengthOutParam.Value)) 
    			SizeParam.Value = System.Convert.ToInt32(LengthOutParam.Value) - Offset;
    		else SizeParam.Value = BUFFER_LENGTH;
    				
    		dr = cmdReadBinary.ExecuteReader(CommandBehavior.SingleResult);
    		dr.Read();
    		dr.GetBytes(PictureCol, 0, Buffer, 0, System.Convert.ToInt32(SizeParam.Value));
    		dr.Close();
    		fs.Write(Buffer, 0, System.Convert.ToInt32(SizeParam.Value));
    		Offset += System.Convert.ToInt32(SizeParam.Value);
    		OffsetParam.Value = Offset;
    	}while(Offset < System.Convert.ToInt32(LengthOutParam.Value));
    
    	fs.Close();
    	cn.Close();
       }
       catch(SqlException ex)
       {
       MessageBox.Show (ex.Message);
       }
    }
    
    public void OleDbChunkBlob2File(string DestFilePath)
    {
       try
       {
    	int PictureCol= 0; // Position of picture column in DataReader.
    	int BUFFER_LENGTH = 32768;// Chunk size.
    	OleDbConnection cn = new OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;");
    			
    	// Make sure Photo is non-NULL and return TEXTPTR to it.
    		
    	OleDbCommand cmdGetPointer = new OleDbCommand("SELECT ?=TEXTPTR(Picture), ?=DataLength(Picture) FROM Categories WHERE CategoryName='Test'", cn);
    	OleDbParameter PointerOutParam =  cmdGetPointer.Parameters.Add("@Pointer", OleDbType.VarBinary, 100);
    	PointerOutParam.Direction = ParameterDirection.Output;
    	OleDbParameter LengthOutParam = cmdGetPointer.Parameters.Add("@Length", OleDbType.Integer);
    	LengthOutParam.Direction = ParameterDirection.Output;
    	cn.Open();
    	cmdGetPointer.ExecuteNonQuery();
    if(PointerOutParam.Value == DBNull.Value )
    	{
    		cn.Close();
    		// Add code to deal with NULL BLOB.
    		return;
    	}
    			
    	// Set up READTEXT command, parameters, and open BinaryReader.
    			
    	OleDbCommand cmdReadBinary = new OleDbCommand("READTEXT Categories.Picture ? ? ? HOLDLOCK", cn);
    	OleDbParameter PointerParam  = cmdReadBinary.Parameters.Add("@Pointer", OleDbType.Binary, 16);
    	OleDbParameter OffsetParam  = cmdReadBinary.Parameters.Add("@Offset", OleDbType.Integer);
    	OleDbParameter SizeParam  = cmdReadBinary.Parameters.Add("@Size", OleDbType.Integer);
    	OleDbDataReader dr;
    	System.IO.FileStream fs = new System.IO.FileStream(DestFilePath, System.IO.FileMode.Create, System.IO.FileAccess.Write);
    	int Offset= 0;
    	OffsetParam.Value = Offset;
    	Byte[] Buffer = new Byte[BUFFER_LENGTH];
    			
    	//Read buffer full of data and write to the file stream.
    			
    	do
    	{
    		PointerParam.Value = PointerOutParam.Value;
    				
    		// Calculate buffer size - may be less than BUFFER_LENGTH for last block.
    				
    		if((Offset + BUFFER_LENGTH) >= System.Convert.ToInt32(LengthOutParam.Value))
    			SizeParam.Value = System.Convert.ToInt32(LengthOutParam.Value) - Offset;
    		else SizeParam.Value = BUFFER_LENGTH;
    				
    		dr = cmdReadBinary.ExecuteReader(CommandBehavior.SingleResult);
    		dr.Read();
    		dr.GetBytes(PictureCol, 0, Buffer, 0, System.Convert.ToInt32(SizeParam.Value));
    		dr.Close();
    		fs.Write(Buffer, 0, System.Convert.ToInt32(SizeParam.Value));
    		Offset += System.Convert.ToInt32(SizeParam.Value);
    		OffsetParam.Value = Offset;
    	}while( Offset < System.Convert.ToInt32(LengthOutParam.Value));
    
    	fs.Close();
    	cn.Close();
       }
       catch(OleDbException ex)
       {
       MessageBox.Show (ex.Message);
       }
    }
    				
  11. Druk op F5 om de code uitvoeren en klik vervolgens opFile2OleDbBlobom ervoor te zorgen dat u een afbeelding in de SQL laden Data serverdatabase voordat u probeert te schrijven naar een bmp-bestand op de schijf.

Lezen segmenten gedownload vanaf een BLOB-kolom

De volgende functies gebruikt u de instructie SQL Server READTEXT en Data Reader een gedeelte van de BLOB waarde in een enkele rij ophalen rijenset van één kolom. Twee opdrachten worden gebruikt: haalt de grootte van de eerste het BLOB-veld en een verwijzing naar de locatie; de tweede voert de READTEXT opdracht. De opdracht READTEXT haalt het segment van de gegevens in een matrix van bytes en verhoogt een verschuiving. De Byte-array wordt wegge schreven naar de schijf via deSystem.IO.Filesreamobject.

Delen naar een BLOB schrijven kolom

De volgende functies gebruiken deOpdrachtenParameterobjecten en SQL Server UPDATETEXT-instructie schrijven segmenten van gegevens van een matrix van bytes naar een BLOB-kolom. De BLOB-kolom mag geen NULL met Deze methode, zodat één byte wordt toegewezen aan de kolom voordat TEXTPTR opgehaald. Op de eerste uitvoering van de instructie UPDATETEXTDeleteParam.Valueis ingesteld op 1. Hiermee verwijdert u de bestaande byte van de kolom voor het segment invoegen en voorkomt het BLOB overbodige gegevens toegevoegd. De instructie UPDATETEXT wordt meerdere malen uitgevoerd de verschuiving van de grootte van de buffer verhoogd na elk gesprek.
private void ChunkFile2SqlBlob(string SourceFilePath)
{
   try
   {
	int BUFFER_LENGTH = 32768; // Chunk size.
	SqlConnection cn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;");
			
	// Make sure Photo is non-NULL and return TEXTPTR to it.
		
	SqlCommand cmdGetPointer = new SqlCommand("SET NOCOUNT ON;UPDATE Categories SET Picture = 0x0 WHERE CategoryName='Test';" +
					"SELECT @Pointer=TEXTPTR(Picture) FROM Categories WHERE CategoryName='Test'", cn);
	SqlParameter PointerOutParam  = cmdGetPointer.Parameters.Add("@Pointer", SqlDbType.VarBinary, 100);
	PointerOutParam.Direction = ParameterDirection.Output;
	cn.Open();
	cmdGetPointer.ExecuteNonQuery();
		
	// Set up UPDATETEXT command, parameters, and open BinaryReader.
			
	SqlCommand cmdUploadBinary = new SqlCommand("UPDATETEXT Categories.Picture @Pointer @Offset @Delete WITH LOG @Bytes", cn);
	SqlParameter PointerParam  = cmdUploadBinary.Parameters.Add("@Pointer", SqlDbType.Binary, 16);
	SqlParameter OffsetParam= cmdUploadBinary.Parameters.Add("@Offset", SqlDbType.Int);
	SqlParameter DeleteParam = cmdUploadBinary.Parameters.Add("@Delete", SqlDbType.Int);
	DeleteParam.Value = 1;  // delete 0x0 character
				SqlParameter BytesParam  = cmdUploadBinary.Parameters.Add("@Bytes", SqlDbType.Binary, BUFFER_LENGTH);
	System.IO.FileStream fs = new System.IO.FileStream(SourceFilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
	System.IO.BinaryReader br = new System.IO.BinaryReader(fs);
	int Offset = 0;
	OffsetParam.Value = Offset;

			
	// Read buffer full of data and execute UPDATETEXT statement.
			
	Byte [] Buffer = br.ReadBytes(BUFFER_LENGTH);
	while(Buffer.Length > 0)
	{
		PointerParam.Value = PointerOutParam.Value;
		BytesParam.Value = Buffer;
		cmdUploadBinary.ExecuteNonQuery();
		DeleteParam.Value = 0; //Do not delete any other data.
		Offset += Buffer.Length;
		OffsetParam.Value = Offset;
		Buffer = br.ReadBytes(BUFFER_LENGTH);
	}

	br.Close();
	fs.Close();
	cn.Close();
   }
   catch(SqlException ex)
   {
   MessageBox.Show (ex.Message);
   }			
}

public void ChunkFile2OleDbBlob(string SourceFilePath)
{
   try
   {	
         int BUFFER_LENGTH = 32768; // chunk size
	OleDbConnection cn = new OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;");
		
	// Make sure Photo is non-NULL and return TEXTPTR to it.
		
	OleDbCommand cmdGetPointer = new OleDbCommand("SET NOCOUNT ON;UPDATE Categories SET Picture = 0x0 WHERE CategoryName='Test';" +
				"SELECT ?=TEXTPTR(Picture) FROM Categories WHERE CategoryName='Test'", cn);
	OleDbParameter PointerOutParam = cmdGetPointer.Parameters.Add("@Pointer", OleDbType.VarBinary, 100);
	PointerOutParam.Direction = ParameterDirection.Output;
	cn.Open();
	cmdGetPointer.ExecuteNonQuery();
			
	// Set up UPDATETEXT command, parameters, and open BinaryReader.
			
	OleDbCommand cmdUploadBinary = new OleDbCommand("UPDATETEXT Categories.Picture ? ? ? WITH LOG ?", cn);
	OleDbParameter PointerParam = cmdUploadBinary.Parameters.Add("@Pointer", OleDbType.Binary, 16);
	OleDbParameter OffsetParam = cmdUploadBinary.Parameters.Add("@Offset", OleDbType.Integer);
	OleDbParameter DeleteParam   = cmdUploadBinary.Parameters.Add("@Delete", OleDbType.Integer);
	DeleteParam.Value = 1;  // delete 0x0 character
	OleDbParameter BytesParam = cmdUploadBinary.Parameters.Add("@Bytes", OleDbType.Binary, BUFFER_LENGTH);
	System.IO.FileStream fs = new System.IO.FileStream(SourceFilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
	System.IO.BinaryReader br = new System.IO.BinaryReader(fs);
	int Offset= 0;
	OffsetParam.Value = Offset;

			
	// Read buffer full of data and execute UPDATETEXT statement.
			
         Byte[] Buffer = br.ReadBytes(BUFFER_LENGTH);
	while(Buffer.Length > 0)
	{
		PointerParam.Value = PointerOutParam.Value;
		BytesParam.Value = Buffer;
		cmdUploadBinary.ExecuteNonQuery();
		DeleteParam.Value = 0;// Do not delete any other data.
		Offset += Buffer.Length;
		OffsetParam.Value = Offset;
		Buffer = br.ReadBytes(BUFFER_LENGTH);
	}

	br.Close();
	fs.Close();
	cn.Close();		
   }
   catch(OleDbException ex)
   {
   MessageBox.Show (ex.Message);
   }
}
				
Notities
  • De code die wordt beschreven in dit artikel mogelijk niet geschikt voor gebruik tegen LongVarChar of LongVarWChar kolommen zonder wijziging.
  • U moet de verbindingsreeks en de SQL-instructies aanpassen overeen te komen met uw eigen server. U moet ook toevoegen als u fout controle als uw query retourneert geen records.
  • READTEXT en UPDATETEXT zijn specifiek voor Microsoft SQL Server. Andere data base systemen mogelijk vergelijkbare opdrachten die u kunt gebruik.

Referenties

Voor meer informatie over het lezen en schrijven van gegevens zonder Chunking, klikt u op de volgende artikel nummers in de Microsoft Knowledge Base:
316887Het lezen en schrijven van een bestand en naar een BLOB-kolom met behulp van ADO.NET en Visual Basic.NETTO
317017Het lezen en schrijven van een bestand en naar een BLOB-kolom met behulp van ADO.NET en Visual C++.NETTO
317016Het lezen en schrijven van een bestand of naar een BLOB-kolom met behulp van ADO.NET en Visual c#.NETTO
Voor meer informatie over het werken met BLOB's in ADO.NETTO, gaat u naar de volgende website van Microsoft Developer Network (MSDN):
BLOB-waarden op te halen uit een data base
http://msdn.Microsoft.com/en-us/library/87z0hy49.aspx

Eigenschappen

Artikel ID: 317043 - Laatste beoordeling: maandag 28 februari 2011 - Wijziging: 2.0
De informatie in dit artikel is van toepassing op:
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
Trefwoorden: 
kbsystemdata kbsqlclient kbhowtomaster kbmt KB317043 KbMtnl
Automatisch vertaald artikel
BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.
De Engelstalige versie van dit artikel is de volgende:317043

Geef ons feedback

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com