Silverlight 2 - Добавление записей базы данных с использованием WCF - PullRequest
2 голосов
/ 23 февраля 2009

Я создаю простое приложение Silverlight 2 - гостевую книгу. Я использую MSSQL в качестве источника данных, мне удалось загрузить данные, но я не могу узнать, как добавить новые строки (сообщения) в базу данных.

Я просканировал весь интернет, но не нашел работающего решения. Таблица SCMEssages имеет четыре столбца - MessageID, MessageDate, MessageAuthor и MessageText. Прямо сейчас у меня есть следующий код в классе Service1 (который реализует интерфейс IService1) (хотя не работает):

    public void SaveMessage(SCMessage message)
    {
        DataClasses1DataContext db=new DataClasses1DataContext();
        db.GetTable<SCMessage>().Attach(message);
        db.SubmitChanges();
    }

В основном классе я просто вызываю этот метод:

    private void SendBtn_Click(object sender, RoutedEventArgs e)
    {
        SCMessage sm = new SCMessage
                           {
                               MessageAuthor = NameTB.Text,
                               MessageDate = DateTime.Now,
                               MessageText = TextTB.Text
                           };
        newMessages.Add(sm);

        ServiceReference1.Service1Client client = new Service1Client();
        client.SaveMessageAsync(sm);
    }

Кто-нибудь может мне помочь? Спасибо за любые предложения!

Ответы [ 5 ]

1 голос
/ 24 февраля 2009

