如何将String属性传递给WCF并返回数据集?

时间:2018-12-23 01:13:07

标签: c# sql-server wcf dataset

程序返回 System.Data.DataSet 。我想要返回数据集的项目。

我有一个包含4个表的数据库:BandsFestivalsStages;和联结表-Band_Festival

SQL查询执行后的所有工作,并且表单上的DataGridView显示正确的记录。

我正在尝试让WCF检索数据并将DataSetlist<DataSet>返回到表单。

进行调用时,表单上的选定ComboBox项应传递给wcf,该项用作SQL查询的参数。

String Festivals {get; set;} ComboBox.SelectedItem = Festivals

用于将参数传递给sql查询。

当sql查询的WHERE条件为festival_name = 'Boomtown Fair'时,调用返回“ System.Data.DataSet” ,我需要项目列表。当条件为festival_name = @festivalParameters.AddValue("@festival", Festivals)时,抛出异常,并且“未提供参数”

以下是一些代码:

表格

String Festivals { get; set; }

    FestivalsBandsServiceReference.FestivalBandsServiceClient ws = null;
    public Form1()
    {
        InitializeComponent();
        ComBoxFestivals.SelectedItem = Festivals;
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        ws = new FestivalsBandsServiceReference.FestivalBandsServiceClient();
    }
    private void comBoxFestivals_SelectedIndexChanged(object sender, EventArgs e)
    {

        List<String> festival = ws.GenerateNewBandList(Festivals);

        Console.WriteLine(String.Join("," ,festival));
    }

FestivalBandsService.svc.cs

public List<DataSet> GenerateNewBandList(String Festivals)
    {

        List<DataSet> bands = new List<DataSet>();

        string dataSource = @"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename = " +
                       @"D:\WCFFestivalBands\WCFFestivalBands\App_Data\FestivalBands.mdf; Integrated Security = True; Connect Timeout = 30";


        //Create new instance of sql connection, pass in the connection string for FestivalBands.mdf to connect to database.
        SqlConnection conn = new SqlConnection(dataSource);

        string sqlQuerySelectBands = "SELECT Bands.Band_Name FROM Band_Festival JOIN dbo.Bands ON Bands.Band_ID =" +
                                  "Band_Festival.Band_ID JOIN dbo.Festival ON Festival.Festival_ID " +
                                  "= Band_Festival.Festival_ID WHERE Festival_Name = @festival";

        SqlCommand cmd = new SqlCommand(sqlQuerySelectBands, conn);
        cmd.Parameters.AddWithValue("@festival", Festivals);

        conn.Open();

        //Create new instance of DataAdpater to retrieve the data pass in Sql command
        SqlDataAdapter da = new SqlDataAdapter(cmd);

        //Create new instance of dataSet to hold the data retrieved from sql query
        DataSet ds = new DataSet();

        //using DataAdapter fill in dataSet wiht data if user input and stored data matches
        da.Fill(ds);

        bands.Add(ds);

        return bands;
    }
}

IFestivalBandsService.cs

     [ServiceContract]
public interface IFestivalBandsService
{ 
    [OperationContract]
    List<DataSet> GenerateNewBandList(String Festivals);
}

这是很新的。仅了解了如何使用WCF传递和返回值。从dataSet传递列表是下一级。任何帮助将不胜感激。

我还没有添加表的列或行,不确定是否相关?

谢谢。

2 个答案:

答案 0 :(得分:0)

我怀疑您可以从WCF返回一个List<DataSet>,DataSet可以是任何东西,并且它不知道如何序列化它。

我们要进行的传输是使用DTO(数据传输对象)。基本上,这只是一种幻想的表达方式,创建一个具体的类并确保将其标记为DataContract属性,并且在适当的地方,每个属性都标记为DataMember属性。例如

[DataContract]
public class PurchaseOrder
{

    // Apply the DataMemberAttribute to the property.
    [DataMember]
    public int PurchaseOrderId { get; set
}

在此处详细了解它们

Using Data Contracts

答案 1 :(得分:0)

根据您的代码段,我在本地复制并测试了它,看来WCF服务器端没有错误。否则,当您对SQL语句进行硬编码以查询数据库时,它将不会成功。但是当您在客户端使用服务时,我找不到初始化Festivals属性的过程。

  

弦乐节{组; }
  ComBoxFestivals.SelectedItem =节日;

这些代码最简短的原因可能是导致您出现问题的原因。 在.net 4.6+中,您可以参考以下代码来设置属性的默认值。


sum.compute_at(output, x_inner)

或者您可以参考以下代码。

public int Price { get; set; } = 100;