powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Запись данных в MSSQL через WCF из Silverlight
2 сообщений из 2, страница 1 из 1
Запись данных в MSSQL через WCF из Silverlight
    #37037044
sameness
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день! У меня проблема с записью данных в базу данных.
Имеется класс в проекте silverlight:
Код: plaintext
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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
    [DataServiceKey("Id")]
    public class UserData : INotifyPropertyChanged
    {
        private long _id;
        private string _surname;
        private string _name;
        private byte[] _image;

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }

        public long Id
        {
            get
            {
                return this._id;
            }
            set
            {
                this._id = value;
                NotifyPropertyChanged("Id");
            }
        }

        public string Surname
        {
            get
            {
                return this._surname;
            }
            set
            {
                this._surname = value;
                NotifyPropertyChanged("Surname");
            }
        }

        public string Name
        {
            get
            {
                return this._name;
            }
            set
            {
                this._name = value;
                NotifyPropertyChanged("Name");
            }
        }

        public string FullName
        {
            get
            {
                return (this.Surname + " " + this.Name).Trim();
            }
        }

        public byte[] Image
        {
            get
            { 
                return this._image; 
            }
            set
            {
                this._image = value;
                NotifyPropertyChanged("Image");
            }
        }
    }

следующим асинхронным запросом я извлекаю данные:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
// Выдержка из метода
                    context = context == null ? new UserEntities(this.EntitiesUri) : context;
                    var query = from u in context.User
                                where u.Id == this.UserId
                                select new UserData
                                {
                                    Id = u.Id,
                                    Name = u.Name,
                                    Surname = u.Surname,
                                    Image = u.Image
                                };
// Далее идет асинхронный запрос, в результате которого происходит присвоение DataContext'у UserGrid'а полученных результатов

здесь все проходит замечательно, однако когда я пытаюсь изменить какие то данные и записать их в бд по примеру из MSDN:
Код: plaintext
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.
        private void UploadImageButton_Click(object sender, RoutedEventArgs e)
        {
// ...Некоторые действия с OpenFileDialog
            FileStream imageStream = openImageDialog.File.OpenRead();
            byte[] b = new byte[imageStream.Length];
            imageStream.Read(b, 0, Convert.ToInt32(imageStream.Length));
            dataUser[0].Image = b;
            context.BeginSaveChanges(OnChangesSaved, context);
        }

        public void OnChangesSaved(IAsyncResult result)
        {
            Dispatcher.BeginInvoke(() =>
                {
                    context = result.AsyncState as UserEntities;
                    try
                    {
                        context.EndSaveChanges(result);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            );
        }
картинка отображается, с ней все норм. а данные в бд не записываются.. возникает исключение:
System.Data.Services.Client.DataServiceRequestException: При обработке этого запроса произошла ошибка. ---> System.Data.Services.Client.DataServiceClientException: BadRequest
в System.Data.Services.Client.SaveResult.<HandleBatchResponse>d__10.MoveNext()
--- Конец трассировки стека внутреннего исключения ---
в System.Data.Services.Client.SaveResult.HandleBatchResponse()
в System.Data.Services.Client.SaveResult.EndRequest()
в System.Data.Services.Client.DataServiceContext.EndSaveChanges(IAsyncResult asyncResult)
в UserProject.MainPage.<>c__DisplayClass3.<OnChangesSaved>b__2()
Все разрешения на запись стоят:
Код: plaintext
1.
config.SetEntitySetAccessRule("User", EntitySetRights.All);
Междоменный доступ тоже открыт, иначе я бы не смог данные прочитать.
Подскажите что я делаю не так??
...
Рейтинг: 0 / 0
Запись данных в MSSQL через WCF из Silverlight
    #37040065
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sameness...
Подскажите что я делаю не так??

Все...

1. посмотрите еще 1 раз на пример из MSDN и найдите 10 отличий от вашего кода;
(в частности обратите внимание на комментарий: "This needs to be a batch operation" , а также на особую обработку "catch (DataServiceRequestException ex)" специального исключения, на которое вы и нарвались, похерив его в своем коде);

2. если ловите в своем коде общее исключение ( "catch (Exception ex)" ), то давайте себе труда - раскрыть весь стек InnerException-s, а не просто показывайте "верхний уровень", в котором настоящая проблема может быть зарыта на 3-4 уровня вложенности InnerException-s;

3. почитайте хоть что-нить про Async Pattern и способы его реализации под .NET, т.к. передавать контекстом тот экземпляр, на котором выполняется асинхронная операция ( "context.BeginDoSomething(..., context)" ), чтобы потом изменить его в лямбде-обработчике ( "context = result.AsyncState as SomethingUsefull" ) - это надо обладать очень хорошей фантазией;

4. ну, и до кучи: ваш "ленивый" "context = context ?? new UserEntities(this.EntitiesUri);" , судя по всему, собирается "жить" вечно на уровне основной страницы приложения, между тем, как лямбды его "захватывающие" (closure) создаются при каждой обработке каждого запроса на сервер за каждым UserData, т.е. ссылки на context в этих лямбдах - тоже будут "жить вечно"...
(а потом приходят люди сюда на форум и спрашивают - "а почему у меня память течет?", дык, потому и течет, что "дерут" все из MSDN, не задумываясь особо о том, что именно "дерут" и зачем оно там написано).

З.Ы. поясняю - на MSDN пишут примеры работы для "концепций", а не для реальных приложений...
(ИМХО).

З.З.Ы. "разжевывать" дальше ничего не буду - свою голову на чужие плечи не приладишь... ("вброс" дан - разбирайтесь со своими проблемами сами).
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Запись данных в MSSQL через WCF из Silverlight
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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