Я не уверен, что полностью понимаю контекст (например, контролируете ли вы свою службу WCF и / или вашу БД). Но вы рассматривали услуги ADO.Net Data? (также известный как astoria ) (http://msdn.microsoft.com/en-us/library/cc668792.aspx)

Тогда вам не нужно создавать для него веб-сервис, он уже создан для вас.

По сути, это простой способ получить доступ к вашим данным из Silverlight и даже иметь возможность выполнять запросы из Silverlight.

В блогах уже есть немного документации, например: Быстрый старт здесь: http://michaelsync.net/2008/01/15/consuming-adonet-data-service-astoria-from-silverlight Как обновить данные можно посмотреть здесь: http://michaelsync.net/2008/02/10/crud-operations-in-siverlight-using-adonet-data-service

Полный рабочий пример здесь: http://www.silverlightdata.com/

Обратите внимание, что во многих примерах в Интернете прокси-сервер silverlight генерируется с использованием командной строки, однако это больше не требуется, вы можете сделать это непосредственно из VS, используя «add service reference» для вашего проекта и указав его на вашу службу данных ado.net

Надеюсь, это немного поможет?

Tjipke

0 голосов
/ 25 февраля 2009

Chrasty,

Я не вижу никаких явных ошибок. Так что в теории это будет работать (в настоящее время я работаю почти каждый день с такими запросами. Несколько вопросов: 1. Можете ли вы использовать Fiddler2, чтобы увидеть, что происходит по проводу. (Если вы не знаете, что такое fiddler, то google :-), и если после этого вы используете fiddler на localhost, добавьте «.» в URL в браузере (например, http: \ localhost.: 1234 \ mywebsitehostingsilverlight.aspx), -> запрещает другой поиск в Google) 2. Есть ли у вас трассировка стека второго броска исключения? 3. Пытались ли вы установить точку останова в обратном вызове (первый пример), чтобы увидеть, вызывается ли она и с каким результатом она называется

Надеюсь, что эти вопросы немного помогут в решении проблемы

0 голосов
/ 25 февраля 2009

И вот небольшая проблема с Асторией - она ​​не работает для меня. Я следовал руководству Michael Sync и внес несколько изменений, таких как использование DataServiceQuery, потому что WebDataQuery не существует в финальной версии Astoria, и т. Д. В итоге я получил два фрагмента кода - первый практически идентичен копии в Michael Статья Sync и вторая используют LINQ-запрос вместо метода CreateQuery (я думаю, что оба эти подхода приводят к одной и той же цели). Вот фрагменты:

SilverchatDBEntities entity =
                new SilverchatDBEntities(new Uri("http://localhost:65373/WebDataService1.svc", UriKind.Absolute));
            entity.MergeOption = MergeOption.OverwriteChanges;
            DataServiceQuery<SCMessages> messages = entity.CreateQuery<SCMessages>("SCMessages");

            messages.BeginExecute(
                result =>
                    {
                        var mess = messages.EndExecute(result);
                        foreach (var mes in mess)
                        {
                            MessagesLB.Items.Add(mes.MessageAuthor);
                        }
                    },
                null);

Это ничего не делает - оно не выдает никаких исключений и не загружает никаких сообщений SCM. Второй фрагмент выглядит следующим образом:

            SilverchatDBEntities entity =
            new SilverchatDBEntities(new Uri("http://localhost:65373/WebDataService1.svc", UriKind.Absolute));
        var query = (DataServiceQuery<SCMessages>) from m in entity.SCMessages select m;
        query.BeginExecute(new AsyncCallback(result =>
                                                 {
                                                     try
                                                     {
                                                         var mes = query.EndExecute(result);

                                                         foreach (var r in mes)
                                                         {
                                                             MessagesLB.Items.Add(string.Format("{0}; {1} - {2}",
                                                                                                r.MessageDate.
                                                                                                    ToString(
                                                                                                    "d/M hh:mm",
                                                                                                    CultureInfo.
                                                                                                        InvariantCulture),
                                                                                                r.MessageAuthor,
                                                                                                r.MessageText));
                                                         }
                                                     }
                                                     catch (Exception ex)
                                                     {
                                                         MessageBox.Show(ex.Message);
                                                     }
                                                 }), null);

Этот объект выдает исключение в цикле 'foreach' - 'Ссылка на объект не установлена ​​на экземпляр объекта'. Я понятия не имею, в чем может быть проблема.

0 голосов
/ 23 февраля 2009

SCMessage - это имя класса данных - я создал файл из шаблона "Linq to SQL Classes" (.dbml) и перетащил и уронил таблицу SCMessages в конструктор. Он украшен атрибутом [DataContract], и я установил для свойства DataContext Serialiation Mode значение Unidirectional. Таким образом, содержимое класса SCMessage генерируется автоматически, но как минимум часть его:

[Table(Name="dbo.SCMessages")]
[DataContract()]
public partial class SCMessage : INotifyPropertyChanging, INotifyPropertyChanged
{

    private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);

    private int _MessageID;

    private string _MessageAuthor;

    private string _MessageText;

    private System.DateTime _MessageDate;

#region Extensibility Method Definitions
partial void OnLoaded();
partial void OnValidate(System.Data.Linq.ChangeAction action);
partial void OnCreated();
partial void OnMessageIDChanging(int value);
partial void OnMessageIDChanged();
partial void OnMessageAuthorChanging(string value);
partial void OnMessageAuthorChanged();
partial void OnMessageTextChanging(string value);
partial void OnMessageTextChanged();
partial void OnMessageDateChanging(System.DateTime value);
partial void OnMessageDateChanged();
#endregion

    public SCMessage()
    {
        this.Initialize();
    }

    [Column(Storage="_MessageID", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
    [DataMember(Order=1)]
    public int MessageID
    {
        get
        {
            return this._MessageID;
        }
        set
        {
            if ((this._MessageID != value))
            {
                this.OnMessageIDChanging(value);
                this.SendPropertyChanging();
                this._MessageID = value;
                this.SendPropertyChanged("MessageID");
                this.OnMessageIDChanged();
            }
        }
    }
0 голосов
/ 23 февраля 2009

SCMessage украшен атрибутом [DataContract] или это [Сериализуемый]? Пожалуйста, предоставьте нам определение SCMessage.

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