Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WCF Data Services, Stored Procedure, Complex Type, and Collections 
:(
    Опции темы
eXplowar
  Дата 11.3.2013, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 18.7.2010

Репутация: нет
Всего: нет



Задача простая, выполнить хранимую процедуру с параметрами и получить результат.

В WCF хранимую процедуру реализую как в примере из книги OData Programming Cookbook for .NET Developers

Проверяю решение в браузере вызовом своей SP с параметрами - работает.

Перехожу в клиентское приложение, пытаюсь вызвать ХП следующим образом:
Код

string uri = string.Format("http://localhost:4637/MainDataService.svc/uspGetOrdersByCustomer?customerId={0}", this.tbxUspGetOrdersByCustomer.Text);
IEnumerable<MainDataServiceReference.uspGetOrdersByCustomer_Result> ordersList = context.Execute<MainDataServiceReference.uspGetOrdersByCustomer_Result>(new Uri(uri));
this.dgOrdersByCustomer.ItemsSource = ordersList;

Попутно проверяю получение List<T>:
Код

IEnumerable<String> stringList = context.Execute<String>(new Uri("http://localhost:4637/MainDataService.svc/GetStringList"));
this.dgStringList.ItemsSource = stringList;

В OData 5.0.0 и OData 5.3.0 ошибки разные.

OData 5.0.0
    WCF Data Service Server (Microsoft.Data.Services) 5.0.0
    WCF Data Service Client (Microsoft.Data.Services.Client) 5.0.0
    ODataLib (Microsoft.Data.OData) 5.0.0
    EdmLib (Microsoft.Data.Edm) 5.0.0
    System.Spatial 5.0.0


GetStringList:
    В строковом значении обнаружен XML-узел типа "Element". Элемент со строковым значением может содержать только узлы Text, CDATA, SignificantWhitespace, Whitespace и Comment.

uspGetOrdersByCustomer:
    Свойство "element" не существует в типе "WpfApplication.MainDataServiceReference.uspGetOrdersByCustomer_Result". Используйте только имена свойств, определенные в типе.

OData 5.3.0
    WCF Data Service Server (Microsoft.Data.Services) 5.3.0
    WCF Data Service Client (Microsoft.Data.Services.Client) 5.3.0
    ODataLib (Microsoft.Data.OData) 5.3.0
    EdmLib (Microsoft.Data.Edm) 5.3.0
    System.Spatial 5.3.0


GetStringList:
    Невозможна материализация коллекции типов-примитивов или сложных типов без типа "Edm.String", который коллекцией.

uspGetOrdersByCustomer:
    Невозможна материализация коллекции типов-примитивов или сложных типов без типа "WpfApplication.MainDataServiceReference.uspGetOrdersByCustomer_Result", который коллекцией.

Data Services:
Код

public class TestDataService : DataService<EntityLib.MyEntities>
{
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("*", EntitySetRights.All);
        config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
    }

    [WebGet]
    public int GetInt()
    {
        return 1;
    }

    [WebGet]
    public List<String> GetStringList()
    {
        List<String> myList = new List<String>();
        myList.Add("First string");
        myList.Add("Second string");
        myList.Add("Third string");

        return myList;
    }

    [WebGet]
    public IQueryable<EntityLib.Order> GetOrderById(int orderId)
    {
        var res = this.CurrentDataSource.Order.Where(o => o.OrderID == orderId);
        return res;
    }

    [WebGet]
    public IQueryable<EntityLib.uspGetOrdersByCustomer_Result> uspGetOrdersByCustomer(int customerId)
    {
        var res = CurrentDataSource.uspGetOrdersByCustomer(customerId).AsQueryable();
        return res;
    }
}

Client side:
Код

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        context = new DataServiceContext(new Uri("http://localhost:4637/MainDataService.svc/"));
    }

    DataServiceContext context;

    private void btnGetInt_Click(object sender, RoutedEventArgs e)
    {
        IEnumerable<int> varInt = context.Execute<int>(new Uri("http://localhost:4637/MainDataService.svc/GetInt"));
        this.tbckGetInt.Text = varInt.LastOrDefault().ToString();
    }

    private void btnGetStringList_Click(object sender, RoutedEventArgs e)
    {
        IEnumerable<String> stringList = context.Execute<String>(new Uri("http://localhost:4637/MainDataService.svc/GetStringList"));
        this.dgStringList.ItemsSource = stringList;
    }

    private void btnGetOrderById_Click(object sender, RoutedEventArgs e)
    {
        string uri = string.Format("http://localhost:4637/MainDataService.svc/GetOrderById?orderId={0}", this.tbxGetOrderById.Text);
        IEnumerable<MainDataServiceReference.Order> orderById = context.Execute<MainDataServiceReference.Order>(new Uri(uri));
        this.dgOrderById.ItemsSource = orderById;
    }

    private void btnUspGetOrdersByCustomer_Click(object sender, RoutedEventArgs e)
    {
        string uri = string.Format("http://localhost:4637/MainDataService.svc/uspGetOrdersByCustomer?customerId={0}", this.tbxUspGetOrdersByCustomer.Text);
        IEnumerable<MainDataServiceReference.uspGetOrdersByCustomer_Result> ordersList = context.Execute<MainDataServiceReference.uspGetOrdersByCustomer_Result>(new Uri(uri));
        this.dgOrdersByCustomer.ItemsSource = ordersList;
    }
}

Stored Procedure:
Код

CREATE PROCEDURE [dbo].[uspGetOrdersByCustomer](@customerId INT)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT OrderID, CustomerID, OrderDate FROM dbo.[Order] WHERE (CustomerID = @customerId)
END


Метод GetOrderById работает, но он в отличии от моей хранимой процедуры возвращает не ComplexType, а EntityType.

Баг описан на Microsoft Connect

Какие варианты можно применить в обход данной проблемы?

Проект: http://sdrv.ms/14Mcf2E
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.1003 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.