Ako čítať a písať súbor z BLOB stĺpec a pomocou vytrhávanie v ADO.NET a Visual C#.NET

Preklady článku Preklady článku
ID článku: 317043 - Zobraziť produkty, ktorých sa tento článok týka.
Pre Microsoft Visual Basic.NET verzie tohto článok, pozri 317034.
Pre Microsoft Visual c ++ .ČISTÁ verziu tohto článku, pozri 317044.
Rozbaliť všetko | Zbaliť všetko

Na tejto stránke

SUHRN

Tento podrobný článok popisuje použitie Microsoft SQL Server READTEXT a UPDATETEXT vyhlásenia na čítanie a zápis údajov z BLOB (LongVarBinary) stĺpce v databázovej tabuľke.

Z dôvodu sieť obmedzenia, budete musieť získať veľké BLOB súbor v menších chunks a potom kus kúsky spolu namiesto načítava celé BLOB súbor naraz. Avšak ADO.ČISTÉ údaje poskytovatelia nemajú GetChunk a AppendChunk metódy, ktoré sú k dispozícii údaje prístup objekt (DAO) a ActiveX Data Objects (ADO) Množina záznamov objekty. Tento článok popisuje rôzne spôsoby na načítanie údajov v menšie kúsky.

Poznámky:
  • Tento článok obsahuje príklady pre oboch SqlClient údaje Poskytovateľ a OLE DB.Poskytovateľ údajov NET. Iba rozdiely, okrem triedy mien, sú pripojenia struny a vyhlásenie o SQL parametre. Základné technika na načítanie READTEXT a UPDATETEXT vyhlásenia je podobne.
  • Test záznam v tabuľke kategórie Northwind Ukážková databáza neexistuje. Musíte použiť Server Explorer alebo iného nástroj na pridanie záznamu s NázovKategórie nastavené na Skúška. Po použití nasledujúce vzorky, možno budete chcieť odstrániť tento záznam z databázy. Ak chcete odstrániť záznam, zadajte nasledovný príkaz v Analyzátor dotazu SQL, a potom stlačte kláves F5:
    use Northwind
    delete from Categories where CategoryName = 'Test'
    					

Požiadavky

Nasledujúce položky popisujú odporúčané hardware, software, siete infraštruktúry, zručností a vedomostí a balíky service pack, ktoré sú požadované:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Systém Windows 2000 Advanced Server alebo Microsoft Windows NT 4.0 Server
  • Microsoft Visual Studio.NET
  • Microsoft SQL Server 7.0 a novší
Tento článok predpokladá, že ste oboznámení s ADO.NET základy a syntax.

Vytvoriť projekt a pridať kód

  1. Otvorte analyzátor dotazu SQL.
  2. Zadajte nasledovný príkaz a stlačte kláves F5 zmeniť Predvolená databáza Northwind:
    use Northwind
  3. Zadajte nasledovný príkaz a stlačte kláves F5 Vkladanie novej záznam v tabuľke kategórie databázy Northwind:
    Insert into categories(categoryname) values ('Test')
    Poznámka Budete mať len pridať tento záznam do tabuľky kategórie, ak ste chcete používať tento príklad bez úpravy existujúcich údajov v tomto Tabuľka.
  4. V Visual Studio.ČISTÁ, vytvoriť nové Visual C#.NET Windows Aplikácie projektu.
  5. Athe hornej časti súbore Form1.cs pridajte nasledujúce dva riadky kód pridať odkazy na váš projekt pre System.Data.SQLClient a System.Data.OleDb:
    using System.Data.SqlClient;
    using System.Data.OleDb;
  6. Pridajte štyri tlačidlá Form1. Zmena Textu Vlastnosť tlačidlá SQLBlob2File, OlDbBlob2File, File2OleDbBlob, a File2SqlBlob, resp..
  7. Pridať nasledujúci reťazec premennej vyhlásenia, na základe Verejné triedy Form1:
    string destfilepath;
    string sourcefilepath;
    					
  8. Prilepte nasledujúci kód vo forme Zaťaženie udalosť:
    destfilepath = @"c:\mytest.bmp";
    sourcefilepath = @"c:\windows\coffee bean.bmp";
    					
  9. Zavolať postupy Kliknite na tlačidlo udalosť pre každé tlačidlo:
    // 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. Prilepte nasledovné štyri funkcie v 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. Stlačením klávesu F5 spustiť kód, a potom kliknite na tlačidloFile2OleDbBlob aby sa ubezpečil, že ste nahrať obrázok v SQL Databázy servera pred pokusom o zapísať do súboru .bmp na disku.

