Silverlight 2 - 使用WCF添加数据库记录

时间:2009-02-23 19:31:04

标签: c# database wcf silverlight

我正在创建一个简单的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 个答案:

答案 0 :(得分:1)

我不确定我是否完全了解上下文(就像您控制WCF服务和/或数据库一样)。但您考虑过ADO.Net数据服务吗? (也称为astoria) (http://msdn.microsoft.com/en-us/library/cc668792.aspx)

然后您不需要为它创建Web服务,它已经为您创建。

基本上,它是一种从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/

请注意,在Web上的很多示例中,使用命令行生成silverlight代理,但不再需要它,您可以使用“添加服务引用”直接在VS中直接执行并指向它到您的ado.net数据服务

希望这有点帮助?​​

Tjipke

答案 1 :(得分:0)

SCMessage是用[DataContract]属性修饰还是[Serializable]?请向我们提供SCMessage的定义。

答案 2 :(得分:0)

SCMessage是数据类的名称 - 我从模板“Linq to SQL Classes”(。dbml)创建了一个文件,并将SCMessages表拖放到Designer中。它使用[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();
            }
        }
    }

答案 3 :(得分:0)

这是Astoria的一个小问题 - 它对我不起作用。我按照Michael Sync的教程进行了一些修改,例如使用DataServiceQuery,因为在Astoria的最终版本中不存在WebDataQuery等等。我最终得到了两个代码片段 - 第一个是迈克尔的几乎相同的副本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);

这不会做任何事情 - 它不会抛出任何异常,也不会加载任何SCMessages。第二个片段如下:

            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'循环中抛出异常 - '对象引用未设置为对象的实例'。我不知道问题是什么。

答案 4 :(得分:0)

Chrasty,

我还没有看到任何明显的错误。所以从理论上讲它是可行的(我目前几乎每天都在进行这类查询。有几个问题: 你能用fiddler2来看看电线是什么吗? (如果你不知道fiddler是什么,那么google :-)如果之后你在localhost上使用fiddler,那么请添加一个'。'在浏览器的url中(如http:\ localhost。:1234 \ mywebsitehostingsilverlight.aspx), - &gt;阻止其他谷歌搜索) 2.你是否有第二个抛出异常的堆栈跟踪。 3.您是否尝试在回调中添加断点(第一个示例)以查看它是否被调用以及调用它的结果

希望这些问题有助于解决问题