Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.
Untuk Microsoft Visual Basic.NET versi ini
Pasal, lihat 317034
(http://support.microsoft.com/kb/317034/EN-US/
)
. Untuk Microsoft Visual C++
.NET versi artikel ini, lihat 317044
(http://support.microsoft.com/kb/317044/EN-US/
)
.
Artikel ini selangkah demi selangkah menjelaskan cara menggunakan
Microsoft SQL Server READTEXT dan UPDATETEXT pernyataan untuk membaca dan menulis data
dari GUMPALAN (LongVarBinary) kolom dalam tabel database.
Karena
jaringan kendala, Anda mungkin harus mengambil file GUMPALAN besar di kecil
potongan dan kemudian potongan potongan bersama-sama alih-alih mengambil seluruh GUMPALAN
file pada satu waktu. Namun, ADO.Penyedia data bersih tidak memiliki GetChunk dan AppendChunk metode yang tersedia untuk Data akses obyek (DAO) dan ActiveX
Data Objects (ADO) Recordset objek. Artikel ini menjelaskan cara untuk mengambil data
dalam potongan kecil.
Catatan:
Artikel ini berisi contoh untuk SqlClient Data
Penyedia dan OLE DB.NET Data Provider. Satu-satunya perbedaan, terpisah dari
kelas nama, string koneksi dan pernyataan SQL parameter.
Teknik dasar mengambil pernyataan-pernyataan READTEXT dan UPDATETEXT
Sama.
Catatan pengujian dalam daftar kategori Northwind
database contoh tidak ada. Anda harus menggunakan Server Explorer atau lain
alat untuk menambahkan catatan dengan CategoryName diatur ke Tes. Setelah Anda menggunakan contoh berikut, Anda mungkin ingin menghapus ini
Catatan dari database. Untuk menghapus catatan, ketik perintah berikut di
SQL Query Analyzer, dan kemudian tekan F5:
use Northwind
delete from Categories where CategoryName = 'Test'
Item berikut menjelaskan fitur perangkat keras, perangkat lunak,
jaringan infrastruktur, keterampilan, dan pengetahuan, dan layanan paket yang
data diperlukan:
Microsoft Windows 2000 Professional, Windows 2000 Server,
Windows 2000 Advanced Server, atau Microsoft Windows NT 4.0 Server
Microsoft Visual Studio.NET
Microsoft SQL Server 7.0 atau yang lebih baru
Artikel ini mengasumsikan bahwa Anda sudah familiar dengan ADO.NET
dasar-dasar dan sintaks.
Ketik perintah berikut dan tekan F5 untuk mengubah
default database untuk Northwind:
use Northwind
Ketik perintah berikut dan tekan F5 untuk memasukkan baru
Catatan dalam kategori tabel database Northwind:
Insert into categories(categoryname) values ('Test')
Catatan Anda hanya perlu menambahkan catatan ini tabel Kategori jika Anda
ingin menggunakan contoh ini tanpa memodifikasi salah satu data yang ada di ini
tabel.
Dalam Visual Studio.NET, membuat baru Visual C#.NET Windows
Aplikasi proyek.
Athe atas dari file Form1.cs Anda, tambahkan baris berikut dua
kode untuk menambahkan referensi ke proyek Anda untuk System.data.SQLClient dan System.data.OleDb:
using System.Data.SqlClient;
using System.Data.OleDb;
Menambahkan empat tombol untuk Form1. Perubahan Teks properti tombol untuk SQLBlob2File, OlDbBlob2File, File2OleDbBlob, dan File2SqlBlob, masing-masing.
Tambahkan string berikut Deklarasi variabel di bawah
Form1 publik kelas:
Memanggil prosedur di Klik acara untuk masing-masing tombol:
// 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);
Sisipkan empat fungsi berikut dalam 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);
}
}
Tekan F5 untuk menjalankan kode, dan kemudian klikFile2OleDbBlob untuk memastikan bahwa Anda memuat gambar dalam SQL
Database server sebelum Anda mencoba untuk menulis ke .bmp file pada
disk.
Fungsi-fungsi berikut menggunakan pernyataan SQL Server READTEXT dan
Hexadecimal untuk mengambil sebagian dari GUMPALAN nilai dalam baris tunggal,
satu-kolom rowset. Dua perintah yang digunakan: yang pertama mengambil ukuran
bidang GUMPALAN dan pointer ke lokasi; kedua mengeksekusi READTEXT
perintah. Perintah READTEXT mengambil potongan data dalam Byte array dan
akan menambahkan sebuah Offset. Byte array ditulis ke disk melalui System.io.Filesream objek.
Berikut fungsi penggunaan Perintah dan Parameter objek dan pernyataan SQL Server UPDATETEXT untuk menulis potongan
data dari Byte array ke kolom GUMPALAN. GUMPALAN kolom tidak dapat NULL dengan
metode ini, sehingga satu byte ditugaskan ke kolom sebelum TEXTPTR
Diperoleh. Pada pelaksanaan pertama UPDATETEXT pernyataan, DeleteParam.Value diatur ke 1. Ini menghapus byte ada dari kolom
sebelum memasukkan bongkahan dan mencegah GUMPALAN memiliki data asing
ditambahkan ke itu. Pernyataan UPDATETEXT dijalankan beberapa kali,
incrementing Offset dengan ukuran buffer setelah masing-masing panggilan.
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);
}
}
Catatan
Kode yang dijelaskan dalam artikel ini tidak dapat
cocok untuk digunakan melawan LongVarChar atau LongVarWChar kolom tanpa
modifikasi.
Anda harus memodifikasi koneksi string dan pernyataan SQL
untuk terhubung ke server Anda sendiri. Anda juga harus menambahkan error memeriksa jika Anda
permintaan kembali tidak ada catatan.
READTEXT dan UPDATETEXT adalah khusus untuk Microsoft SQL
Server. Sistem database yang berbeda mungkin memiliki perintah yang sama yang Anda dapat
menggunakan.
Untuk informasi tambahan tentang cara untuk membaca dan menulis data tanpa
Chunking, klik nomor artikel di bawah ini untuk melihat artikel di dalam Basis Pengetahuan Microsoft:
316887
(http://support.microsoft.com/kb/316887/
)
Bagaimana untuk membaca dan menulis file ke dan dari kolom GUMPALAN dengan menggunakan ADO.NET dan Visual Basic.NET
317017
(http://support.microsoft.com/kb/317017/
)
Bagaimana untuk membaca dan menulis file ke dan dari kolom GUMPALAN dengan menggunakan ADO.NET dan Visual C++.NET
317016
(http://support.microsoft.com/kb/317016/
)
Bagaimana untuk membaca dan menulis file ke atau dari kolom GUMPALAN dengan menggunakan ADO.NET dan Visual C#.NET
Untuk informasi lebih lanjut tentang bekerja dengan BLOBs dalam
ADO.NET, kunjungi Web site Microsoft Developer Network (MSDN) berikut:
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:317043
(http://support.microsoft.com/kb/317043/en-us/
)
Mondja el, hogy miért, és tudassa velünk, miként tudnánk javítani az információ min?ségén
Köszönjük! Ez az információ segítséget nyújt számunkra, hogy fejlesszük a támogatási tartalmat. További támogatási lehet?ségekért keresse fel a következ? webhelyet: Súgó és támogatási webhely.