Foxtable(狐表)用户栏目专家坐堂 → SQLInsertFile问题


  共有2417人关注过本帖树形打印复制链接

主题:SQLInsertFile问题

帅哥哟,离线,有人找我吗?
askbang
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:105 积分:1140 威望:0 精华:0 注册:2015/1/12 0:29:00
SQLInsertFile问题  发帖心情 Post By:2015/12/3 16:13:00 [只看该作者]

对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


 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2015/12/3 16:17:00 [只看该作者]

你的图片列不是二进制列吧?

 回到顶部
帅哥哟,离线,有人找我吗?
askbang
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:105 积分:1140 威望:0 精华:0 注册:2015/1/12 0:29:00
  发帖心情 Post By:2015/12/3 16:39:00 [只看该作者]

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


 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:105 积分:1140 威望:0 精华:0 注册:2015/1/12 0:29:00
  发帖心情 Post By: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


 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2015/12/3 17:15:00 [只看该作者]

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

 

你可以用 output.show


 回到顶部
帅哥哟,离线,有人找我吗?
askbang
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:105 积分:1140 威望:0 精华:0 注册:2015/1/12 0:29:00
  发帖心情 Post By:2015/12/3 17:28:00 [只看该作者]

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


 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2015/12/3 17:59:00 [只看该作者]

以下是引用askbang在2015/12/3 17:28:00的发言:

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


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


 回到顶部
帅哥哟,离线,有人找我吗?
Hyphen
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:5015 积分:25363 威望:0 精华:0 注册:2015/8/18 9:21:00
  发帖心情 Post By: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

 回到顶部