65.9K
CodeProject 正在变化。 阅读更多。
Home

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

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2009 年 5 月 13 日

CPOL

3分钟阅读

viewsIcon

11661

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 代码。

© . All rights reserved.