DataReader 的默认行为是在整个数据行可用时立即以行的形式加载传入数据。但是,对于二进制大对象 (BLOB) 则需要进行不同的处理,因为它们可能包含数十亿字节的数据,而单个行中无法包含如此多的数据。Command.ExecuteReader 方法具有一个重载,它将采用 CommandBehavior 参数来修改 DataReader 的默认行为。您可以将 CommandBehavior.SequentialAccess 传递到 ExecuteReader 方法来修改 DataReader 的默认行为,以便让 DataReader 按照顺序在接收到数据时立即将其加载,而不是加载数据行。这是加载 BLOB 或其他大数据结构的理想方案。
在将 DataReader 设置为使用 SequentialAccess 时,务必要注意访问所返回字段的顺序。DataReader 的默认行为是在整个行可用时立即加载该行,这使您能够在读取下一行之前按任何顺序访问所返回的字段。但是,当使用 SequentialAccess 时,必须按顺序访问由 DataReader 返回的不同字段。例如,如果查询返回三个列,其中第三列是 BLOB,则必须在访问第三个字段中的 BLOB 数据之前返回第一个和第二个字段的值。如果在访问第一个或第二个字段之前访问第三个字段,则第一个和第二个字段值将不再可用。这是因为 SequentialAccess 已修改 DataReader,使其按顺序返回数据,当 DataReader 已经读取超过特定数据时,该数据将不可用。
当访问 BLOB 字段中的数据时,请使用 DataReader 的 GetBytes 类型化访问器,该访问器将使用二进制数据填充 byte 数组。您可以指定要返回的特定数据缓冲区大小以及从返回的数据中读取的第一个字节的起始位置。GetBytes 将返回 long 值,它表示所返回的字节数。如果向 GetBytes 传递空的 byte 数组,所返回的长值将是 BLOB 中字节的总数。您可以选择将字节数组中的某索引指定为所读取数据的起始位置。
以下示例从 Microsoft SQL Server 中的 pubs 示例数据库中返回发行者 ID 和徽标。发行者 ID (pub_id) 是字符字段,而徽标则是图形,即 BLOB。请注意,由于必须按顺序访问字段,所以将在访问徽标之前访问当前数据行的发行者 ID。
[Visual Basic]
Dim pubsConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=pubs;")
Dim logoCMD As SqlCommand = New SqlCommand("SELECT pub_id, logo FROM pub_info", pubsConn)
Dim fs As FileStream ' Writes the BLOB to a file (*.bmp).
Dim bw As BinaryWriter ' Streams the binary data to the FileStream object.
Dim bufferSize As Integer = 100 ' The size of the BLOB buffer.
Dim outbyte(bufferSize - 1) As Byte ' The BLOB byte() buffer to be filled by GetBytes.
Dim retval As Long ' The bytes returned from GetBytes.
Dim startIndex As Long = 0 ' The starting position in the BLOB output.
Dim pub_id As String = "" ' The publisher id to use in the file name.
' Open the connection and read data into the DataReader.
pubsConn.Open()
Dim myReader As SqlDataReader = logoCMD.ExecuteReader(CommandBehavior.SequentialAccess)
Do While myReader.Read()
' Get the publisher id, which must occur before getting the logo.
pub_id = myReader.GetString(0)
' Create a file to hold the output.
fs = New FileStream("logo" & pub_id & ".bmp", FileMode.OpenOrCreate, FileAccess.Write)
bw = New BinaryWriter(fs)
' Reset the starting byte for a new BLOB.
startIndex = 0
' Read bytes into outbyte() and retain the number of bytes returned.
retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize)
' Continue reading and writing while there are bytes beyond the size of the buffer.
Do While retval = bufferSize
bw.Write(outbyte)
bw.Flush()
' Reposition the start index to the end of the last buffer and fill the buffer.
startIndex = startIndex + bufferSize
retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize)
Loop
' Write the remaining buffer.
bw.Write(outbyte)
bw.Flush()
' Close the output file.
bw.Close()
fs.Close()
Loop
' Close the reader and the connection.
myReader.Close()
pubsConn.Close()
[C#]
SqlConnection pubsConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=pubs;");
SqlCommand logoCMD = new SqlCommand("SELECT pub_id, logo FROM pub_info", pubsConn);
FileStream fs; // Writes the BLOB to a file (*.bmp).
BinaryWriter bw; // Streams the BLOB to the FileStream object.
int bufferSize = 100; // Size of the BLOB buffer.
byte[] outbyte = new byte[bufferSize]; // The BLOB byte[] buffer to be filled by GetBytes.
long retval; // The bytes returned from GetBytes.
long startIndex = 0; // The starting position in the BLOB output.
string pub_id = ""; // The publisher id to use in the file name.
// Open the connection and read data into the DataReader.
pubsConn.Open();
SqlDataReader myReader = logoCMD.ExecuteReader(CommandBehavior.SequentialAccess);
while (myReader.Read())
{
// Get the publisher id, which must occur before getting the logo.
pub_id = myReader.GetString(0);
// Create a file to hold the output.
fs = new FileStream("logo" + pub_id + ".bmp", FileMode.OpenOrCreate, FileAccess.Write);
bw = new BinaryWriter(fs);
// Reset the starting byte for the new BLOB.
startIndex = 0;
// Read the bytes into outbyte[] and retain the number of bytes returned.
retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize);
// Continue reading and writing while there are bytes beyond the size of the buffer.
while (retval == bufferSize)
{
bw.Write(outbyte);
bw.Flush();
// Reposition the start index to the end of the last buffer and fill the buffer.
startIndex+= bufferSize;
retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize);
}
// Write the remaining buffer.
bw.Write(outbyte);
bw.Flush();
// Close the output file.
bw.Close();
fs.Close();
}
// Close the reader and the connection.
myReader.Close();
pubsConn.Close(); | | |
|
|
|
<script src="../../js/aspxboy_search.js" language="JavaScript"></script>
|
|
相关推荐
2. **读取数据库中的Image字段** - 使用`SqlConnection`连接到SQL Server数据库。 - 创建一个`SqlCommand`对象,设置SQL查询语句,如:`SELECT ImageField FROM TableName WHERE Id = @Id`。 - 添加参数(如`@Id`...
C#将文件保存到数据库中或者从数据库中读取文件 本文主要介绍了使用 C# 将文件保存到数据库中或者从数据库中读取文件的方法。下面将详细介绍该知识点。 一、保存文件到数据库中 在实际开发中,我们经常需要将文件...
在C#编程中,将图片存入数据库以及从数据库中读取是一项常见的任务,尤其是在开发包含多媒体元素的应用程序时。数据库通常使用BLOB(Binary Large Object)类型来存储非结构化数据,如图像、音频或视频文件。以下是...
C#作为.NET框架的主要编程语言,提供了多种方式来操作SQL Server中的`Image`类型数据。本篇文章将详细介绍如何在C#中进行此类操作。 首先,确保你已经安装了SQL Server客户端库,通常是`System.Data.SqlClient`,这...
在C#编程中,将图片文件读取并存储到数据库是一项常见的任务,这通常涉及到二进制数据处理和数据库操作。下面将详细讲解这个过程,包括如何读取图片、将其转换为二进制数据,以及如何从数据库中提取并还原图片。 ...
Oracle数据库提供了一个名为ODP.NET(Oracle Data Provider for .NET)的数据访问组件,它允许C#应用程序直接与Oracle服务器进行交互。通过ODP.NET,我们可以创建连接、执行SQL命令以及处理数据。 1. **执行非查询...
在C#编程环境中,与MySQL数据库进行交互是常见的任务,特别是在需要存储非结构化数据如图片时。本示例将详细介绍如何使用C#连接到MySQL数据库,并实现图片的存储功能。 首先,确保你已安装了MySQL数据库服务器以及...
代码如下:注:MyTools.g_PhotoField为数据库表中的图象字段名称//将图片保存到数据库中 if(this.picPhoto.Image==null) { m_DataRow[MyTools.g_PhotoField]=DBNull.Value; } else { try { MemoryStream ms = ...
本示例重点讲解了如何利用C#与SQLite数据库交互,特别是涉及到图片数据的存储和读取。 首先,我们需要在C#项目中引入SQLite的相关库。可以使用NuGet包管理器安装`System.Data.SQLite`,它提供了对SQLite数据库的...
总结起来,本话题涵盖了C#对二进制数据文件的读取,图像数据的解码与显示,以及将图像数据存储到数据库中的技术。这些知识点对于开发涉及文件处理、图像操作和数据库交互的应用程序至关重要。理解并熟练掌握这些技能...
当我们在C#应用程序中处理图像数据时,有时需要将这些图像存储到SQL Server数据库的特定字段,例如Image类型字段。Image类型字段在SQL Server中用于存储大对象(LOB)数据,如图像、二进制文件等。下面我们将详细...
// 读取数据库中的图像数据 byte[] content; using (SqlConnection connection = new SqlConnection("connection_string_here")) { // 使用SqlDataAdapter查询数据 SqlDataAdapter dataAdapter = new ...
在IT行业中,数据库存储是数据管理的关键环节,而图片作为一种非结构化数据,有时也需要被存入数据库以供后续检索和使用。本示例聚焦于使用C#编程语言和.NET框架来实现这一功能,特别是在WinForms环境下。我们将探讨...
以上是关于"C#数据库中图片的存储与读取"这一主题的详细阐述,这个项目提供了一个实用的方法来处理这个问题,对于初学者和有经验的开发者来说都是一个有价值的资源。通过学习和实践,开发者可以更好地理解如何在实际...
读取数据库中的图片数据,同样使用`SqlCommand`执行查询语句,然后将结果转换回`byte[]`: ```csharp public byte[] GetImageFromDatabase(string id, string connectionString) { using (SqlConnection ...
C# 中的 BLOB(Binary Large OBject)读取操作是指从数据库中读取二进制数据的过程。BLOB 是一种二进制数据类型,用于存储大规模的二进制数据,如图片、音频、视频等。在 C# 中,我们可以使用 FileStream 对象来读取...
本文将详细介绍如何使用C#将文件保存到数据库中以及如何从数据库中读取文件。 #### 二、数据库字段类型选择 在讨论具体操作前,我们需要了解数据库中用于存储文件的字段类型。不同的数据库系统支持的字段类型有所...
读取数据库中的图片数据流,可以使用`SqlCommand`的`ExecuteReader`或`ExecuteScalar`方法。这里我们假设要获取刚刚存储的图片ID,并将其转换回图片: ```csharp public Image ByteArrayToImage(byte[] byteArray) ...
在C#编程环境中,开发一个窗体应用来向数据库中添加图片涉及到多个步骤和技术。首先,我们需要理解如何处理图像文件,然后将它们转换为二进制数据,以便于存储在数据库中。通常,数据库系统如SQL Server不直接支持...
在C#编程中,将图片上传到...总结,C#上传图片到数据库并从数据库中读取的过程涉及到数据库设计、二进制数据处理、数据库操作和用户界面交互等多个方面。理解这些知识点可以帮助开发者构建具有图片管理功能的应用程序。