为你的LightSwitch内部数据库添加存储过程

[原文发表地址] Adding Stored Procs to your LightSwitch Intrinsic Database

[原文发表时间] 25 Jul 2013 7:39 AM

当你建立一个LightSwitch应用程序时,你会被问的第一个问题是你是否要连接到一个现有的数据源。如果你选择创建新的,这意味着你希望使用LightSwitch数据设计来创建数据模型并且用LightSwicth来管理你的数据库。我们涉及的这个数据库为内在(或内部)数据库。

我们从客户那里听到的使用内部数据库的缺点之一是,很难管理有许多相关联任务的数据库,像是管理引用数据,存储过程,索引等等。目前这些任务需要使用LightSwitch以外的技术完成。这就是为什么许多客户选择使用外部数据库并且完全不用LightSwitch来管理它们。但是这种方法的缺点是你必须手动来部署和管理数据库架构更新而不是让LightSwitch来为你做这件事。

Visual Studio 2013预览版中,我们通过允许你在LightSwitch解决方案里添加一个SQL 服务器数据工具(SSDT)解决了这个问题,它可以运行数据库脚本而不是内部数据库。Chris在: Intrinsic Database Management with Database Projects 里介绍了这个功能。我们也在MSDN上建立了一个实例/演练来演示如何使用数据库工程来部署引用数据:Managing Data in a LightSwitch Application.

你还可以使用数据库工程来给你的内部数据库添加存储过程。虽然LightSwitch实体还需要来自数据设计器中的数据模型来创建,但是你可以使用存储过程来进行复杂运算,返回数据给报告面板或者执行其它特定数据库任务。

让我们来看一下如何使用Visual Studio2013预览版来给我们的内部数据库添加存储过程。

我们的LightSwitch 内部数据模型

对于这个例子,我有一个简单的内部数据模型是关于客户–<命令–<详细命令–<产品的。假设我们想要建立一个管理面板来让我们能观察数据库中每个表的数据量。我们可以写一个存储过程来给我们这些信息。

image

添加 SSDT数据库工程

在LightSwitch中使用数据库工程有两个步骤。首先你需要添加这个工程到LightSwitch的解决方案,之后你需要告诉LightSwitch来使用它。

在解决方案管理器中右键单击LightSwitch管理器,之后选择添加–>新工程…

image

选择SQL Server节点后你会看到SQL Server数据库的工程模板。给它一个名字并且单击Ok。

image

接下来你需要把它连接到LightSwitch工程。在你的LightSwitch解决方案属性上双击。在常规属性选项卡你现在会看到一个设置为“SQL 数据库工程”。选择你刚刚添加到下拉列表中的工程。

image

编写存储过程

现在我们可以添加项目到数据库工程。我们想要写一个能笼统的在我们数据库里查找所有的表并且统计每个表的所有记录的过程。我们写它是为了当我们从架构里添加/删除表时不再需要更改它。所以在数据库工程上单击右键并且选择添加–>存储过程。这个示例中我将把它命名为uspGetTableCounts。

image

 

现在你可以创建你的存储过程。你可以在这里使用CREATE语句,它会自动正确调配——这就是数据库工程的美丽之处。你可以在Word文档上找到你可以用SSDT做什么的详细信息:SQL Server数据工具(SSDT)。

 CREATE PROCEDURE [dbo].[uspGetTableCounts]
AS
BEGIN
SET NOCOUNT ON;


-- Create the Temp Table to hold all the counts
CREATE TABLE #TableCounts (TableName NVARCHAR(255), Count Int)

-- Create a cursor to scroll through for selecting the COUNT(*) for each table
DECLARE c Cursor for
 SELECT name 
 FROM Sysobjects 
 WHERE xtype = 'u' 
 ORDER BY name

-- Open the cursor
OPEN c
 DECLARE @tableName VARCHAR(255)
 DECLARE @tSQL NVARCHAR(MAX)

 FETCH NEXT 
 FROM c 
 INTO @tableName


 WHILE @@Fetch_Status=0 
 BEGIN
 SET @tSQL = 'SELECT TableName=''' + @tableName + ''', 
 Count = COUNT(*) FROM [' + @tableName + ']'

 INSERT INTO #TableCounts
 EXEC sp_executesql @statement = @tSQL

 FETCH NEXT 
 FROM c 
 INTO @tableName
 END
CLOSE c
Deallocate c

SELECT TableName, Count FROM #TableCounts
DROP TABLE #TableCounts

END 

F5 部署

F5 来部署内部数据库并且调试你的LightSwitch应用程序。调试时,内部数据库连接到你的(LocalDB)\v11.0 接口。若要验证存储过程写入到内部数据库, 你可以在Visual Studio里面使用SQL 服务器对象资源管理器。

 

image

你可以用数据库工程在LightSwitch中做太多的事情,这只是一个常见的例子。然而请记住,你不应在内部数据库中更改任何使用LightSwitch数据设计器的表的架构,否则在你运行你的模型时会有不同步的风险。

使用LocalDB以及在LightSwitch中使用SQL服务器对象资源管理器的详细信息请参阅: Working with SQL Server LocalDB in LightSwitch Projects in Visual Studio 2012

调用存储过程

既然现在我们的存储过程以及被部署到我们的内部数据库,我们如何调用它呢?无论你用什么版本,这里有几种方法你可以从LightSwitch调用存储过程。Eric在他的老文章里解释了一种方法来实现调用:Executing a Simple Stored Procedure in LightSwitch 以及Updating Records in LightSwitch using Stored Procedures

然而在VisualStudio2012 Update 2(LightSwitch V3) 中,我们在中间层添加了使用ServerApplicationContext的能力,这样你可以利用在LightSwitch里所有的业务和数据逻辑来创建自定义web服务。因此,从一个自定义web方法调用存储过程变得更加灵活。Steve在他文章的结尾演示了如何与一个外部数据库实现调用以及相关的Web API:Dashboard Reports with LightSwitch, WebAPI and ServerApplicationContext– Part Deux

在我的下一篇文章中,我会展示如何在内部数据库中使用Web API调用存储过程并且在移动设备上显示结果。(关于Web API 的更多信息请看Getting Started guides)

现在,我鼓励你下载和安装Visual Studio2013预览版来让我们知道你对LightSwitch中支持新数据库工程的看法。添加下面的评论和/或在LightSwitch论坛给我们反馈。留待下一次…

阅读愉快!

UPDATE 7/31/2013: Read part 2 - Calling Stored Procs in your LightSwitch Databases using Web API