Windows Azure, TDS, WCF, Silverlight 以及过程中的一些问题 - 第一部分





0/5 (0投票)
Windows Azure, TDS, WCF, Silverlight 以及过程中的一些问题
如果你有机会看过 MIX 09 的可下载视频 (http://videos.visitmix.com/MIX09/All),那么你就会听说很快就可以开发 Azure 托管的应用程序,并使用旧的 Transact SQL 作为后端! 在 Nigel Ellis 关于“Microsoft SQL Data Services 中的新增功能”的会议中,详细介绍了所有细节。
然而,在撰写本文时,此功能虽然预计在接下来的几个月内推出,但尚未可用。一切并没有丢失。 我将使用本地 Azure 开发环境来托管应用程序,并将其指向我的本地 SQL Server 实例,直到我可以在线托管它为止。
在编写此应用程序时,遇到了许多陷阱 – 有些是因为 Azure 处于测试阶段,有些则不是。 以下是我编写一个小型应用程序来显示不断更新的新闻项的方式。 后端是一个 SQL 数据库,由 Azure Worker Role 定期更新,然后由 Silverlight 应用程序调用的 Web 服务读取,该 Silverlight 应用程序本身托管在 Azure WebRole 上。
在开发这个我将为更大的在线应用程序调整的应用程序时,我将从后端到构成客户端的 Silverlight 应用程序进行工作。
创建我们的数据库
根据 SQL Data Services 会议,无论是在本地还是通过 SQL Data Services 访问数据库,都将通过 SQL Management Studio 进行。 创建数据库后,就可以创建表来存储我们新故事的详细信息了。
这个项目实际上是我正在创建的更大的项目的一部分。 因此,我想使用模式在逻辑上分离数据库的各个部分。 例如,这将允许一个数据库有两个名为 ledger
的表 - 一个在名为“Sales
”的模式中,一个在名为“Purchases
”的模式中。 您会注意到,以下 T/SQL 示例中创建的所有数据库对象都以单词“NewsMashup
”开头。 要创建此模式,请针对 SQL 数据库执行以下代码
CREATE SCHEMA [NewsMashup] AUTHORIZATION [dbo]
一个 table
用于存储从中获取源的站点 – 这允许我们存储到父站点的超链接。
一个用于存储从中提取故事的源的详细信息
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [NewsMashup].[Feeds](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Url] [varchar](max) COLLATE Latin1_General_CI_AS NOT NULL,
[Supplier] [bigint] NULL,
CONSTRAINT [PK_NewsFeeds] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [NewsMashup].[Feeds] WITH CHECK ADD CONSTRAINT [FK_NewsFeeds_Supplier] FOREIGN KEY([Supplier])
REFERENCES [NewsMashup].[Supplier] ([Id])
GO
ALTER TABLE [NewsMashup].[Feeds] CHECK CONSTRAINT [FK_NewsFeeds_Supplier]
一个 table
用于存储拾取的 Stories
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [NewsMashup].[Stories](
[Id] [bigint] NOT NULL,
[Headline] [varchar](max) COLLATE Latin1_General_CI_AS NOT NULL,
[Description] [varchar](max) COLLATE Latin1_General_CI_AS NOT NULL,
[Url] [varchar](max) COLLATE Latin1_General_CI_AS NOT NULL,
[Supplier] [bigint] NOT NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
创建存储过程以访问和写入数据
通过将所有数据库查询放在存储过程中,您可以获得许多优势。 存储过程可能比内联代码更快,部分原因是数据库能够部分编译和优化您的查询。 使用内联代码,这会在执行时发生。 对于显示新闻标题的应用程序,有四个存储过程; 第一个是创建我们的 Stories
ALTER Procedure [NewsMashup].[CreateStory]
@Headline VarChar(Max),
@Description VarChar(Max),
@Url VarChar(Max),
@Supplier BigInt,
@PubDateValue BigInt
As
Begin
Declare @Counter BigInt
Set @Counter = (Select Count(*) As PreviousCounter From NewsMashup.Stories
Where Url = @Url)
If @Counter = 0
Begin
INSERT INTO NewsMashup.Stories
(Headline, Description, Url, Supplier, Id)
VALUES (@Headline,@Description,@Url,@Supplier,@PubDateValue)
End
End
这个函数非常简单。 我们首先检查是否已将链接添加到数据库中。 如果没有,则添加故事。 接下来的两个过程都涉及检索标题; 我们需要两个 – 一个用于从数据库中检索最新的 10 个故事,另一个用于检索可能已添加到数据库中的任何后续故事。 这允许在拾取新故事时将其添加到显示中。
检索最新的 10 个标题
ALTER PROCEDURE [NewsMashup].[RetrieveHeadlines]
AS
BEGIN
SET NOCOUNT ON;
SELECT TOP (10) NewsMashup.Stories.Id,
NewsMashup.Stories.Headline,
NewsMashup.Stories.Description,
NewsMashup.Stories.Url,
NewsMashup.Supplier.HasDescription,
NewsMashup.Supplier.Name AS Supplier
FROM NewsMashup.Stories INNER JOIN
NewsMashup.Supplier ON NewsMashup.Stories.Supplier = NewsMashup.Supplier.Id
ORDER BY NewsMashup.Stories.Id DESC
END
检索最新的新闻标题
ALTER PROCEDURE [NewsMashup].[RetrieveHeadlines2]
@LatestHeadline BigInt
AS
BEGIN
SET NOCOUNT ON;
SELECT Id, Headline, Description, Url, Supplier
FROM NewsMashup.Stories
WHERE (Id > @LatestHeadline)
ORDER BY Id
END
最后一个存储过程检索从中提取标题的源列表。
ALTER Procedure [NewsMashup].[RetrieveNewsFeeds]
As
Begin
Select NewsMashup.Supplier.Id As Supplier,
NewsMashup.Supplier.Name,
NewsMashup.Supplier.Url As HomePage,
NewsMashup.Feeds.Url
From NewsMashup.Feeds
INNER JOIN NewsMashup.Supplier ON
NewsMashup.Feeds.Supplier = NewsMashup.Supplier.Id
Order By NewsMashup.Supplier.Name
End
这几乎创建了存储应用程序拾取的新闻标题所需的数据库结构。 在第二部分中,我将讨论用于访问这些过程的 .NET 代码。