从WCF填充列表框

本文关键字:列表 填充 WCF | 更新日期: 2023-09-27 18:18:55

我在如何从WCF填充列表框上非常挣扎。这是我在尝试实现WCF之前使用的旧代码:

lstProcesses.BeginUpdate();
        lstProcesses.Items.Clear();
        while (dr.Read())
        {
            lstProcesses.Items.Add(dr.GetString(0));
        }
        dr.Close();
        con.Close();
        lstProcesses.EndUpdate();*/

我的新尝试代码是:

public void ShowData2()
    {
        try
        {
            ServiceReference6.Service1Client obj6 = new ServiceReference6.Service1Client();
            if (obj6.SelectSavedProcessInformation())
            {
                string passed = "";
            lstProcesses.Items.Add(obj6);
            }
            else
            {
                string failed = "";
            }
        }
        catch
        {

        }
    }

我的WCF包含如下内容:

 public bool SelectSavedProcessInformation()
    {
       SqlConnection con = new SqlConnection(@"Data Source=localhost;Initial Catalog=WCFTest;Integrated Security=True;Pooling=False");
        con.Open();
        SqlCommand cmd = new SqlCommand("SELECT Processes FROM SaveProcesses", con);
        var result = cmd.ExecuteReader();
        if (result.HasRows)
        {
            con.Close();
            return true;
        }
        else
        {
            con.Close();
            return false;
        }
    }
    }

我很确定我在这里做了一些错误的事情,因为列表框正在被"logging .cs. servicerefence6 . service1client"填满。"

对如何实现wcf有什么想法吗?

从WCF填充列表框

嗯,通常当我试图使用WCF从Db获取数据时,我在字符串中序列化对象,然后在客户端级别反序列化。从您的代码片段中,我猜您应该返回一个DataTable,序列化它,然后在必须填充列表框时进行反序列化。我要做的是:在你的IService接口中,我声明如下:

[OperationContract]
string GetDataTableFromDB();

在您的Service.svc.cs文件中,我将实现如下内容:

public string GetDataTableFromDB()
{
    // your code to retrieve from DB the DataTable
    // there are plenty examples here in stackoverflow
    // I will use "retrievedDataTable" name for the retrieved table
    return Serialize<DataTable>(retrievedDataTable);        
}

为了确保序列化正确工作,我将创建一个包含DataTable对象的类,因为如果JSON试图序列化的对象没有[DataMember]标志,JSON可能会报错。所以:

[DataContract]
public class Result
{
    [DataMember]
    public DataTable ResultDataTable { get; set; }
}

在您的客户端,我将调用具有数据表的方法:

public void ShowData2()
{
    try
    {
        ServiceReference6.Service1Client obj6 = new ServiceReference6.Service1Client();
        DataTable table = Deserialize<DataTable>(obj6.SelectSavedProcessInformation());
        if(table != null)
        {
           foreach(DataRow row in table.Rows)
           {
               // fill the listbox
           }
        }

我使用的序列化和反序列化代码是:

    public class JsonHelper
{
    public static string JsonSerializer<T>(object obj)
    {
        try
        {
            if (obj == null)
                return null;
            using (MemoryStream ms = new MemoryStream())
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                serializer.WriteObject(ms, obj);
                ms.Position = 0;
                using (StreamReader reader = new StreamReader(ms))
                {
                    return reader.ReadToEnd();
                }
            }
        }
        catch { return null; }
    }
    public static T JsonDeserialize<T>(string source)
    {
        try
        {
            if (source == null)
                return default(T);
            using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(source)))
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
                if (ms.Length == 0)
                    return default(T);
                return (T)serializer.ReadObject(ms);
            }
        }
        catch { return default(T); }
    }
}

我从来没有使用过序列化数据表,但我希望它的工作