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

C# Silverlight 2-使用WCF添加数据库记录,c#,database,wcf,silverlight,C#,Database,Wcf,Silverlight,我正在创建一个简单的Silverlight2应用程序-一个留言簿。我使用MSSQL作为数据源,我已设法加载数据,但我无法找到如何向数据库添加新行(消息) 我爬遍了所有的互联网,但没有找到任何有效的解决方案。SCMEssages表有四列—MessageID、MessageDate、MessageAuthor和MessageText。现在我在Service1类(实现IService1接口)中有以下代码(但不起作用): 有人能帮我吗?谢谢你的建议 SCMessage是用[DataContract]属性

我正在创建一个简单的Silverlight2应用程序-一个留言簿。我使用MSSQL作为数据源,我已设法加载数据,但我无法找到如何向数据库添加新行(消息)

我爬遍了所有的互联网,但没有找到任何有效的解决方案。SCMEssages表有四列—MessageID、MessageDate、MessageAuthor和MessageText。现在我在Service1类(实现IService1接口)中有以下代码(但不起作用):


有人能帮我吗?谢谢你的建议

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

SCMessage是数据类的名称-我从模板“Linq到SQL类”(.dbml)创建了一个文件,并将SCMessages表拖放到设计器中。它由[DataContract]属性修饰,我将其DataContext的序列化模式属性设置为单向。因此,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();
            }
        }
    }

我不确定我是否完全理解了上下文(比如您是否控制WCF服务和/或数据库)。但是你考虑过ADO.NET数据服务吗?(也称为) (

那么您就不需要为它创建Web服务,它已经为您创建了

基本上,这是一种从Silverlight中访问数据的简单方法,甚至可以从Silverlight中执行查询

博客中已经有一些文档,例如: 这里有一个快速入门: 如何更新数据可在此处查看:

下面是一个完整的工作示例:

请注意,在web上的许多示例中,silverlight代理是使用命令行生成的,但是不再需要该命令行,您可以直接从VS中使用“添加服务引用”到项目并将其指向ado.net数据服务

希望这有点帮助


Tjipke

这是Astoria的一个小问题-它对我不起作用。我遵循Michael Sync的教程并做了一些修改,例如使用DataServiceQuery,因为WebDataQuery在Astoria的最终版本中不存在,等等。最后我得到了两个代码片段——第一个几乎是Michael的一个相同的副本ync的文章和第二篇文章是使用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);
SilverchatDBEntities实体=
新的SilverchatDBEntities(新的Uri(“http://localhost:65373/WebDataService1.svc“,UriKind.Absolute”);
entity.MergeOption=MergeOption.OverwriteChanges;
DataServiceQuery消息=entity.CreateQuery(“SCMessages”);
messages.BeginExecute(
结果=>
{
var mess=messages.EndExecute(结果);
foreach(var mes处于混乱状态)
{
MessagesLB.Items.Add(mes.MessageAuthor);
}
},
无效);
这没有任何作用-它不会引发任何异常,也不会加载任何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);
SilverchatDBEntities实体=
新的SilverchatDBEntities(新的Uri(“http://localhost:65373/WebDataService1.svc“,UriKind.Absolute”);
var query=(DataServiceQuery)从entity.SCMessages中的m选择m;
BeginExecute(新的异步回调(结果=>
{
尝试
{
var mes=query.EndExecute(结果);
foreach(mes中的var r)
{
MessagesLB.Items.Add(string.Format(“{0};{1}-{2}”),
r、 消息日期。
托斯特林(
“d/M hh:mm”,
文化信息。
不变量文化),
r、 消息作者,
r、 消息文本);
}
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}),空);
这一个在“foreach”循环中抛出异常-“对象引用未设置为对象的实例”。我不知道可能是什么问题。

Chrasty

我还没有看到任何明显的错误。因此理论上它应该可以工作(我目前几乎每天都在处理此类查询。有几个问题: 1.您可以使用fiddler 2查看网络上发生了什么。(如果您不知道fiddler是什么,则使用google:-)如果之后您在localhost上使用fiddler,则请在浏览器的url中添加“.”(如http:\ localhost.:1234\mywebsitehostingsilverlight.aspx),->阻止其他google搜索) 2.您是否有一个堆栈跟踪
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);
            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);