Čítanie chunks z Objekt BLOB stĺpca

Tieto funkcie použite príkaz SQL Server READTEXT a DataReader na načítanie časti hodnoty BLOB v jednom riadku, jeden stĺpec riadkov. Dva príkazy sú používané: prvý načíta veľkosť BLOB poli a smerník na jeho sídla; druhý popravených READTEXT príkaz. READTEXT príkaz načíta kus údajov v bajtové pole a inkrementuje kompenzovať. Bajtové pole je napísané na disku pomocou System.io.Filesream objekt.

Napísať kúsky na objekt BLOB stĺpec

Nasledujúce funkcie použitie Príkaz a Parameter objekty a SQL Server UPDATETEXT výkaz písať kúsky údajov z poľa typu Byte BLOB stĺpca. Objekt BLOB stĺpec nemôže mať hodnotu NULL s Táto metóda, takže jeden bajt je priradená stĺpec pred TEXTPTR Zdroj:. O prvom vykonaní UPDATETEXT vyhlásenie DeleteParam.Value je nastavený na 1. Toto odstráni existujúce bajtové z kolóny pred vložením kus a zabraňuje BLOB so cudzie údajov pripojí sa k nej. UPDATETEXT vyhlásenie je popravený viackrát, indikovať kompenzované s veľkosť medzipamäte po každej výzve.
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);
   }
}
				
Poznámky
  • Kód, ktorý je opísaný v tomto článku nesmie byť vhodné pre použitie proti LongVarChar alebo LongVarWChar stĺpcov bez zmena.
  • Musíte zmeniť reťazec pripojenia a príkazy SQL zodpovedajú vlastný server. Musíte tiež pridať kontrolu ak chýb vaše dotaz nevracia žiadne záznamy.
  • READTEXT a UPDATETEXT sú špecifické pre Microsoft SQL Server. Rôzne databázové systémy môžu mať podobné príkazy, ktoré môžete použitie.

ODKAZY

Ďalšie informácie o tom, ako čítať a zapisovať údaje bez vytrhávanie, po kliknutí na nasledovné číslo článku databázy Microsoft Knowledge Base:
316887Ako čítať a písať súbor z BLOB stĺpec a pomocou ADO.NET a jazyka Visual Basic.NET
317017 Ako čítať a písať súbor z BLOB stĺpec a pomocou ADO.NET a Visual C++.NET
317016 Ako čítať a písať súbor z BLOB stĺpec alebo pomocou ADO.NET a Visual C#.NET
Ďalšie informácie o práci s objektov BLOB v ADO.ČISTÁ, nasledovnej webovej lokalite Microsoft Developer Network (MSDN):
Získanie hodnôt BLOB z databázy
http://msdn.Microsoft.com/en-us/library/87z0hy49.aspx

Vlastnosti

ID článku: 317043 - Posledná kontrola: 8. novembra 2011 - Revízia: 2.0
Informácie v tomto článku sa týkajú nasledujúcich produktov:
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
Kľúčové slová: 
kbsystemdata kbsqlclient kbhowtomaster kbmt KB317043 KbMtsk
Strojovo preložené
DÔLEŽITÉ: Tento článok bol preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft, nie prekladateľom. Spoločnosť Microsoft ponúka články preložené prekladateľmi aj strojovo preložené články, vďaka čomu máte možnosť prístupu ku všetkým článkom databázy Knowledge Base vo svojom jazyku. Strojovo preložený článok však nie je vždy perfektný. Môže obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky, podobne ako cudzinec môže robiť chyby, keď rozpráva vašim jazykom. Spoločnosť Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené akýmkoľvek nepresným prekladom obsahu alebo jeho použitím zo strany zákazníkov. Spoločnosť Microsoft softvér na strojový preklad pravidelne aktualizuje.
Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem:317043

Odošlite odozvu

 

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