- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在努力将文件保存到 sql blob 到一个 varbinary(max) 列,并且现在已经开始工作(我相信)。
我想不通的是如何读取数据,因为我正在使用存储过程检索我的数据库值我应该能够访问像 ds.Tables[0].Rows[ 这样的列数据0]["blob数据"];所以我是否有必要像我在下面的示例中看到的那样拥有 SQLCommand 等:
private void OpenFile(string selectedValue)
{
String connStr = "...connStr";
fileName = ddlFiles.GetItemText(ddlFiles.SelectedItem);
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT BLOBData FROM BLOBTest WHERE testid = " + selectedValue;
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
int size = 1024 * 1024;
byte[] buffer = new byte[size];
int readBytes = 0;
int index = 0;
using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
{
while ((readBytes = (int)dr.GetBytes(0, index, buffer, 0, size)) > 0)
{
fs.Write(buffer, 0, readBytes);
index += readBytes;
}
}
}
}
}
}
当我可以在没有 sql 命令的情况下访问我需要的列时,是否有更简单的方法来执行此操作?
希望我的问题足够清楚,如果还不清楚,我会详细说明!
更新:
现在的情况是这样的——我有存储过程返回的 blobData 列的值,可以将其传递到内存流中并调用“LoadDocument(memStream)”;然而,这会导致乱码文本而不是我的实际文件显示。
我现在的问题是有没有办法获取完整路径,包括存储在 SQL Blob 中的文件的文件扩展名?我目前正在研究为此使用 Filetable,希望能够获得完整路径。
更新 2:
我尝试创建一个临时文件并读取它无济于事(仍然是乱码)
string fileName = System.IO.Path.GetTempFileName().ToString().Replace(".tmp", fileExt);
using (MemoryStream myMemoryStream = new MemoryStream(blobData, 0, (int)blobData.Length, false, true))
{
using (FileStream myFileStream1 = File.Create(fileName))
{
myMemoryStream.WriteTo(myFileStream1);
myMemoryStream.Flush();
myMemoryStream.Close();
myFileStream1.Flush();
myFileStream1.Close();
FileInfo fi = new FileInfo(fileName);
Process prc = new Process();
prc.StartInfo.FileName = fi.FullName;
prc.Start();
}
}
干杯,H
最佳答案
你让事情变得比需要的更困难。使用 MySQL 只是因为它很方便——所有提供程序的工作方式几乎相同。有些东西需要调整以处理非常大的数据项(更多的是服务器而不是数据库提供者)。
string sql = "INSERT INTO BlobDemo (filename, fileType, fileData) VALUES (@name, @type, @data)";
byte[] imgBytes;
using (MySqlConnection dbCon = new MySqlConnection(MySQLConnStr))
using (MySqlCommand cmd = new MySqlCommand(sql, dbCon))
{
string ext = Path.GetExtension(filename);
dbCon.Open();
cmd.Parameters.Add("@name", MySqlDbType.String).Value = "ziggy";
cmd.Parameters.Add("@data", MySqlDbType.Blob).Value = File.ReadAllBytes(filename);
cmd.Parameters.Add("@tyoe", MySqlDbType.String).Value = ext;
int rows = cmd.ExecuteNonQuery();
}
文件数据直接提供给 DB Provider
is there a way to get the full path including file extension of a file stored in an SQL Blob?
没有。您的代码和上面的代码正在保存构成图像或任何文件的字节。
这将读回数据,将其保存到文件并启动关联的应用程序:
string SQL = "SELECT itemName, itemData, itemtype FROM BlobDemo WHERE Id = @id";
string ext = "";
string tempFile = Path.Combine(@"C:\Temp\Blobs\",
Path.GetFileNameWithoutExtension(Path.GetTempFileName()));
using (MySqlConnection dbCon = new MySqlConnection(MySQLConnStr))
using (MySqlCommand cmd = new MySqlCommand(SQL, dbCon))
{
cmd.Parameters.Add("@id", MySqlDbType.Int32).Value = 14;
dbCon.Open();
using (MySqlDataReader rdr = cmd.ExecuteReader())
{
if (rdr.Read())
{
ext = rdr.GetString(2);
File.WriteAllBytes(tempFile + ext, (byte[])rdr["itemData"]);
}
}
// OS run test
Process prc = new Process();
prc.StartInfo.FileName = tempFile + ext;
prc.Start();
}
在这两种情况下,File.ReadAllBytes()
和 File.WriteAllBytes()
将为您完成大部分工作,无论文件类型如何。
不需要一次挖出1k的数据。如果 blob 类似于您希望在应用中使用的图像:
using (MySqlDataReader rdr = cmd.ExecuteReader())
{
if (rdr.Read())
{
ext = rdr.GetString(2);
using (MemoryStream ms = new MemoryStream((byte[])rdr["imgData"]))
{
picBox.Image = Image.FromStream(ms);
}
}
}
可以将 blob 字节馈送到 memstream,甚至是临时 Image
不需要创建,除非您不需要显示它。
总而言之,Ceiling Cat 恢复得很好(图像为 1.4 MB,已缩放;另一个 15.4 MB 图像的测试也有效 - 两者都比我想存储在数据库中的大):
根据它的使用方式,考虑将图像存档到文件系统的某个位置并只保存文件名 - 也许使用 Id
添加以确保名称是唯一的,并有助于将它们直观地链接到记录。大数据 block 不仅会使数据库膨胀,而且在与字节之间的转换中显然会涉及一些可以避免的开销。
如果您想要/需要在关联的应用程序完成它们(不是问题的真正组成部分)后的某个时候删除它们,那么请在特定目录中使用临时文件,以便您可以删除其中的所有内容(有条件地< sup>1) 应用程序结束或启动时:
private string baseAppPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData),
"Company Name", "Product Name", "Temp Files");
为单个文件附加临时文件名和实际扩展名。或者,您可以维护一个 List<string> trashCan
存储您创建的每个文件的名称,以便稍后删除。
1 每当您删除它们时,务必允许文件仍然可以在与该扩展关联的应用中打开。
关于c# - 从数据库中读取 SQL Varbinary Blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39527782/
我遇到以下问题。我想读取一个包含数百万行和数百列的大型 csv。我想向下转换列的数据类型。我的方法是读取 csv,然后使用 pd.to_numeric() 对其进行向下转换。我不知道列数及其类型。在读
目前,我从 SQL server (2008) 数据库获取数据。 cyurrent的方法是使用DataTable,然后将其传递并使用。 if (parameters != null)
我有以下问题。我有一个巨大的 csv 文件,想用多处理加载它。对于一个包含 500000 行和 130 列不同数据类型的示例文件,Pandas 需要 19 秒。我试过 dask 因为我想多处理阅读。但
是否有关于用于序列化各种 MFC 数据结构的二进制格式的明确文档?我已经能够在十六进制编辑器中查看我自己的一些类,并使用 Java 的 ByteBuffer 类读取它们(使用自动字节顺序转换等)。 但
我正在使用 Selenium 进行测试,我们用 HTML 文件编写测试用例,并用它们制作测试套件,我们的要求是编写足够健壮的测试用例,以根据测试环境改变自身。 为此,我不希望在 HTML 脚本本身中包
我需要一个 JavaScript 代码来读取存储为 .txt 文件的字典(或者也可以保存为任何其他类型的文件。它也可以在线获得)并将其内容存储在一个变量中。我不能找到一种让 JavaScript 像
我正在尝试遍历包含 SSH 登录和其他日志的日志文本文件。 程序正在返回 SSH 登录的总数。 我的解决方案确实有效,但似乎有点慢(在 200mo 文件上大约需要 3.5 秒)。我想知道是否有任何方法
我正在将大量数据从一个电子表格复制到工作簿中的其他 160 个电子表格。目前,Excel (2013) 遇到错误,因为它没有足够的资源来完成操作。 我的目标是将工作表 4 中 V13:XI1150 范
我正在尝试读取一个有 1147 行的文本文件。下面的代码仅读取第 1050-1147 行。我的目标是读取整个文件并提取位于不同行的特定值以在脚本中使用。一个示例是包含“BlockList: 2”的行中
我正在为游戏编写解释器。用户将其移动输入解释器,程序执行该移动。 现在我想为每个决定实现一个时间限制。玩家不应该能够思考超过 30 秒来写一个移动并按下回车。 call_with_time_limit
以this file例如,我正在尝试读取 data.frame 中的数据。来自 the doc (pdf 文件,表 1),它遵循一些 fortran 约定。我尝试了以下但收效甚微: dir 0' 将
我正在使用 R 阅读 Outlook 附件。我的引用在这里:Download attachment from an outlook email using R 这是我的电子邮件的截图: 这每天都会发送
我不会从表格中读取行来将主题放在列表中 php脚本 $url_obj='http://'.$host.':8069/xmlrpc/object'; $sock=new xmlrpc_client($u
我有一个这样的 csv 文件: id,name,value 1,peter,5 2,peter\,paul,3 我如何读取此文件并告诉 R "\," 不表示新列,仅表示 ","。 我必须添加该文件
我正在尝试读取 ~/Library/Preferences/com.apple.mail.plist (在 Snow Leopard 上)以获取电子邮件地址和其他信息以进入“关于”对话框。我使用以下代
This question already has answers here: How do I use floating-point division in bash? (19个回答) 5个月前关闭
本练习的目标是读取输入文件并将其存储到表中,然后验证输入中的某些字段并输出任何错误记录。我需要读取并存储每个策略组,以便表中一次仅存储 5 条记录,而不是整个文件。 所以我需要读取一个包含 5 条记录
据我了解,LWT 插入始终以 SERIAL 一致性级别完成。如果为 true,这是否意味着读取作为 LWT 插入的行可以安全地以 ANY 的一致性级别读取? 换句话说,我假设 LWT 插入是完全一致的
我看到很多很多通过java脚本读取cookie的函数,但我只想在变量中使用它一次,我是JS新手。 这是我的代码 var TheNumber = (Math.random() + '') * 10000
我正在使用 asp.net 和 C#。我在服务器上部署了一个应用程序[已发布],现在我想查看该网站的代码,据我所知,我可以阅读程序集来查看代码。 请告诉我如何实现它。 提前致谢。 最佳答案 您可以使用
我是一名优秀的程序员,十分优秀!