Lightswitch执行选择存储过程以显示数据

时间:2014-05-14 11:53:44

标签: c# sql stored-procedures visual-studio-lightswitch

我是Lightswitch的新手,我想完成以下任务:

在我的数据库中我有一个存储过程显示(选择sp)一些数据,如何从lightswitch调用此sp来显示从sp检索到的数据?

提前感谢。

3 个答案:

答案 0 :(得分:1)

这似乎是一项合理的任务,但Lightswitch并不容易。 只是为了帮助您,这里有一些提示:

  1. 首先,当您编写自己的RIA服务或OData源并且您可以完全控制您的实体时,这会变得更加容易。
  2. 当使用Lightswitch开箱即用时,有一个命令模式' hack'实现这一点,在论坛中被认为是既定的模式。
  3. 简短概述是:您在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)

我找到了解决这个问题的方法,或者至少有一些网站告诉你如何:

link1 link2

<强> 摘要:

你必须通过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;)