我的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 ServiceStackORMLite感到困惑-它们既不相关也不必需兼容。

您可能要问的是如何使用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/

10-16 08:53