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