我正在创建一个简单的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);
}
有人能帮帮我吗?谢谢你的任何建议!
答案 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.您是否尝试在回调中添加断点(第一个示例)以查看它是否被调用以及调用它的结果
希望这些问题有助于解决问题