以下服务器端,如果从客户端生成DW的syntax,传到webserive以下的方法中,得到的数据始终为0,如果我用SQL代码动态生成DW的SYNTAX得到的数据是正确的,如以下//的内容。我也有测试,如果按传统的C/S结构,用Describe("DataWindow.Syntax")再用ds_1.Create(as_syntax,as_errtext) ,是成功的。但不知道为什么,经过webserive的传输后,得到的数据就不对?
这是为什么呢?困扰了好长段时间了??
//String ls_sql
//ls_sql = 'select * from it_port'
//String error_syntaxfromSQL,ls_data
//String new_sql, new_syntax
//new_syntax = SQLCA.SyntaxFromSQL(ls_sql, 'Style(Type=Form)', error_syntaxfromSQL)
/*
string as_syntax:从客户端生成DW的syntax
*/
IF ds_1.Create(as_syntax,as_errtext) <> 1 THEN
as_errtext = '生成数据窗口出错'+as_errtext
DISCONNECT Using SQLCA;
RETURN ''
END IF
IF ds_1.SetTransObject(SQLCA) <> 1 THEN
as_errtext = '设置事务出错'+is_err_a
DISCONNECT Using SQLCA;
RETURN ''
END IF
ds_1.Retrieve()
IF ds_1.RowCount() = 0 THEN
as_errtext = '0'
END IF
ls_xmldata = ds_1.Describe("datawindow.data")
------解决方案--------------------
//====================================================================
// 事件: n_webservice.of_getdata_sql()
//--------------------------------------------------------------------
// 描述:利用as_sql创建datastore,压缩后返回as_blob
//--------------------------------------------------------------------
// 参数:
// value string as_sql[]
//reference long al_long[]
// reference blob as_blob[]
//--------------------------------------------------------------------
// 返回: integer
//--------------------------------------------------------------------
// 作者: fjw 日期: 2009年03月31日
//--------------------------------------------------------------------
//
//--------------------------------------------------------------------
// 修改历史:
//
//====================================================================
string ls_errors,ls_presentation_str,ls_dwsyntax_str
long li_count,i
datastore ds[]
blob lb_blob[],lb_temp
long li_ret=1
string ls_tempstr
if ib_connect=false then
return -11
end if
li_count=UpperBound(as_sql)
ls_presentation_str="style(type=grid)"
for i=1 to li_count
ls_dwsyntax_str=sqlca.SyntaxFromSQL(trim(as_sql[i]),ls_presentation_str,ls_errors)
ds[i]=create datastore
li_ret=ds[i].Create( ls_dwsyntax_str, ls_errors)
if li_ret=-1 or isnull(li_ret) then
li_ret=-12
exit
end if
ds[i].settransobject(sqlca)
ds[i].retrieve()
ls_tempstr=ds[i].Describe("datawindow.data")
lb_blob[i]=blob(ls_tempstr)
al_long[i]=len(lb_blob[i])
lb_temp=lb_temp+lb_blob[i]
next
if li_ret>=0 then
//没取到数据
if isnull(lb_temp) or len(lb_temp)=0 then
of_disconnect()
for i=1 to li_count
if isvalid(ds[i]) then
destroy ds[i]
end if
next
return 1000
end if
//判断是否超过预订长度,超过者压缩
if len(lb_temp)>il_max then
if n_zlib1.of_compress(lb_temp,as_blob)=false then
li_ret=-3
end if
li_ret=200
else
as_blob=lb_temp
li_ret=100
end if
end if
for i=1 to li_count
if isvalid(ds[i]) then
destroy ds[i]
end if
next
of_disconnect()
return li_ret