访问 SQL Server 中的数据

直接访问

如果您在创建应用时选择从数据开始选项,库的 Items 属性有一个 Power Fx 公式,其中的数据源名称直接指向您的数据库表。

例如,如果您有一个 BOOKLENDING 表,您会看到下面的公式:

Search([@'[dbo].[BOOKLENDING]'], SearchInput1.Text, author, author,book_name,category)

视图和存储过程

常见的专业数据访问模式是使用视图然后使用存储过程进行创建、更新和删除,不允许直接访问。 如果要使用视图或存储过程,必须更改公式示例。 同样,记录的窗体也不使用 SubmitForm() 公式的内置直接方法。

触发器

一种数据库模式是在表中使用触发器。 如果表有触发器,您则无法使用直接模式 Submit() 进行创建、更新和删除。 Submit() 在处理 SQL 触发器和内置 Power Apps 行为(使用相同输出参数)之间有冲突。

不过,您可以直接访问表来进行查询,但要处理 CreateUpdateDelete,您必须调用存储过程。

添加数据源

使用视图

视图 是显示为单个数据表的已保存查询。

视图显示在添加数据源时可以选择的表格列表中。 视图仅支持查询,不支持更新。 您必须使用存储过程进行更新。

如果您使用 Start with data 选项创建表,您将在库和窗体中看到显示记录的屏幕和公式。 您可以使用公式和功能进行创建、编辑和删除。 但是,如果您使用视图,则只会看到库和窗体的显示屏幕。

您可能希望从 Start with data 自动生成视图屏幕。

对于此自动生成选项:

  1. 使用基本表选择 Start with data
  2. 删除和替换表数据源。

示例

例如,如果您有一个 BOOKLENDINGVIEW 表,将其添加为 Power Apps 的数据源,公式可能很简单:

BOOKLENDINGVIEW

您也可以使用视图数据源和存储过程调用替换其他创建、更新和删除公式。

使用存储过程

向应用添加 SQL Server 连接时,您可以添加存储过程,然后直接在 Power Fx 中调用它们。

备注

此功能也适用于安全隐式连接。

显示可添加到您的应用的表、视图和存储过程列表的屏幕截图。

选择存储过程后,将显示一个子节点,您可以将存储过程指定为库和表的安全使用

如果存储过程没有需要执行的可能在某些情况下不需要的操作,它就是安全的。 例如,如果存储过程从指定的城市收集了所有客户,然后向他们发送电子邮件。 您可能不希望每次调用存储过程时都发送电子邮件。 因此,存储过程不应标记为安全。

应仅在以下情况下确认存储过程是安全的:

  1. 按需调用此程序没有副作用

    您应该能够多次调用过程,或每当刷新 Power Apps 控件时调用该过程。 当与库或表的 Items 属性一起使用时,只要系统确定需要刷新,Power Apps 就会调用存储过程。 您无法控制何时调用存储过程。

  2. 您在存储过程中返回适中的数据。

    操作调用(如存储过程)对检索的行数没有限制。 它们不会自动以 100 条记录增量进行分页,例如表格数据源(如表或视图)。

    如果存储过程返回的数据太多(成千上万个记录),您的应用可能会运行缓慢或崩溃。 出于性能考虑,引入的记录应不超过 2,000。

如果您确认存储过程是安全的,您可以将存储过程指定为库中的 Items 属性,供表在应用中使用。

重要提示

存储过程返回值的架构应该是静态的,因此,值不会随着调用而变化。 例如,如果存储过程返回两个表,则 它始终返回 两个表。 您可以使用类型化或非类型化的结果。

结果的结构也需要是静态的。 例如,如果结果的架构是动态的,则结果是非类型化的,您必须提供类型以在 Power Apps 使用它们。 有关详细信息,请参阅非类型化结果

附加到存储过程名称之前的 SQL 命名空间

SQL Server 命名空间名称(用于存储过程)被附加到存储过程名称之前。 例如,'DBO' SQL Server 命名空间中的所有存储过程在名称的开头都带有 'dbo'

例如,添加存储过程时,您可能会在项目中看到多个数据源。

显示 SQL 数据源的屏幕截图。

调用存储过程

要在 Power Apps 中使用存储过程,在存储过程名称前加上与其关联的连接器名称作为前缀,后跟存储过程名称,如 Paruntimedb.dbonewlibrarybook

备注

当 Power Apps 引入存储过程时,它将命名空间和过程名称连接起来,让 dbo.newlibrarybook 变为 dbonewlibrarybook

参数作为具有命名值对的 Power Apps 记录传递:

<datasourceName>.<StoredprocedureName>({<paramName1: value, paramName2: value, ... >})

小费

记住,在将值传递到存储过程时,如果需要,将值进行转换,因为您是从 Power Apps 中的文本值读取。 例如,如果要在 SQL 中更新整数,必须使用 Value() 转换字段中的文本。

下面是将存储过程分配给 OnSelect 属性时存储过程可能呈现的状态的示例。

显示如何使用键/值对和点表示法直接调用存储过程的屏幕截图。

变量及所有存储过程

在声明库的 Items 属性对 UI 安全之后,您可以访问该属性的存储过程。 引用数据源名称和存储过程的名称,后跟 ResultSets。 您可以通过引用返回的一组表(例如表 1、表 2 等)来访问多个结果。

例如,从名为 dbo.spo_show_all_library_books() 的表 Paruntimedb 访问的存储过程如下所示:

Paruntimedb.dbospshowalllibrarybooks().ResultSets.Table1

此查询使用记录填充库。 但是,存储过程是表格式模型上的操作行为。 Refresh() 只能使用表格数据源,不能用于存储过程。 创建、更新或删除记录时,必须刷新库。

备注

当您在表格数据源的窗体上使用 Submit() 时,它会在后台有效地调用 Refresh() 并更新库。

在屏幕的 OnVisible 属性中使用一个变量,将存储过程设置为此变量。

Set(SP_Books, Paruntimedb.dbospshowalllibrarybooks().ResultSets.Table1);

然后,您可以将库的 Items 属性设置为变量名称。

SP_Books

通过调用存储过程创建、更新或删除记录后,再次设置变量以更新库。

Paruntimedb.dbonewlibrarybook({   
  book_name: DataCardValue3_2.Text, 
  author: DataCardValue1_2.Text,
    ...
});
Set(SP_Books, Paruntimedb.dbospshowalllibrarybooks().ResultSets.Table1);

使用 Power Automate 调用存储过程

Power Automate 对异步操作的处理效果最好。 您可以在业务流程中作为一系列调用的一部分调用存储过程。

要调用 Power Automate,然后调用存储过程,作为流的一部分创建输入变量。

显示 Power Automate 输入的屏幕截图。

然后将您的输入变量传递到存储过程的调用中。

执行存储过程

将此 Power Automate 流添加到您的应用并调用它。 可选参数作为记录“{ … }”传递。 以下示例包含所有可选参数。

Power Automate 流