从 Power Apps 连接到 SQL Server

您可以在 Azure 或本地数据库中连接到 SQL Server。

备注

新创建的 SQL 数据源不再具有 [dbo] 前缀,像在 Power Apps 的早期版本中一样。

有关详细信息,请参阅 Power Apps 的常见问题和解决方法

自动生成应用

根据您正在使用的 Power Apps 界面,引用新外观经典外观以生成应用。

  1. 登录到 Power Apps

  2. 主页中,选择_单页库_或_三屏移动应用_选项:

    • 要创建具有响应式布局的单页库应用,请选择:
      • 从数据开始 > 选择外部数据 > 从 SQL
      • 从页面设计开始 > 连接到外部数据的库 > 从 SQL
    • 要创建三屏移动应用,请选择从应用模板开始 > 来自 SQL
  3. 选择您的 SQL 连接,然后选择一个表。 若要选择其他连接,请选择 ... 溢出菜单以切换连接或创建新的 SQL 连接。

    备注

    一次只能显示一个连接。

  4. 完成后,选择创建应用

直接在 Power Fx 中调用存储过程(预览版)

现在可以直接从中调用 SQL Server 存储过程 Power Fx。 默认情况下,此 开关应处于打开状态。 如果没有,您可以将其打开。

  1. 转到 “设置 > ”更新“ > 新”
  2. 搜索存储过程
  3. 针对 SQL Server 存储过程将开关设置为
  4. 保存并重新打开应用。

显示 SQL Server 存储过程切换设置为开的屏幕截图。

在向您的应用添加 SQL Server 连接时,现在可以将表和视图添加到存储过程。 此功能也适用于安全隐式连接。

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

如果无法立即查看存储过程,则搜索它会更快。

选择存储过程后,将显示一个子节点,您可以将存储过程指定为库和表的安全使用。 如果您选中此选项,可以将存储过程分配为 Items 属性以供在您的应用中使用库和表。

仅在以下情况下启用此选项:

  1. 每次 Power Apps 刷新控件时,多次按需调用此过程没有副作用。 当与库或表的 Items 属性一起使用时,只要系统确定需要刷新,Power Apps 就会调用存储过程。 您无法控制何时调用存储过程。
  2. 在存储过程中返回的数据量适中。 操作调用(例如存储过程)对检索的行数没有限制。 它们不会自动以 100 条记录增量进行分页,例如表格数据源(如表或视图)。 因此,如果存储过程返回的数据过多(数千条记录),则您的应用可能会变慢或崩溃。 出于性能原因,您应引入少于 2,000 条记录。

重要

存储过程的返回值的架构应该是静态。 这意味着它不会从一个呼叫到另一个呼叫而改变。 例如,如果调用存储过程并返回两个表,则它应 始终 返回两个表。 您可以使用类型化或非类型化的结果。 结果的结构需要在每次调用之间是相同的。 如果结果的架构是 动态 的,则结果将是非类型化的,您需要提供类型才能使用它们 Power Apps。 有关详细信息,请 转到未键入的结果

SQL 命名空间预置在存储过程名称前面

存储过程所在的 SQL Server 命名空间名称将预置在为其 Power Apps 创建的存储过程的名称前面。 例如,“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()”转换字段中的文本。

直接调用存储过程。

访问结果

存储过程可以返回代码、Out 参数中的值或查询结果。 若要访问这些结果,请使用以下模式:

返回代码

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

使用它来访问 return 语句的结果。

输出参数

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

请注意,请使用 JSON 有效负载中显示的参数名称。

结果集

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

可以通过其名称访问其他表(例如,Table1、Table2、Table3、...

非类型化结果

一些复杂的存储过程返回非类型化结果。 无法直接访问这些结果。 您必须首先提供一个类型。 您可以使用以下模式访问数据。

在此示例中,我们首先将结果提取到名为“MyUntypedObject”的变量中。 然后我们从该变量中提取“Table1”,并将其放入名为“table1”的变量中。 此步骤并非绝对必要。 但是,将所有结果放在一个变量中指向某个时间点,然后拉出所需的部分非常有用。 然后,我们遍历 table1 并提取命名值对中的 JSON 元素。 请确保将名称与 JSON 负载中返回的名称匹配。 要进行验证,请打开监视器 Power Apps 并查看记录的数据节点的正文部分。

Set(
    <MyUntypedObject>,
    <datasourceName>.<StoredprocedureName>( 
      { <paramName1>: "someString" }
    ).ResultSets
);
Set(
    table1,
    <MyUntypedObject>.Table1
);
Set(
    TypedTable,
    ForAll(
        table1,
        {
            BookID: Value(ThisRecord.BookID),
            BookName: Text(ThisRecord.BookName)
        }
    )
);

在声明库的 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);

已知问题

SQL 数据源不再将 [dbo] 前缀添加到数据源名称

[dbo] 前缀在 Power Apps 中没有任何实际用途,因为数据源名称会自动消除歧义。 现有数据源不会受此更改影响,但新添加的任何 SQL 数据源不包含前缀。

如果需要在您的应用之一中更新大量公式,可以使用 Power Apps 源文件包和解压缩实用工具执行全局搜索和替换。

备注

从版本 3.21054 开始,我们将在读取数据源后自动将损坏的旧名称引用更新为新数据源名称。

后续步骤

备注

您能告诉我们您的文档语言首选项吗? 进行简短调查。(请注意,此调查是英文版调查)

此调查大约需要七分钟。 不会收集个人数据(隐私声明)。