| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 1227 人关注过本帖
标题:Sql server2008 varbinary(max) 数据类型存储问题
只看楼主 加入收藏
eepcvfp
Rank: 2
等 级:论坛游民
帖 子:162
专家分:15
注 册:2013-8-12
结帖率:87.5%
  已结贴   问题点数:20  回复次数:10   
Sql server2008 varbinary(max) 数据类型存储问题
各位老师:
    我打算将文件存入Sql server2008的varbinary(max)字段内,具体过程如下:

1、将文件转换为二进制

cFile = GETFILE( )
m.cBase64Txt = STRCONV(FILETOSTR(m.cFile), 13)


2、调用存储过程,将二进制编码后的文件存入varbinary(max)字段
程序代码:

* 数据库连接代码略
m.cSQL_CommandTxt =exec myUpdate ?1, ?cScheduleBase64Txt”  && 具体细节经过简化
m.nResult = SQLEXEC(m.nHandle, m.cSQL_CommandTxt)    && 执行操作


现在的问题是:
小于5K的文件能保存成功,但大于5K(不是很确定)却总是失败。

请问各位老师:这是什么问题?难道存储过程传递参数有大小限制?
2018-03-04 22:52
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:86
帖 子:2590
专家分:6355
注 册:2015-3-25
  得分:0 
* 数据库连接代码略
m.cSQL_CommandTxt = “exec myUpdate ?1, ?cScheduleBase64Txt”  && 具体细节经过简化
m.nResult = SQLEXEC(m.nHandle, m.cSQL_CommandTxt)    && 执行操作

改为,中途不用变量,看看.

m.nResult = SQLEXEC(m.nHandle, "exec myUpdate ?1, ?cScheduleBase64Txt")    && 执行操作
2018-03-05 13:15
eepcvfp
Rank: 2
等 级:论坛游民
帖 子:162
专家分:15
注 册:2013-8-12
  得分:0 
以下是引用mywisdom88在2018-3-5 13:15:10的发言:

* 数据库连接代码略
m.cSQL_CommandTxt = “exec myUpdate ?1, ?cScheduleBase64Txt”  && 具体细节经过简化
m.nResult = SQLEXEC(m.nHandle, m.cSQL_CommandTxt)    && 执行操作

改为,中途不用变量,看看.

m.nResult = SQLEXEC(m.nHandle, "exec myUpdate ?1, ?cScheduleBase64Txt")    && 执行操作


谢谢老师指点。我按照您说的修改后仍然不行。

我现在仍然使用的是varbinary(max)类型,但取消了二进制编码过程,直接

cFile = GETFILE( )
m.cBase64Txt = FILETOSTR(m.cFile)

现在可以存入9k的文件了,以前只要大于5k就会失败,但我试图将一个42k的文件存入时,依然失败了。
2018-03-05 15:27
eepcvfp
Rank: 2
等 级:论坛游民
帖 子:162
专家分:15
注 册:2013-8-12
  得分:0 
我购买的是“美橙互联”的100M数据库作为测试,会不会是“美橙互联”这边作了限制??
2018-03-05 15:28
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:86
帖 子:2590
专家分:6355
注 册:2015-3-25
  得分:20 
2018-03-05 17:09
eepcvfp
Rank: 2
等 级:论坛游民
帖 子:162
专家分:15
注 册:2013-8-12
  得分:0 
以下是引用mywisdom88在2018-3-5 17:09:41的发言:

https://bbs.bccn.net/thread-465736-1-1.html
我以前测试的.


谢谢版主,我先研究一下您的代码,不懂的地方再请教。
2018-03-05 18:47
eepcvfp
Rank: 2
等 级:论坛游民
帖 子:162
专家分:15
注 册:2013-8-12
  得分:0 
版主您好,我使用了您的设置
=sqlsetprop(0,[DISPWARNINGS],(.f.))   &&不提示错误信息
=sqlsetprop(0,[DISPLOGIN],3)           &&不显示ODBC登录框
=sqlsetprop(0,[CONNECTTIMEOUT],10)     &&连接等待时间
=sqlsetprop(0,[QUERYTIMEOUT],600)      &&错误等待时间,刚开始是10的,只能40M,看帮助,设600,能成功上传280M
=sqlsetprop(0,[WaitTime],600)          &&执行前延迟时间,刚开始,是没设置这项,能成功上传115M。

上传文件仍然不能超过5k,如果不进行二进制编码,上能传9K的文件,我要上传的文件不会超过1M的。
2018-03-05 19:51
wcx_cc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:21
帖 子:208
专家分:528
注 册:2015-10-2
  得分:0 
如果楼主不用存储过程,直接用 SPT 进行 update 先试试. 是存储里有限制,还是表字段有限制.
2018-03-05 21:26
eepcvfp
Rank: 2
等 级:论坛游民
帖 子:162
专家分:15
注 册:2013-8-12
  得分:0 
好的,我先试试
2018-03-05 21:32
eepcvfp
Rank: 2
等 级:论坛游民
帖 子:162
专家分:15
注 册:2013-8-12
  得分:0 
以下是引用mywisdom88在2018-3-5 17:09:41的发言:

https://bbs.bccn.net/thread-465736-1-1.html
我以前测试的.


版主您好:在您的链接的启发下,我的问题解决了。

虽然问题解决了,但我还是不知道原因,所以还想在这里继续请教各位老师。

先说说解决的过程:
1、SQL Server2008 字段类型为 varbinary(max)

2、我将二进制编码的过程由
程序代码:

cFile = GETFILE( )
m.cBase64Txt = STRCONV(FILETOSTR(m.cFile), 13)

* 文件还原时用
StrToFile(STRCONV(Blob字段名, 14), 'c:\aaa.txt')


修改为:
程序代码:

cFile = GETFILE( )
m.cBase64Txt = CREATEBINARY(FILETOSTR(m.cFile))

* 文件还原时用
StrToFile(Blob字段名, 'c:\aaa.txt')


所有问题就解决了。

这里我想问的是:为什么用 STRCONV(FILETOSTR(m.cFile), 13) 进行二进制编码就会出问题,而用 CREATEBINARY(FILETOSTR(m.cFile)) 问题就解决了呢?
我以前也经常用 STRCONV(FILETOSTR(m.cFile), 13) 编码啊,也没有出问题。
2018-03-05 22:03







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025950 second(s), 8 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved