将bytes []转换为VARBINARY不起作用

时间:2017-07-18 02:52:27

标签: c# sql sql-server

我正在尝试将文件保存到SQL Server数据库中,并且保存文件的列的数据类型为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将永远是那个数字。所以如果你能告诉我为什么会这样,以及我应该采取什么措施来防止这种情况,我会非常感激。

1 个答案:

答案 0 :(得分:3)

这是一个错误:

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 + "'));

此处描述了此行为:binary and varbinary (Transact-SQL)

  

备注

     

在数据定义或变量中未指定n时   声明语句,默认长度为1. 当n不是时   使用CAST函数指定,默认长度为30

不是通过Query字符串传递数据,而是使用SQL参数 否则,“+ Filebytes +”将被传递。

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

有关更多信息,请访问: https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters(v=vs.110).aspx