none
数据库导出照片问题 RRS feed

  • 问题

  • 各位新年快乐~~

    我在导出含有照片的数据表时碰到了问题,根据向导生产的schema,照片blob字段导出后为:  <xs:element minOccurs="0" maxOccurs="1" name="PHOTO" nillable="true" type="xs:base64Binary" />,在部署后导出数据的时候,发现消息只有4K(调试出来的消息拷到了txt中),照片数据导出不完整。

    调整了消息中字段的位置,发现都会在4K时截断,请问这个是在哪里设置的?

    我使用的是oracle适配器。

    2009年2月7日 2:17

答案

  • “在HAT中,断点调试的话,在接收到照片消息的那个形状已经photo长度不对了”
    --Photo的数据是从oracle数据库读出来的?

    那就再跟踪确定一下,photo的数据在从物理端口出来时就不对了,还是到了流程里不对的
    专注于biztalk。 chnking.cnblogs.com
    2009年2月9日 4:44

全部回复

  • 可能我上面的猜测误导了大家。还是贴下错误描述,大家帮我分析下吧。

    事件类型: 错误
    事件来源: BizTalk Server 2006
    事件种类: BizTalk Server 2006
    事件 ID: 5754
    日期:  2009-2-8
    事件:  21:13:21
    用户:  N/A
    计算机: SJJH
    描述:
    A message sent to adapter "WCF-Custom" on send port "SendPort_JYPhotoToZX" with URI "oracledb://JYZX" is suspended.
     Error details: Microsoft.ServiceModel.Channels.Common.TargetSystemException: ORA-06502: PL/SQL: 数字或值错误 :  字符串缓冲区太小
    ORA-06512: 在 "CARD.UPDATEPHOTO", line 21
    ORA-06512: 在 line 1 ---> Oracle.DataAccess.Client.OracleException ORA-06502: PL/SQL: 数字或值错误 :  字符串缓冲区太小
    ORA-06512: 在 "CARD.UPDATEPHOTO", line 21
    ORA-06512: 在 line 1    在 Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure)
       在 Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, String procedure, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src)
       在 Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()
       在 Microsoft.Adapters.OracleDB.OracleDBXmlParser.ExecuteSingleCommand(OracleCommand command, Boolean recordPresent, Boolean accumateRowAffected)
       在 Microsoft.Adapters.OracleDB.OracleDBXmlParser.ExecutePackProcFunc(AdapterDataTable parsedMessage)
       --- 内部异常堆栈跟踪的结尾 ---

    Server stack trace:
       在 System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result)
       在 System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult result)
       在 System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
       在 System.ServiceModel.Channels.ServiceChannel.EndRequest(IAsyncResult result)

    Exception rethrown at [0]:
       在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
       在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
       在 System.ServiceModel.Channels.IRequestChannel.EndRequest(IAsyncResult result)
       在 Microsoft.BizTalk.Adapter.Wcf.Runtime.WcfClient`2.RequestCallback(IAsyncResult result)
     MessageId:  {177CC1B8-CA80-4496-82A3-865E4095B857}
     InstanceID: {DC3B9760-AA8B-4A26-A1C0-790B2A0EE4A3}

    有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。

    2009年2月8日 13:59
  • 查了下资料,.net调用存储过程的时候,如果发现“数字或值错误 :  字符串缓冲区太小“错误,那么可以在调用的地方对输入输出参数的大小进行设置,就可以解决了。
    那么在biztalk中?这个photo字段怎么进行大小设置。属性中也无大小长度设置。。。
    2009年2月8日 14:06
  • Oracle那头是不是用的存储过程?
    是不是在存储过程用于保存拼接sql语句的那个字符串变量的长度不够

    专注于biztalk。 chnking.cnblogs.com
    2009年2月9日 1:48
  • 照片存储过程里面也是用blob字段么,不用设置长度的么。
    2009年2月9日 1:55
  • 是说形成sql语句的字符串,比如:
    declare @sql char(100) --Sql语句字符串
     set @sql = 'insert into #tempSingle select  type,hgqybm as code,'''' as name,sum(amount) as amount from statdata..' + @tableImp + 'where ' + @whereSub + ' group by hgqybm'

    这里的@sql变量的长度可能不够


    专注于biztalk。 chnking.cnblogs.com
    2009年2月9日 2:18
  • 我的存储过程如下:
    create or replace procedure UPDATEPHOTO
    (
      K_REPERSISENTADDRKIND  varchar2,
      K_CERTNUMBER     VARCHAR2,
      K_PHOTO          BLOB,
      K_MODIFYTYPE     VARCHAR2,
      K_RETURN    out     VARCHAR2
    )
    is
      num        number;
      clientname   varchar2(10);
      clientsex   varchar2(10);
    begin
      if K_MODIFYTYPE = 0 then  -----新增
         ----判断是否存在
         select count(*) into num from zx_photo where CERTNUMBER = K_CERTNUMBER and REPERSISENTADDRKIND = k_REPERSISENTADDRKIND;
         if num <> 0 then
           k_return := 2;
           return;
         end if;
         select name,sex into clientname,clientsex from zx_citizen where CERTNUMBER = K_CERTNUMBER and REPERSISENTADDRKIND = k_REPERSISENTADDRKIND;
         insert into zx_photo values(K_CERTNUMBER, clientname,clientsex,K_PHOTO,k_REPERSISENTADDRKIND);
         K_RETURN := 0;
      else
       ----判断是否存在
         select count(*) into num from zx_photo where CERTNUMBER = K_CERTNUMBER and REPERSISENTADDRKIND = k_REPERSISENTADDRKIND;
         if num = 0 then
           k_return := 1;
           return;
         end if;
         update zx_photo set photo = K_PHOTO where CERTNUMBER = K_CERTNUMBER and REPERSISENTADDRKIND = k_REPERSISENTADDRKIND;
         K_RETURN := 0;
      end if;
    end UPDATEPHOTO;

     我在biztalk中现在用到的是上面标记那句。上面报错的21行,好像也是我标记的那句。应该是里面的photo产生的缓冲区问题。但是这个字段用blob定义,不管在存储过程还是在biztalk里面,我都不知道怎么设置大小。
    2009年2月9日 3:18
  • 这样测试一下,在biztalk流程发送消息到oracle的那个发送形状那断点一下,看看要发送出去的消息的PHOTO部分的长度是不是已经不对了。
    专注于biztalk。 chnking.cnblogs.com
    2009年2月9日 3:42
  • 在HAT中,断点调试的话,在接收到照片消息的那个形状已经photo长度不对了,整个消息拷到txt中是4k,但是在接收那边不报错,经过mapping,到另一个发送形状时,报错。断点进去,photo也是部分了,整个消息也是4K,所以我最初怀疑是消息长度设置问题。但后然想可能调试那边显示4K,但是实际在流程里,消息还是全的。
    然后我贴了错误信息,从最初始地方查错误么。
    2009年2月9日 4:30
  • “在HAT中,断点调试的话,在接收到照片消息的那个形状已经photo长度不对了”
    --Photo的数据是从oracle数据库读出来的?

    那就再跟踪确定一下,photo的数据在从物理端口出来时就不对了,还是到了流程里不对的
    专注于biztalk。 chnking.cnblogs.com
    2009年2月9日 4:44
  • 经过在端口处调试发现,不管是在接收到photo的端口,还是在发送照片数据端口,消息都是正确的。

    然后才发现应该怀疑自己的存储过程,呵呵,是因为我2张表中同一字段长度设置不同了,然后测试数据刚好又帮我体现了出来,但是自己首先怀疑了biztalk,错误啊~~~~呵呵,谢谢大家的关注~~

    2009年2月10日 5:48
  • 经过测试接收和发送端口数据,发现消息都是正确的。

    然后发现了错误是在存储过程中,怀疑错了方向~~~
    2009年2月10日 5:52
  • To 金剑忠:

    我也遇到一个类似的问题,找了两天一直找不到解决办法,刚才看到你的回复,突然感觉,我的问题的应该就是你所说的。 
    我的就是Oracle存储过程,原来的拼sql语句变量是varchar(8000)时出错,将其改为varchar(20000)问题解决了。非常感谢你的回答。
    2009年9月2日 7:42