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



程序返回System.Data.Datat。我希望返回数据集的项。

我有一个包含4个表的数据库:BandsFestivalsStages;以及一个连接表-Band_Festival

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

我正在尝试让WCF检索数据,并向Form返回DataSetlist<DataSet>

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

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

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

当sql查询的WHERE条件为festival_name = 'Boomtown Fair'时,调用返回"System.Data.Datat">,我需要项列表。当条件为festival_name = @festivalParameters.AddValue("@festival", Festivals)时,抛出异常并伴有"Parameter not supply">

这里有一些代码:

表单

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:WCFFestivalBandsWCFFestivalBandsApp_DataFestivalBands.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传递和返回值。从数据集中传递列表是下一个级别。非常感谢您的帮助。

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

提前谢谢。

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

字符串节日{get;set;}
ComBoxFestivals.SelectedItem=节日;

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

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

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

class Product
{
private string name = "Apple";
public int ID { get; set; }
public string Name
{
get { return name; }
set { this.name = value; }
}
}

我怀疑你能否从WCF返回List<DataSet>,数据集可以是任何东西,它不知道如何序列化它。

我们所做的传输是使用DTO(数据传输对象)。基本上,这只是一种奇特的说法,创建一个具体的类并确保它标记有DataContract属性,并且在适当的情况下用DataMember属性标记每个属性。E.g

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

在这里阅读更多关于他们

使用数据合约

最新更新