不能在C#byte []数组数据保存到数据库中。它的节能0X [英] Can't save byte[] array data to database in C#. It's saving 0x
问题描述
我想上传一个文件并保存它的二进制内容到我的数据库字段。每次我试图挽救,它只是进入数据库 0X
。
下面是相关code:
<表ID =frmDefaultENCTYPE =的multipart / form-data的=服务器>
< ASP:文件上传ID =的FileInput=服务器的风格=保证金:8像素0 13px的0; />< BR />
< ASP:文本行数=5的TextMode =多行=服务器ID =说明/>< BR />
< ASP:按钮的ID =btnUpload文本=上传文件=服务器
的onclick =btnUpload_Click/>
< /表及GT;
我建立的变量:
HttpPostedFile文件= fileInput.PostedFile;
和,它击中这个功能:
的LoadFile(gAttachmentContentID,file.InputStream,TRN);
其被定义为:
公共静态无效的LoadFile(GUID gAttachmentContentID,流STM,IDbTransaction TRN)
{
const int的BUFFER_LENGTH = 40 * 1024;
字节[] = binFILE_POINTER新的字节[32];
//测试检查出支票
// 2006年1月20日保罗。必须包括交易
SqlProcs.spATTACHMENTS_CONTENT_InitPointer(gAttachmentContentID,楼盘binFILE_POINTER,TRN); 使用(BinaryReader读卡器=新BinaryReader(STM))
{
INT nFILE_OFFSET = 0;
字节[] = binBYTES reader.ReadBytes(BUFFER_LENGTH); 而(binBYTES.Length大于0)
{
// 2005年8月14日保罗。 GID使用由Oracle,binFILE_POINTER由SQL Server使用。
// 2006年1月20日保罗。必须包括交易
SqlProcs.spATTACHMENTS_CONTENT_WriteOffset(gAttachmentContentID,binFILE_POINTER,nFILE_OFFSET,binBYTES,TRN);
nFILE_OFFSET + = binBYTES.Length;
binBYTES = reader.ReadBytes(BUFFER_LENGTH);
}
}
}
我怎么能以整个文件保存到数据库中读取正确的内容是什么?
感谢您。
编辑:
#区域spATTACHMENTS_CONTENT_WriteOffset
///<总结>
/// spATTACHMENTS_CONTENT_WriteOffset
///< /总结>
公共静态无效spATTACHMENTS_CONTENT_WriteOffset(GUID GID,字节[] binFILE_POINTER,的Int32 nFILE_OFFSET,字节[] byBYTES)
{
DbProviderFactory DBF = DbProviderFactories.GetFactory();
使用(CON的IDbConnection = dbf.CreateConnection())
{
con.Open();
使用(IDbTransaction万亿= con.BeginTransaction())
{
尝试
{
使用(IDbCommand的CMD = con.CreateCommand())
{
cmd.Transaction =万亿;
cmd.CommandType = CommandType.StoredProcedure;
如果(Sql.IsOracle(CMD))
cmd.CommandText =spATTACHMENTS_CONTENT_WriteOff;
其他
cmd.CommandText =spATTACHMENTS_CONTENT_WriteOffset;
IDbDataParameter parID = Sql.AddParameter(CMD@ID,GID);
IDbDataParameter parFILE_POINTER = Sql.AddParameter(CMD@FILE_POINTER,binFILE_POINTER);
IDbDataParameter parMODIFIED_USER_ID = Sql.AddParameter(CMD@MODIFIED_USER_ID,Security.USER_ID);
IDbDataParameter parFILE_OFFSET = Sql.AddParameter(CMD@FILE_OFFSET,nFILE_OFFSET);
IDbDataParameter parBYTES = Sql.AddParameter(CMD@BYTES,byBYTES);
cmd.ExecuteNonQuery();
}
trn.Commit();
}
赶上(异常前)
{
trn.Rollback();
抛出(新的异常(ex.Message,ex.InnerException));
}
}
}
}
#endregion
我有同样的问题,那就是第一次在拍摄时正确保存在数据库方面,但如果随后验证失败,然后我试着输入有效的数据我会得到 0X
在图像列之后再保存图像。为了解决这个我做了什么<一个href=\"http://stackoverflow.com/questions/14943333/cant-save-binary-data-to-database-in-c-sharp#comment21040844_14943333\">@Ann L. 说:
字节[]照片= NULL;如果(model.Photo!= NULL)
{
VAR流= model.Photo.InputStream;
stream.Position = 0; 使用(BinaryReader BR =新BinaryReader(model.Photo.InputStream))
{
照片= br.ReadBytes(model.Photo.ContentLength);
}
}
I am trying to upload a file and save it's binary content to my database field. Each time I try to save, it simply enters the database as 0x
.
Here is the relevant code:
<form id="frmDefault" enctype="multipart/form-data" runat="server">
<asp:FileUpload ID="fileInput" runat="server" style="margin: 8px 0 13px 0;" /><br />
<asp:textbox rows="5" TextMode="multiline" runat="server" id="description" /><br />
<asp:Button ID="btnUpload" Text="Upload File" runat="server"
onclick="btnUpload_Click" />
</form>
I establish the variable:
HttpPostedFile file = fileInput.PostedFile;
And, it hits this function:
LoadFile(gAttachmentContentID, file.InputStream, trn);
Which is defined as:
public static void LoadFile(Guid gAttachmentContentID, Stream stm, IDbTransaction trn)
{
const int BUFFER_LENGTH = 40 * 1024;
byte[] binFILE_POINTER = new byte[32];
//Testing check out check in
// 01/20/2006 Paul. Must include in transaction
SqlProcs.spATTACHMENTS_CONTENT_InitPointer(gAttachmentContentID, ref binFILE_POINTER, trn);
using (BinaryReader reader = new BinaryReader(stm))
{
int nFILE_OFFSET = 0;
byte[] binBYTES = reader.ReadBytes(BUFFER_LENGTH);
while (binBYTES.Length > 0)
{
// 08/14/2005 Paul. gID is used by Oracle, binFILE_POINTER is used by SQL Server.
// 01/20/2006 Paul. Must include in transaction
SqlProcs.spATTACHMENTS_CONTENT_WriteOffset(gAttachmentContentID, binFILE_POINTER, nFILE_OFFSET, binBYTES, trn);
nFILE_OFFSET += binBYTES.Length;
binBYTES = reader.ReadBytes(BUFFER_LENGTH);
}
}
}
How can I read the correct contents in order to save the entire file to the database?
Thank you.
Edit:
#region spATTACHMENTS_CONTENT_WriteOffset
/// <summary>
/// spATTACHMENTS_CONTENT_WriteOffset
/// </summary>
public static void spATTACHMENTS_CONTENT_WriteOffset(Guid gID, byte[] binFILE_POINTER, Int32 nFILE_OFFSET, byte[] byBYTES)
{
DbProviderFactory dbf = DbProviderFactories.GetFactory();
using ( IDbConnection con = dbf.CreateConnection() )
{
con.Open();
using ( IDbTransaction trn = con.BeginTransaction() )
{
try
{
using ( IDbCommand cmd = con.CreateCommand() )
{
cmd.Transaction = trn;
cmd.CommandType = CommandType.StoredProcedure;
if ( Sql.IsOracle(cmd) )
cmd.CommandText = "spATTACHMENTS_CONTENT_WriteOff";
else
cmd.CommandText = "spATTACHMENTS_CONTENT_WriteOffset";
IDbDataParameter parID = Sql.AddParameter(cmd, "@ID" , gID );
IDbDataParameter parFILE_POINTER = Sql.AddParameter(cmd, "@FILE_POINTER" , binFILE_POINTER );
IDbDataParameter parMODIFIED_USER_ID = Sql.AddParameter(cmd, "@MODIFIED_USER_ID", Security.USER_ID );
IDbDataParameter parFILE_OFFSET = Sql.AddParameter(cmd, "@FILE_OFFSET" , nFILE_OFFSET );
IDbDataParameter parBYTES = Sql.AddParameter(cmd, "@BYTES" , byBYTES );
cmd.ExecuteNonQuery();
}
trn.Commit();
}
catch(Exception ex)
{
trn.Rollback();
throw(new Exception(ex.Message, ex.InnerException));
}
}
}
}
#endregion
I was having the same problem, that is, the first time the image was saved correctly on the database side, but if subsequently validation failed and then I tried to save the image again after entering valid data I would get 0x
in the image column. To solve that I did what @Ann L. said:
byte[] photo = null;
if(model.Photo != null)
{
var stream = model.Photo.InputStream;
stream.Position = 0;
using(BinaryReader br = new BinaryReader(model.Photo.InputStream))
{
photo = br.ReadBytes(model.Photo.ContentLength);
}
}
这篇关于不能在C#byte []数组数据保存到数据库中。它的节能0X的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!