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