我的Web服务的子任务是将文件(以及一些元数据)保存在数据库中。
该Web服务基于ServiceStack及其ORMlite版本。
因此,我创建了一个小类,表示数据库中的附件:
public class Attachment {
public string Description { get; set; }
public string FileName { get; set; }
public string Type { get; set; }
public byte[] Data { get; set; }
}
这是实际文件
MemoryStream ms = new MemoryStream(webclient.DownloadData(...));
byte[] data = new byte[...];
ms.Read(data, 0, data.Length);
Attachment file = new Attachment() {
/* all the other stuff */
Data = data
};
到目前为止没有问题... :)
现在,我已拥有将这个文件放入数据库的全部能力。所以让它继续...
dbCmd.Insert<Attachment>(file);
还有问题...
SqlException: "Operand type clash: text is incompatible with image"
ORMlite将字节数组转换为base64编码的字符串
/* stripped-down example of the command string */
INSERT INTO Attachment (Data) VALUES ('CgoKCgoKCjxodG1sPgo8a...AAAA==')
我整天都在搜索,但是没有找到改变ORMlite处理
byte[]
数组的方式的解决方案。没有属性DatabaseField
,我可以使用它在Java中将dataType
设置为BYTE_ARRAY
。@DatabaseField(dataType = DataType.BYTE_ARRAY)
byte[] imageBytes;
我错过了必不可少的东西吗?
还有另一种将文件放入数据库的方法吗?
最佳答案
因此,我认为您对Java ORM库ORMLite inside of ServiceStack和ORMLite感到困惑-它们既不相关也不必需兼容。
您可能要问的是如何使用C#ORMLite读取Java ORMLite编写的数据。我完全没有C#方面的经验,但是我可以在这里谈论ORMLite的工作:
@DatabaseField(dataType = DataType.BYTE_ARRAY)
byte[] imageBytes;
在SqlServer中,这应对应于字段:
"bytes" IMAGE
传递给JDBC的SQL插入命令是:
INSERT INTO "bytearray" ("bytes" ) VALUES (?)
insert arguments: [[B@34883357] (byte[])
它使用
byte[]
从结果中检索results.getBytes(columnPos)
。您提到:
ORMlite将字节数组转换为base64编码的字符串
这是JDBC所做的。我确实对此感到惊讶,但我想这是可能的。
希望这里有所帮助。
关于c# - 如何使用ORMlite将byte []数组插入图像列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11545344/