winform程序,目前遇到的问题是这样的我有一个服务器和一个客户机,服务器负责数据库的查询,客户发送查询字符串和接受服务器返回的结果但是我想知道如果我需要的是一个dataset类型的返回结果,服务器用什么方法才能把这样的结果返回过来用的是TCP连接,我目前只能让服务器返回string类型的结果求大神指导

解决方案 »

  1.   

    把dataset的数据序列化,然后进行传输
      

  2.   

    dataset以流的方式写成xml,然后生成xml的字符串传给客户端
    客户端根据xml字符串在生成datasetDataSet.WriteXml(...);DataSet.ReadXml(...);
      

  3.   

    写的示例如下:收到后转成 DataSet 是 ds.ReadXml
    private void button1_Click(object sender, EventArgs e)
    {
        DataSet ds;
        TcpClient tc;
        //// 获取 ds 和连接 tc
        WriteDataSet(ds, tc.GetStream());
    }private void WriteDataSet(DataSet ds, NetworkStream stream)
    {
        ds.WriteXml(stream, XmlWriteMode.WriteSchema);
    }
      

  4.   

    我用这个方法,总是出现异常 遇到意外的结束标记 ...服务端代码,这是客户端直接连接上就立马查询发送dataset
    private void AcceptTcpClientCallBack(IAsyncResult iar)
            {
                try
                {
                    allDone.Set();
                    string sql = "";
                    DataSet ds = new DataSet();
                    SqlConnection conn = new SqlConnection("server=(local);database=BookLeaseSystem;integrated security=SSPI");
                    TcpListener mylistener = (TcpListener)iar.AsyncState;
                    TcpClient client = mylistener.EndAcceptTcpClient(iar);
                    listBoxStatus.Invoke(setlistboxballback, "已接受客户端连接:" +
                        client.Client.RemoteEndPoint);
                    comboBox1.Invoke(setcomboboxcallback, client.Client.RemoteEndPoint.ToString());
                    DataReadWrite datareadwrite = new DataReadWrite(client);
                    clientlist.Add(datareadwrite);
                    //SendString(datareadwrite, "服务器已经接受连接,请通话");
                    sql = "select * from booktype where typeid = 1";
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    da.Fill(ds);
                    ds.WriteXml(client.GetStream(), XmlWriteMode.WriteSchema);
                }
                catch (Exception e)
                {
                    listBoxStatus.Invoke(setlistboxballback, e.Message);
                    return;
                }
            }
    客户端 private void Readcallback()
            {
               try
               {
                    DataSet ds = new DataSet();
                    ds.ReadXml(client.GetStream(), XmlReadMode.ReadSchema);
                    dataGridView1.DataSource = ds.Tables[0];
               }
               catch (Exception e)
               {
                   listBoxStatus.Invoke(setlistboxcallback,e.Message);
               }
            }
    dataset.write和dataset.read 是不是我这样用的
      

  5.   

    客户端收到的内容怎么查看,我没找到方法...
    因为客户端里
    单步到ds.ReadXml(client.GetStream(), XmlReadMode.ReadSchema);
    这行就会直接出错 导致程序退出,也不是异常中断...
    运行程序的话显示是 这样的意外的结束标记...
      

  6.   


    这是正解 ,服务端只能返回XML形式的字符串,的在客户端生产。反序列化
      

  7.   

    你的先看看你的web服务是否正确,如果正确,客户端接受到的一定是正确的
      

  8.   

    下面可以把收的数据写入c:\1.xml
    FileStream fs = new FileStream(@"c:\1.xml", FileMode.Create);
    int b;
    while ((b = tc.GetStream().ReadByte()) != -1)
    {
        fs.WriteByte((byte)b);
    }
    fs.Close();
      

  9.   

    发现问题了,现在是用dataset.readxml之后貌似程序不知道何时读取完毕...
    客户端会停留在ds.readxml上,此时如果服务端再次发送数据,客户端会引发异常,提示多个根元素,导出xml后查看发现是因为客户端第一次的读取没有结束...直接又接受第二次的数据导致根元素重复
    现在就是不知道怎么才能让ds.readxml读取完第一次发送的数据后结束...有招吗
      

  10.   

    我的是winform程序,发送的xml没有错误,现在就是dataset.readxml的流读取不能结束...
    第一次发送完成后readxml不会结束,而是继续在client.getstream()上等待数据...
      

  11.   

    最好是一次连接取一个数据集,马上断开,否则判断结束是个问题,因为 TCP 发送数据是论字节的。