sqldatasource控件处理image类型数据

今天做程序的时候,因为要用SqlDatasource绑定存储过程来实现添加数据。这个控件用过不下100遍了,今天才发现Image类型字段需要特别处理。

SqlDataSource控件如果是通过向导来做的话,会自动生成如下代码:

 <asp:SqlDataSource ID="studentDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:StdITBaseOAConnectionString %>"
  SelectCommand="SELECT Student.* FROM Student" InsertCommand="spStudentRecordAdd"
        InsertCommandType="StoredProcedure" >
  <InsertParameters>
            <asp:Parameter Name="StudentName" Type="String" />
            <asp:Parameter Name="StudentID" Type="Int32" />
            <asp:Parameter Name="Photo" Type="Object" />
        </InsertParameters>
 </asp:SqlDataSource>

运行时会出现“sql_variant类型不能转换为Image类型的异常”,一看就是类型不匹配的异常,可惜的是Parameter 没有Image类型。这时,请手工去掉这行:

<asp:Parameter Name="Photo" Type="Object" />

在此,这个Type="Object"将会产生一个sql_variant类型的参数。然而,该sql_variants类型不能用来存储图像或varbinary(MAX)数据类型,因为该sql_variant的内在数据大小不能超过8,000个字节。(如果你试图使用 Type="Object",然后试图保存超过8,000字节大小的二进制数据,那么,系统将抛出一个异常并显示消息"Parameter '@ImageData' exceeds the size limit for the sql_variant datatype";如果你试图添加不到8,000字节大小的二进制数据,那么,该异常将显示消息"Implicit conversion from data type sql_variant to varbinary(max) is not allowed")。

当然,我们肯定不能不管这个字段,下面是我试验成功的一种做法,仅供有同样疑惑的同学参考:

    protected void studentDataSource_Inserting(object sender, SqlDataSourceCommandEventArgs e)
    {
        FileUpload fu = FormView1.FindControl("FileUpload1") as FileUpload;
        byte[] imageData = new byte[0];
        if (fu != null && fu.HasFile)
        {
            imageData = fu.FileBytes;
        }
        System.Data.SqlClient.SqlParameter uploadData = new System.Data.SqlClient.SqlParameter("@Photo", System.Data.SqlDbType.Image);
        uploadData.Value = imageData;
        e.Command.Parameters.Add(uploadData);
    }

代码中使用了FormView控件,同学组要根据实际情况来理解。这段代码里最核心的部分是构建一个SqlParameter,对应Photo,并加到Insert Command中。

另外上面的studentDataSource_Inserting方法是SqlDataSource控件的Inserting事件的实现。一开始我用FormView的Inserting事件,发现那里面无法得到Command对象,只能对参数的DefaultValue进行赋值。所以才想到了SqlDataSource

问题虽然解决了,但是我还是建议不要将图片保存到数据库字段中。另外,可能还有其它的方法吧,欢迎各位讨论。

本文出自 “王杰瑞的技术博客” 博客,请务必保留此出处http://wangjierui.blog.51cto.com/186879/109595

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索异常
, 数据
, 控件
, 类型
, 字段
, sqldatasource
, 字节异常解决
FileUpload1
sqldatasource控件、accessdatasource控件、entitydatasource控件、objectdatasource控件、linqdatasource控件,以便于您获取更多的相关知识。

时间: 2024-09-22 23:26:52

sqldatasource控件处理image类型数据的相关文章

在ASP.NET 2.0中操作数据之四十六:使用SqlDataSource控件检索数据_自学过程

导言 到目前为止,我们探讨的教程是由表现层,业务逻辑层和数据访问层构成的层次体系结构.数据访问层和业务逻辑层分别在教程第一和第二章提到.在Displaying Data With the ObjectDataSource 这篇教程里,我们探讨了怎样用ASP.NET 2.0的新控件--ObjectDataSource控件在表现层展示数据. 本教程到目前为止用这种层次结构来处理数据.然而绕过这种体系结构,通过直接把数据查询和业务逻辑放在Web页面上,也可以达到直接在ASP.NET页面上访问,插入,更

ASP.NET 2.0数据教程之四十七:使用SqlDataSource控件查询数据

