以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  SQLInsertFile问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=78182)

--  作者:askbang
--  发布时间:2015/12/3 16:13:00
--  SQLInsertFile问题

对MSSQL添加行后,执行了 SQLInsertFile 添加二进制图片,系统总是提示对象名 "xxx" 无效,其中 xxx是数据源名称,可是查看数据表,除了图片没插入成功,其他数据已正常插入了,我也检查了图片列的设置确实是图片列, 不知为何?

 

        \'以上代码略

        Dim cr As Row = tb.AddNew()
        cr("车牌号") = e.Form.Controls("car_code").Text
        cr("车辆类型") = e.Form.Controls("car_cat").Text
        
        cr.DataRow.Save()

 

        Dim dlg As New OpenFileDialog
        If dlg.ShowDialog = DialogResult.OK Then
            cr.DataRow.SQLInsertFile("图片", dlg.FileName) \'插入文件
        End If


--  作者:大红袍
--  发布时间:2015/12/3 16:17:00
--  
你的图片列不是二进制列吧?
--  作者:askbang
--  发布时间:2015/12/3 16:39:00
--  

绝对是二进制列。刚才我用了另一种方法测试,发现数据表如果是fill方法加载的也是一样,只有先加载外部表,再插入就不会报错。


--  作者:大红袍
--  发布时间:2015/12/3 16:46:00
--  

用sql语句插入吧。

 

Dim fs As New IO.FileStream("D:\\a.JPG" , IO.FileMode.Open , IO.FileAccess.Read)   \'用文件流打开图片
Dim br As New IO.BinaryReader(fs)   \'根据文件流,申明一个二进制阅读器
Dim ImageByte() As Byte = br.ReadBytes(fs.Length)   \'阅读器读取文件流,并将独到的二进制放入数组ImageByte中,
Dim ImageString As String = BitConverter.ToString(imageByte).Replace("-", "")  \' SQLCommand 不能直接Insert 二进制,只能拼接SQL语句,所以这里把二进制变成字符                                                


Dim cmd As SQLCommand = new SQLCommand()
cmd.ConnectionName = "SqlServerDB"
cmd.CommandText = "Insert aaa values(0x" + ImageString + ")"  \'这里的ImageString 就是前4条几句根据图片转换来的字符串
                                                              \'拼接结果为 Insert aaa values(0xFFD8FFE000104A46494600010101006000600000FFDB004………………)
cmd.ExecuteNonQuery()


--  作者:askbang
--  发布时间:2015/12/3 17:08:00
--  

用你的方法,为何ImageString为空呢?

 

        Dim dlg As New OpenFileDialog
        dlg.Filter = "图形文件|*.bmp;*.jpg;*.gif;*.png"
        If dlg.ShowDialog = DialogResult.OK Then
            Dim fs As New IO.FileStream(dlg.FileName, IO.FileMode.Open , IO.FileAccess.Read) \'用文件流打开图片
            Dim br As New IO.BinaryReader(fs) \'根据文件流,声明一个二进制阅读器
            Dim ImageByte() As Byte = br.ReadBytes(fs.Length) \'阅读器读取文件流,并将独到的二进制放入数组ImageByte中,
            Dim ImageString As String = BitConverter.ToString(ImageByte).Replace("-", "")  \' SQLCommand 不能直接Insert 二进制,只能拼接SQL语句,所以这里把二进制变成字符
            msgbox(ImageString) \'此处为何为空呢?
        End If


--  作者:大红袍
--  发布时间:2015/12/3 17:15:00
--  

不是空值,msgbox如果字符过多,就不显示了。

 

你可以用 output.show


--  作者:askbang
--  发布时间:2015/12/3 17:28:00
--  

此法执行时内存占用很高啊,且速度慢,觉得不可取,是否还有其他更好的办法?


--  作者:大红袍
--  发布时间:2015/12/3 17:59:00
--  
以下是引用askbang在2015/12/3 17:28:00的发言:

此法执行时内存占用很高啊,且速度慢,觉得不可取,是否还有其他更好的办法?


那就对应的表,不要用动态fill进来的方式,你在项目把表引用进来,直接在主表那里新增一行数据。


--  作者:Hyphen
--  发布时间:2015/12/4 8:48:00
--  
如果表是通过sqlcommand或者其它方式动态生成的,用新增的行做SQLInsertFile是不行的,只能用加载出来的行来SQLInsertFile,如

Dim cr As Row = tb.AddNew()
cr("车牌号") = e.Form.Controls("car_code").Text
cr("车辆类型") = e.Form.Controls("car_cat").Text

cr.DataRow.Save()

Dim drs As List(Of DataRow) = DataTables("tb对应的表").AppendLoad("车牌号 = \'" & cr("车牌号") & "\'" & "其它条件",False)
If drs.Count  = 1 Then
    Dim dlg As New OpenFileDialog
    If dlg.ShowDialog = DialogResult.OK Then
        drs(0).SQLInsertFile("图片", dlg.FileName) \'插入文件
    End If
End If