【发布时间】:2013-11-10 09:41:17
【问题描述】:
对于我的真正问题Invalid parameter when retrieving image from DB,我似乎无法全部找到答案,所以我可以一点一点地尝试。 在 C# 和 MS Access 2010 中使用 Visual Studio 2012。我的解决方案是与 Web 无关的应用程序。
我不确定这部分,所以这里我的问题是如何正确地从查询中获取 row 中的 OLE 对象 的图像一个字节数组 (byte[]),因为这肯定不是我使用以下代码的方式。 我所说的行是row["FOTO"]。
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [APP_Equipamento_Geral] WHERE COD_ETIQ like '%" + codigo + "%'", l);
DataSet ds = new DataSet();
adapter.Fill(ds, "[APP_Equipamento_Geral]");
string s = ds.Tables["[APP_Equipamento_Geral]"].Columns[16].ColumnName;
foreach (DataRow row in ds.Tables["[APP_Equipamento_Geral]"].Rows)
{
eq.NSerie = row["N_SERIE"].ToString();
eq.NInventario = row["Codigo"].ToString();
if (row["FOTO"] != DBNull.Value && row["FOTO"] != null)
{
string str = row["FOTO"].ToString();
byte[] b = stringToByteArray(str);
byte[] imagebyte = GetImageBytesFromOLEField(b); //Error caught here
MemoryStream ms = new MemoryStream();
ms.Write(imagebyte, 0, imagebyte.Length);
}
}
GetImageBytesFromOLEField 方法可以在here 找到。它给我的错误是关于 string strVTemp = strTemp.Substring(0, 300);
行的索引长度同样,这里的主要问题是如何将 DataRow row["FOTO"] 中的 OLE Object 转换为 byte[] 以然后在那个方法中使用。
【问题讨论】:
-
如果你尝试
Byte[] b = (Byte[])row["FOTO"];会发生什么?我刚刚检查了一下,row["FOTO"] 应该已经是 System.Byte[] 类型的对象,所以也许你的数据已经是你需要的格式(字节数组),你需要的只是一个显式转换。跨度> -
我刚试过
Byte[] imagebyte = GetImageBytesFromOLEField((Byte[])dr["FOTO"]);,对我来说效果很好。如果您愿意,可以将一行提取到单独数据库文件中的单独表中(必要时混淆敏感数据,但不会弄乱 [FOTO] 字段)并将其上传到 wikisend.com。然后,如果您在此处发布链接,我可以下载它并查看 [FOTO] 列中的内容。 -
@GordThompson Here 是。
标签: c# ms-access bytearray ms-access-2010 datarow