返回"ASP.NET 2.0数据教程目录" 导言 到目前为止,我们所做的教程都使用了一个包含表示层.业务逻 辑层以及数据访问层的分层架构.在第一节教程(创建一个数据访问层)中,我 们讲解了数据访问层(DAL),第二节教程(创建一个业务逻辑层)中,我们又讲 解了业务逻辑层.从教程"使用ObjectDataSource展现数据"开始, 我们看到了如何在这个架构里面,通过使用ASP.NET2.0中新出现的 ObjectDataSource控件在表示层展示数据. 所有的这些

ASP.NET 2.0数据教程之五十:对SqlDataSource控件使用开放式并发

返回"ASP.NET 2.0数据教程目录" 导言: 在前面的教程里,我们考察了如何为SqlDataSource控件添加插 入.更新.删除功能.简而言之,就是为其nsertCommand, UpdateCommand和 DeleteCommd属性赋以相应的INSERT,UPDATE和DELETESQL语句,并将相应的参数放 置在 <InsertParameters>, <UpdateParameters>和 <DeleteParameters>标签里.

在ASP.NET 2.0中操作数据之四十七:用SqlDataSource控件插入、更新、删除数据_自学过程

导言: 正如在教程概述插入.更新和删除数据里讨论的那样,GridView控件内置更新和删除功能,而DetailsView和FormView控件不仅具有编辑和删除功能,还有插入功能.我们不要写一行代码就可一将这些功能直接应用于一个数据源控件.在这篇教程里,我们指出ObjectDataSource控件最好与GridView, DetailsView和FormView控件一起使用,才更好的实现插入.更新和删除功能.对SqlDataSource控件来说,同样如此! 对ObjectDataSource控件

轮循法-C++MSComm控件的定时接收数据怎么实现

问题描述 C++MSComm控件的定时接收数据怎么实现 查了好多资料都是VB的,我想定时的从输入缓冲区中读数,C++如何实现啊,新手求教! 解决方案 我用settimer这个来实现定时,可能是由于ONCOMM事件在缓冲区有数时候就会触发,两者发生冲突阻塞了,有人说还可以多线程实现定时,但是我是新手,有没有哪位前辈遇到这种问题,传授一二?

datepicker-silverlight的DataGrid中添加DatePicker控件使用滚动条滚动数据有误

问题描述 silverlight的DataGrid中添加DatePicker控件使用滚动条滚动数据有误 silverlight的DataGrid中添加DatePicker控件,初始设定DatePicker中的时间,连续使用滚动条滚动,初始设定DatePicker的值会随机改变. <sdk:DataGrid Grid.Row="1" HorizontalAlignment="Stretch" Name="dataGrid1" Vertical

有没有什么好的JavaScript地图控件可以实现根据数据量变色、链接等,另外需要修改脚本一则

问题描述 有没有什么好的JavaScript地图控件可以实现根据数据量变色.链接等,另外需要修改脚本一则 <script type="text/javascript"> $(function(){ var data = {"jiangsu":{"value":"<{$count5}>","stateInitColor":"4"},"heilongjian

access数据库-C#treeview控件读取ACCESS数据库数据并显示

问题描述 C#treeview控件读取ACCESS数据库数据并显示 C#中treeview控件读取ACCESS数据库数据并显示,急求急求急求急求急求急求 解决方案 支持任意数据库http://blog.csdn.net/xianfajushi/article/details/7756584 解决方案二: http://wenku.baidu.com/link?url=wmhiqcblgkcgVwQw9-mvCuAD0WG3AA8k87fHuHb0j3wPUTz41huk-TGUbmCagBZhd

VB.NET中数据控件不能立即反映数据表的变动???

问题描述 在VB6中数据表的数据一变动,数据控件马上能反映出来,但在VB.NET中却不行,请问有什么办法吗?,是不是连接的问题??谢谢!!! 解决方案 解决方案二:这是ADO.NET的优势之一.如果你想临视数据库的实时变化,用别的方案吧.听说sqlServer2008做了这方面的工作.解决方案三:该回复于2008-05-09 11:09:37被版主删除解决方案四:你的数据库窗口控件.Refresh(),是不是就行了解决方案五:楼上说的并不可行,有没有其他解决方案呢?解决方案六:VB6用的是ADO