Как передать свойство String в WCF и вернуть набор данных? - PullRequest
0 голосов
/ 23 декабря 2018

Программа возвращает System.Data.DataSet .Я хочу вернуть элементы набора данных.

У меня есть база данных с 4 таблицами: Bands, Festivals, Stages;и таблица соединений - Band_Festival.

SQL запрашивает всю работу при выполнении, а DataGridView в форме отображает правильные записи.

Я пытаюсь, чтобы WCF получилданные и вернуть DataSet или list<DataSet> в форму.

Выбранный элемент ComboBox в форме должен передаваться в wcf при выполнении вызова, который используется в качестве параметра для запроса SQL.

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

используется для передачи параметра в запрос sql.

Когда условие WHERE запроса sql равно festival_name = 'Boomtown Fair', вызов возвращает "System.Data.DataSet" , я хочусписок предметов.Если условие festival_name = @festival с Parameters.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.Передача списка из набора данных является следующим уровнем.Любая помощь очень ценится.

Я не добавил в таблицы столбцы или строки, не уверен, что это подходит?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

В соответствии с вашими фрагментами кода, я копирую и тестирую его локально, похоже, что на вашем конце WCF-сервера нет ошибок.В противном случае это не удастся, если вы жестко закодируете оператор SQL для запроса к вашей базе данных.Но я не смог найти процесс инициализации вашего свойства Festivals при использовании сервиса на стороне клиента.

String Festivals {get;задавать;}
ComBoxFestivals.SelectedItem = Festivals;

этот фрагмент кода может быть причиной, вызвавшей вашу проблему.
В .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; }
        }
}
0 голосов
/ 23 декабря 2018

Я сомневаюсь, что вы можете вернуть List<DataSet> из WCF, DataSet может быть чем угодно, и он не будет знать, как его сериализовать.

Что мы делаем для транспортировки, так это используем DTO (Data Transport Object).По сути, это просто причудливый способ сказать, создать конкретный класс и убедиться, что он помечен атрибутом DataContract, а каждое свойство помечено атрибутом DataMember, где это необходимо.Например,

[DataContract]
public class PurchaseOrder
{

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

Подробнее о них можно узнать здесь

Использование контрактов данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...