当前位置:编程学习 > C#/ASP.NET >>

求救Delpih调用C#开发的webService返回一个DataSet怎么处理

在C#里在数据库(SQLServer)中得到一个结果集并转换成一个XML字符返回到客户端,客户端怎么接受这个数据类型并显示到ClientDataSet中 --------------------编程问答-------------------- Delpih中的话..  只能自己拆分XML数据了..  不熟Delpih --------------------编程问答-------------------- 同样的问题在困惑着我.
在跨语言时,各种参数的传递问题.目前,我仅能实现用Delphi传送string,integet等简单类型,更复杂一些的参数如果在delphi与.net之间传递?
与楼主共顶. --------------------编程问答-------------------- 不要返回DataSet,而是直接返回DataSet内容的XML,然后再解析这个XML.
--------------------编程问答--------------------
[WebMethod(Description="根据SQL语句获取数据",EnableSession=true)]
public string GetDataSet(string SQL,string TableName)
{
DataSet ds=new DataSet();
DataTable table=DAO.DBWR.Instance.GetData(SQL);
table.TableName="Result";
ds.Tables.Add(table);

System.IO.StringWriter sw=new System.IO.StringWriter();
ds.WriteXml(sw,XmlWriteMode.IgnoreSchema);

return sw.ToString();
} --------------------编程问答-------------------- 如果不是NET平台 返回就不是DS类型 而是一个 XML 了!  只所以NET平台是DS  那时CLR做了工作 --------------------编程问答-------------------- 偶已经成功接受,并显示在ClientDataSet中,
1.在webService中作楼上处理
*****************
[WebMethod(Description="根据SQL语句获取数据",EnableSession=true)]
public string GetDataSet(string SQL,string TableName)
{
DataSet ds=new DataSet();
DataTable table=DAO.DBWR.Instance.GetData(SQL);
table.TableName="Result";
ds.Tables.Add(table);

System.IO.StringWriter sw=new System.IO.StringWriter();
ds.WriteXml(sw,XmlWriteMode.IgnoreSchema);

return sw.ToString();
}
*****************

2.在delphi要作处理,
  第一.得到xml,
  第二.用delphi的XML Mapper打开xml,生成对应*.xtr文件
  第三.delphi程式中添加XMLTransformProvider1,ClientDataSet的ProviderName属性设成XMLTransformProvider1
  第四.XMLTransformProvider1的TransformRead属性的子属性TransformationFile指向第二步生成的*.xtr文件
  第五.接收处理.
       定义变量B:WideString;
       省略代码****  
       B := 接收的XML字符串。
       ClientDataset1.Active := FALSE;
       XMLDoc := NewXMLDocument;//当然,XMLDoc 要在前边定义好
       XMLDoc.Encoding := 'SUTF8';
       XMLDoc.LoadFromXML(B);
       //XMLDoc.SaveToFile('Test.xml');
       XMLTransformProvider1.TransformRead.SourceXmlDocument :=   XMLDoc.GetDOMDocument;
  ClientDataset1.Active := TRUE;  //怎么连接到DBGrid就不用写了吧 
搞定收工    
--------------------编程问答-------------------- 第二.用delphi的XML Mapper打开xml,生成对应*.xtr文件
偶是现学的,楼主在网上找找,应该很多教程 --------------------编程问答-------------------- 没必要,换我就直接用C#做客户端拉倒。 --------------------编程问答--------------------
 xml:=(Httprio1 as WebService1Soap).users;
 ClientDataset1.Active:=false;
 ClientDataset1.XMLData :=xml;
 ClientDataset1.Active:=true;

  public static string ToClientDataSet(DataSet ds, string TableName)
        {
        int FieldCount = ds.Tables[TableName].Columns.Count;
        string result = "<?xml version=\"1.0\" standalone=\"yes\"?>";
        result += "<DATAPACKET Version=\"2.0\">";
        result += "<METADATA><FIELDS>";
        for (int i = 0; i < FieldCount; i++) {
            DataColumn dc = ds.Tables[TableName].Columns[i];
            string FieldType = dc.DataType.Name.ToLower();
            // integer
            if (FieldType.ToLower() == "int32")
                FieldType = "i4";
            // int64
            if (FieldType.ToLower() == "int64")
                FieldType = "i8";
            // float
            if (FieldType.ToLower() == "single")
                FieldType = "r8";
            // memo
            if (FieldType.ToLower() == "string" && dc.MaxLength > 255)
                FieldType = "bin.hex";
            // bytes
            if (FieldType.ToLower() == "byte[]")
                FieldType = "bin.hex";
            result += string.Format("<FIELD attrname=\"{0}\" fieldtype=\"{1}\" ", dc.ColumnName, FieldType);
            if (FieldType == "bin.hex" && dc.DataType.Name.ToLower() == "string")
                result += "SUBTYPE=\"Text\" ";
            else if (FieldType == "string")
                result += string.Format("WIDTH=\"{0}\" ", dc.MaxLength);
            else if (FieldType == "sqldatetime")
                result += "SUBTYPE=\"Formatted\"";
            else if (FieldType == "bin.hex" && dc.DataType.Name.ToLower() != "string" || dc.DataType.Name.ToLower() == "byte[]")
                result += "SUBTYPE=\"Binary\"";
            result += "/>";
        }
        result += "</FIELDS><PARAMS/></METADATA>";
        result += "<ROWDATA>";
        int RowCount = ds.Tables[TableName].Rows.Count;
        for (int i = 0; i < RowCount; i++) {
            result += "<ROW RowState=\"4\" ";
            for (int j = 0; j < FieldCount; j++) {
                DataTable dt = ds.Tables[TableName];
                string value = dt.Rows[i].ItemArray[j].ToString();
                value = value.Replace("\"", """);
                result += string.Format("{0}=\"{1}\" ", 
                    dt.Columns[j].ColumnName,
                    value);
            }
            result += "/>";
        }
        result += "</ROWDATA></DATAPACKET>";
        return result;
    }
--------------------编程问答-------------------- 通过XML,解析与反解析~~~
补充:.NET技术 ,  Web Services
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,