powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF Data Services, Stored Procedure, Complex Type and Collections
2 сообщений из 2, страница 1 из 1
WCF Data Services, Stored Procedure, Complex Type and Collections
    #38179604
eXplowar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача простая, выполнить хранимую процедуру с параметрами и получить результат.

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

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

Перехожу в клиентское приложение, пытаюсь вызвать ХП следующим образом:
Код: c#
1.
2.
3.
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>:
Код: c#
1.
2.
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
Код: plaintext
1.
2.
3.
4.
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
Код: plaintext
1.
2.
3.
4.
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
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
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
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
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
Код: sql
1.
2.
3.
4.
5.
6.
7.
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
...
Рейтинг: 0 / 0
WCF Data Services, Stored Procedure, Complex Type and Collections
    #38181136
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eXplowar,

да слушай, ты забурился не в то ведро и теперь изляпался))

wcf не имеет прослойки для работы с БД.
он только в своей прослойке работает на базе servicecontract.

автор http://localhost:4637/MainDataService.svc/uspGetOrdersByCustomer?customerId={0}
этот адрес вызова просто вызывает метод из класс помеченного servicecontract и ожидает от метода результата.
Допустим этот метод List<...> uspGetOrdersByCustomer (int customerId)
тип возвращаемых данных List<...>

Чтобы это сделать без всяких надстроек для ускорения работы, просто сделай следующее:
1.в методе uspGetOrdersByCustomer используй ADO.net или sql to linq , чтобы вызвать процедуру на БД и взять от нее результат, а потом просто подставить результат в return метода. и все.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF Data Services, Stored Procedure, Complex Type and Collections
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]