一尘不染

无法将bytes []转换为VARBINARY

sql

我正在尝试将文件保存到SQL Server数据库中,该文件将保存在其中的列是datatype VARBINARY

我目前这样做的方式是通过获取文件路径并将文件转换为字节数组。

string SelectedFilePath = "" ;
OpenFileDialog choofdlog = new OpenFileDialog();

if (choofdlog.ShowDialog() == DialogResult.OK)
{
    SelectedFilePath = choofdlog.FileName;      
}

byte[] Filebytes = File.ReadAllBytes(SelectedFilePath);

然后,我使用插入查询和convert函数将字节插入数据库,以将转换byte[]varbinary

INSERT * INTO TblFile([FILEID], [FILEDATA])  
VALUES('" + Guid.newGuid + "', CONVERT(VARBINARY, '" + Filebytes + "'));

但是,在SQL Server数据库中,的值FILEDATA始终为

0x53797374656D2E427974655B5D

而且,无论选择哪个文件,FILEDATA都始终是该数字。因此,如果您能告诉我为什么会这样,以及我应该采取什么措施来防止这种情况,我将非常感激。


阅读 299

收藏
2021-03-08

共1个答案

一尘不染

这是一个错误:

INSERT * INTO TblFile([FILEID], [FILEDATA])  
VALUES('" + Guid.newGuid + "', CONVERT(VARBINARY, '" + Filebytes + "'));

截断在此处发生,您应该像这样将其强制转换为varbinary(MAX):

INSERT * INTO TblFile([FILEID], [FILEDATA])  
VALUES('" + Guid.newGuid + "', CONVERT(VARBINARY(MAX), '" + Filebytes + "'));

此处描述了此行为:二进制和varbinary(Transact-SQL)

评论

在数据定义或变量声明语句 中未指定n时 ,默认长度为1。 在CAST函数中未指定n时,默认长度为30

与其通过Query字符串传递数据,不如使用SQL参数,因为否则将传递’“ + Filebytes +”’。

SqlParameter FileDataUploadParameter = Cmd.Parameters.Add("@FileData", SqlDbType.VarBinary);
FileDataUploadParameter.Value = FileToUpload;
2021-03-08