我是Lightswitch的新手,我想完成以下任务:
在我的数据库中我有一个存储过程显示(选择sp)一些数据,如何从lightswitch调用此sp来显示从sp检索到的数据?
提前感谢。
答案 0 :(得分:1)
这似乎是一项合理的任务,但Lightswitch并不容易。 只是为了帮助您,这里有一些提示:
简短概述是:您在Lightswitch中定义自定义实体(或表)。它可以代表任何事物。
如果您的sp采用参数,通常建议为参数创建列。
这个想法是你有一个命令按钮或被调用的按钮。在MyButton_Execute()
覆盖中,您可以在表格中插入值(您调用workspace.ApplicationData.MyCustomTable.AddNew()
,设置值,然后调用Save_Changes()
)。
然后截取保存管道:MyCustomTable_Inserting(MyCustomTable entity)
方法。在这里,您编写了ado.net代码来调用sp。然后黑客就会调用this.Details.DiscardChanges()
...你并没有真正添加新行...你只是使用管道访问一个可以注入自定义ado代码的点。 / p>
现在,显示结果有点棘手。通常,我们的想法是你的sp更新了一些基础表,如果你刷新屏幕,更新的数据将显示在那些相关表的控件中。
要捕获并显示sp的实际结果,您必须进行实验。也许您的屏幕会显示“我的自定义表”'作为集合,如果它返回结果集,则将sp输出捕获到同一实体。或者,如果它返回一行,也许你可以手动更新一些链接到文本框的屏幕参数....正如我所说,Lightswitch不会让它变得简单,因为它不跟踪sp作为表的调用已修改的实体。另请注意,如果您在ado调用完成后尝试更新屏幕,则您将使用其他线程。可能你最好的选择是在你的实际数据库中有一个接收sp输出的表,然后让Lightswitch简单地将结果表视为任何其他表。您可能需要添加某种标识符,以便可以过滤当前屏幕以仅显示特定于该屏幕的调用的sp结果。祝你好运。
答案 1 :(得分:0)
我找到了解决这个问题的方法,或者至少有一些网站告诉你如何:
<强> 摘要: 强>
你必须通过RIA WCF库来解决这个问题,(请看上面的帖子),然后在你的lightswitch应用程序中添加这个“类”作为参考。比制作一个获取sp回馈数据的对象。
我是如何解决的
我做的是,我将选中的 sp转换为 insert sp并使用此sp将数据插入到空表中。您需要做的是为sp本身创建一个不同的表。 完成后,您可以将此代码添加到您的数据源:
partial void StoredProcedureDefinitions_Inserting(StoredProcedureDefinition entity)
{
using (SqlConnection connection = new SqlConnection())
{
string connectionStringName = this.DataWorkspace.dbsMSccData.Details.Name;
connection.ConnectionString =
ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
string procedure = entity.Procedure;
using (SqlCommand command = new SqlCommand(procedure, connection))
{
command.CommandType = CommandType.StoredProcedure;
//foreach (var item in entity.StoredProcedureParameters)
//{
// command.Parameters.Add(
// new SqlParameter(item.ParameterName, item.ParameterValue));
//}
connection.Open();
command.ExecuteNonQuery();
}
}
this.Details.DiscardChanges();
}
并将此代码添加到您的屏幕:
partial void Overzicht_project_telling_Created()
{
DataWorkspace dataWorkspace = new DataWorkspace();
var operation = dataWorkspace.ApplicationData.StoredProcedureDefinitions.AddNew();
//operation.Database = "dbMSccData";
operation.Procedure = "dbo.Overzicht_Project_telling_s001";
dataWorkspace.ApplicationData.SaveChanges();
this.Refresh();
}
应该做的伎俩
我希望这很有用。 -regards Corwin
答案 2 :(得分:0)
我找到了另一种克服这个问题的方法。我目前的解决方案是大量使用SP层。因此,为了能够将复杂SP的结果传递给LS,我只需使TSQL表函数运行SP即可。然后使用该函数中的简单select *添加SQL View。 LS允许导入视图。工作得很好。
要强制LS将字段视为主键,您可以使用ISNULL([field], - 1)。
要强制LS不将字段视为PK,请使用NULLIF([field],&#39;&#39;)