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

开发人员的 SqlLocalDb (Sql Express) 用户指南

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.95/5 (11投票s)

2017年8月14日

CPOL

24分钟阅读

viewsIcon

49932

downloadIcon

1136

学习使用 LocalDb 的基础知识(和挑战),通过 SqlLocalDb、sqlcmd 和内置的 Visual Studio 服务器资源管理器等工具,让你的 SQL 开发更轻松、更本地化。现在还包括 SqlCmd 脚本。

引言

在尝试记录一种存储库模式(该模式将提供一个将你的域对象写入 SQL Server 数据库的过程)时,我发现与 SQL Express 交互存在许多挑战。

你可以使用许多工具

  1. SQLLocalDb(命令行工具)
  2. SqlCmd(命令行工具) 以前我将本文的这一部分排除在外,但我现在将其重新添加回来。 SqlCmd 是一个有用的工具,可用于创建表、添加存储过程甚至查询数据库。 使用它有一些技巧,我将在本文底部的添加部分(点击跳转)中详细介绍它们。
  3. 内置的 Visual Studio 支持
  4. SSMS (Sql Server Management Studio)

然而,这些都带来了各自的挑战。

我还发现我的电脑上安装了多个版本的 SQL Express(由各种版本的 Visual Studio 自动安装),在一个版本中创建的数据库可能无法被其他版本访问。

我写这篇文章是为了详细说明所有这些挑战,并提供一个你可以使用的过程,以便快速

  1. 创建你的域对象
  2. 允许域对象将其数据写入 SQL Server
  3. 创建一种简单的方法,将你的项目和数据库模式(表、存储过程等)与另一个用户共享,以便他们可以在自己的 LocalDb 上运行你的代码。这对于开发和测试来说非常有用,因为每个人都可以拥有自己的数据副本,而不会破坏/更改其他用户的数据。

 

E. M. 福斯特(小说家)
除非看到我所说的,否则我怎能知道我所想的。

 

我之所以写这篇文章,主要原因是我多次处理过这个问题,我想看看我是否可以将其记录下来以供重用,这样我就不必像往常一样多次学习它了。:)

以演练形式编写

我将此写成了一个带有大量屏幕截图的演练,因此您可以简单地阅读它并获取可能对您有用的部分,而无需尝试所有内容。

背景

编写代码的一个核心问题是将其序列化到数据库以保存域对象。

在尝试使所有这些工作时,我遇到了一些困难,这些困难与使用不同版本的 Visual Studio 和相关工具(SQL Express、sqllocaldb(命令行工具)、sqlcmd(命令行工具)以及允许您访问数据库的 Visual Studio 内置服务器资源管理器功能)有关。

我想详细介绍每个挑战,并提供一个可靠的解决方案,以便让你的项目尽可能轻松地写入 SQL Express。

我正在寻找什么

我正在尝试创建一个过程,让我能够尽可能轻松地完成以下操作

  1. 创建数据库
  2. 添加域对象(作为表)
  3. 通过存储过程实现数据 CRUD(创建、读取、更新、删除)
  4. 共享我的项目及相关数据库(特别是用于 CP 上的文章)

使用 Visual Studio 2017 创建数据库

你知道可以使用 Visual Studio 2017 创建数据库吗?你所要做的就是

1. 在您的 Visual Studio 项目中,转到“服务器资源管理器”(见图)-(选择“视图”菜单项,您将看到“服务器资源管理器”选项)

view server explorer

 

2. Visual Studio 中将出现一个树状视图,您将看到一个 [数据连接] 节点。右键单击 [数据连接] 节点,将出现一个菜单。(见下图)

server explorer - data connection

3. 选择出现的“创建新的 Sql Server 数据库...”菜单选项。

create new sql server database

4. 你会看到一个新的对话框弹出(这就是它变得奇怪的地方)。

db popup 1

5. 如果您下拉 [服务器名称] 列表,您会发现它是空的(就像我的一样)。然而,这并非完全正确。如果您安装了 Visual Studio,那么您有一些 LocalDb 服务器 (SQL Express) 实例可用。

no servers listed

SqlLocalDb 命令行工具

现在,让我向你展示如何证明存在一些可用的 Sql Server Express 实例,即使它们没有在该对话框中列出。之后我将向你展示如何连接到这些 Sql Server Express (localdb) 实例。

我们需要使用一个随 Visual Studio 安装的命令行工具(尽管许多用户不知道它已安装)。

命令提示符 - 确定您是否有 SqlLocalDb 工具

如果您有 Visual Studio 2013 或更高版本(甚至可能是更旧的版本),您应该能够打开命令提示符并输入

c:\> sqllocaldb<ENTER>

当你这样做时,你应该会看到一堆关于如何使用该工具的信息滚动而过。它看起来会像这样

sqllocaldb console

如果它不起作用,你将收到类似以下内容的错误

'sqllocaldb' is not recognized as an internal or external command, operable program or batch file.

检查你的路径

可能只是您的路径不包含安装应用程序的目录,因此您可以检查一下。在 64 位机器上查看C:\Program Files\Microsoft SQL Server\110\Tools\Binn

有很多方法可以确定该工具是否已安装,所以现在我将继续讨论,假设您已安装该工具并能够运行它。

使用 SqlLocalDB 确定您拥有什么

继续运行以下命令

sqllocaldb v<ENTER>

请注意,使用 sqllocaldb 的命令中没有使用斜杠或破折号。如果您使用它们,您将收到错误消息。微软打破此约定非常奇怪。

当你运行该命令时,SqlLocalDb 将显示系统上安装的 Sql Express 版本。

我看起来像这样

sql express versions installed

我真的不喜欢版本控制。这相当令人恼火,因为版本号非常接近产品名称,但实际上并不匹配。2012 是 v11。2014 是 v12。管它呢!这会造成混淆。

确定正在运行的服务器实例

现在,让我们使用以下命令确定哪些 Sql Express 服务器实例可用。

sqllocaldb info <ENTER>

我的看起来像

sqllocaldb info

这是可用服务器实例的列表。不要将它们与可用数据库混淆。

命名奇怪的实例

它们有令人困惑的名称,这些名称与支持它们的 Sql Server Express 引擎的版本有关。

我的排列表如下

v11.0 == Microsoft SQL Server 2012 (11.0.3000.0)
ProjectsV12 == Microsoft SQL Server 2014 (12.0.2000.8)
MSSqlLocalDb == Microsoft SQL Server 2016 (13.0.1601.5)

另外,请注意,我创建了名为 ProjectsV12 的一个,但通常基于 Sql Server 2014 的一个名为 v12.0。

sqllocald db 可以通过使用 info 命令和实例名称(如下所示)为您提供有关每个实例的信息

sqllocaldb info v11.0<ENTER>

v11.0 info

您可以看到现在 info 命令告诉我们这个特定的实例正在运行。它还为我们提供了命名管道,我们可以使用它通过 SSMS (Sql Server Management Server) 连接到服务器实例。

但是,要使用 Visual Studio 连接到此数据库,您需要使用实例名称。这都是使用这些本地数据库的混淆之处,因为连接方法因您使用的工具而异。

首先,让我们看看名为 MSSqlLocalDb 的那个,它是我从使用基于文件的数据库 MDF 的项目创建本地数据库时由 Visual Studio 2017 添加的。

mssqllocaldb not running

您可以看到,这个的状态是:已停止,因为它尚未运行。让我们来一步步了解如何使用 Visual Studio 连接到这个实例。

通过 Visual Studio 连接到本地实例

同样,在 Visual Studio 中,您需要做的第一件事是进入服务器资源管理器。

接下来,右键单击 [数据连接] 节点,然后选择 [添加连接...] 菜单项。

add connection

当你这样做时,会弹出一个对话框。

首先,确保在数据源框中选择 [Microsoft SQL Server (SqlClient)] 选项——第一个显示的选项。如有必要,使用 [更改] 按钮。

接下来,在 [服务器名称] 文本框中输入以下内容

(LocalDb)\mssqllocaldb

在这种情况下,我们总是使用 (LocalDb)\,然后是要连接的实例名称。

connection setup

正确输入后,您可以向下移动对话框并打开数据库名称列表(参见下一张图片)。如果您在顶部正确输入了连接,您将看到它警告您正在加载,并且您应该看到它最终至少列出了master数据库,这是一个默认数据库。

database list

一旦看到一个出现,就选择它。在我的示例中,我选择 Master 数据库。完成此操作后,您可以单击“测试连接”按钮,您应该会看到一条消息,提示连接成功。

之后,点击 [OK] 按钮,新连接将出现在服务器资源管理器中。

server explorer database connection

现在你可以操作数据库,添加表、存储过程,还可以查询数据库。

打开查询窗口

要打开查询窗口,只需右键单击新连接并选择 [新建查询]。

new query

它将在 Visual Studio 的主区域打开一个新文档,您可以查询表。不幸的是,Master 数据库中没有创建任何表或存储过程。

创建一个新表

当然,使用 Visual Studio 向你的模式添加新表很容易。你可以右键单击连接下的 [表] 文件夹项,然后选择 [添加新表] 菜单项。

add new table

当你这样做时,你会看到你可能在 Sql Server Management Studio 中熟悉的 дизайне器视图。尽管 Visual Studio 版本的功能稍逊一筹。

table designer

您可以看到顶部提供了输入字段名称、类型、是否可以设置为 null 和默认值的方法。然后,底部窗口显示将用于创建表的 SQL DDL(数据定义语言)。

添加标识字段

我注意到没有简单的方法可以使字段成为将自动生成新值的标识字段。我发现我需要将代码添加到表的 DDL(数据定义语言)创建中才能做到这一点。

要做的事情不多,但你需要添加 IDENTITY(1,1),这意味着将其设置为标识字段,自动递增,从值 1 开始,每次递增 1。

它看起来像这样

CREATE TABLE [dbo].[Task] (
    [Id]          INT            IDENTITY (1, 1) NOT NULL,
    [OwnerId]     INT            NOT NULL,
    [ProjectId]   INT            NULL,
    [AssigneeId]  INT            NULL,
    [CategoryId]  INT            NULL,
    [Title]       NVARCHAR (50)  NOT NULL,
    [Description] NVARCHAR (MAX) NOT NULL,
    [Created]     DATETIME       DEFAULT (getdate()) NOT NULL,
    [Updated]     DATETIME       NULL,
    [Completed]   BIT            DEFAULT ((0)) NOT NULL,
    [Active]      BIT            DEFAULT ((1)) NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

这将创建一个名为 Task 的表,我将在我正在进行的示例中使用它。您可以看到我在表创建中添加了标识(加粗部分)。这很容易,但没有 UI 菜单项可以帮助您完成此操作,这有点烦人。

 

我想通过本文解决的问题

现在我们可以更轻松地谈论我想通过本文以及将来我将撰写的所有包含数据库的文章来解决的问题。以下是我希望能够做到的事情

问题陈述

我希望能够提供一个示例数据库,用户可以轻松连接到该数据库,以便她可以查询我的数据。

让我们看看如何在 Visual Studio 中创建数据库文件,看看这是否能帮助我们解决这个问题。

添加基于文件的数据库 (MDF)

我们将添加一个基于文件的数据库,向您展示如何创建一个可以被任何人复制和本地使用的数据库。首先,我将向您展示如何创建数据库,然后我将向您展示如何与他人共享它,以便他们可以获取副本并将其用作自己的数据库。

前往解决方案资源管理器,右键单击您的项目,然后悬停在[添加]菜单上,然后选择弹出的[新建项...]

add new item

当您做出该选择时,您将看到正常的“添加新项”对话框。我们想要确保选择左侧的[数据]节点。选择该节点后,您将看到我们可以选择右侧(名称奇怪的)[基于服务的数据库]

当您突出显示右侧的该项目时,您会看到 Visual Studio 为数据库提供了一个默认名称 (Database1.mdf)。然而,请注意,没有办法告诉它将新的 MDF 文件保存在哪里(文件路径)。这真的很烦人。

service-based db

对于本文,我将我的命名为maintask.mdf。命名后,我只需单击 [添加] 按钮,Visual Studio 就会在服务器资源管理器中添加一个新连接。我不确定为什么它最初显示红色 [x](已断开连接)。但是,您只需单击它旁边的箭头即可连接。

initial maintask.mdfsuccessful connection to maintask.mdf

 

当然,这个数据库中没有添加任何表或其他内容,所以我将运行三个脚本来

  1. 添加一个名为 Task 的表
  2. 添加一个名为 spGetAllTasks 的存储过程
  3. 向 Task 表中添加一个插入

我将这些脚本作为下载添加到本文中,文件名为SqlScripts.zip。您将在其中找到三个独立的 .sql 文件,您也可以使用它们进行尝试。

您需要按以下顺序运行它们

  1. Task_TableCreate.sql -- 创建任务表
  2. spGetAllTasks.sql -- 创建 spGetAllTasks 存储过程
  3. Task_TableDataLoad.sql -- 用一行数据加载任务表。

一旦您拥有这些脚本,只需右键单击 maintask.mdf 下服务器资源管理器中的任何文件夹节点,然后选择 [新建查询] 菜单项。

new query

新文档:选择数据库

当您做出该选择时,Visual Studio 将在右侧打开一个新文档。仔细查看该文档顶部的新菜单栏。它将包含一个下拉列表,该列表很可能设置为“master”。

master database

这表明您执行的任何查询都将在您新创建的 maintask.mdf 中的 master 数据库上运行。我们不想在该数据库上运行我们的脚本。

您运行的任何脚本都将针对 master 数据库运行。我们希望我们的脚本针对我们刚刚创建的数据库运行,该数据库有一个非常奇怪的名称,您可以在下拉列表中看到。它是 Visual Studio 创建数据库文件的位置的完整路径。

我的看起来像这样。我想选择带有长路径的那个,这样我的表、存储过程和数据就会添加到我的文件数据库中。

file database path

完成此操作后,您可以将每个文件的文本复制到窗口中并分别运行。这样做将创建表、存储过程,然后向任务表中添加数据。

你也可以简单地将所有这些作为一个批次运行,如果你喜欢的话,但你必须在每个之间添加一个 go 语句,这样它们才能全部运行。如果你愿意,你可以复制以下整个脚本并运行它。

CREATE TABLE [dbo].[Task] (
    [Id]          INT            IDENTITY (1, 1) NOT NULL,
    [OwnerId]     INT            NOT NULL,
    [ProjectId]   INT            NULL,
    [AssigneeId]  INT            NULL,
    [CategoryId]  INT            NULL,
    [Title]       NVARCHAR (50)  NOT NULL,
    [Description] NVARCHAR (MAX) NOT NULL,
    [Created]     DATETIME       DEFAULT (getdate()) NOT NULL,
    [Updated]     DATETIME       NULL,
    [Completed]   BIT            DEFAULT ((0)) NOT NULL,
    [Active]      BIT            DEFAULT ((1)) NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);
go

CREATE PROCEDURE [dbo].[spGetAllTasks]
AS
    SELECT * from Task;
go

insert into task
(OwnerId, ProjectId, CategoryId,Title,[Description],Created)
values
(1,1,1,'First Task','Sample task for use in testing',getdate());

go

如果您正确运行了每个脚本,您应该会看到一条消息,告诉您脚本已成功。如果您尝试运行前两个脚本中的任何一个两次,那么您将收到一个错误,指出该对象(表或存储过程)已经存在。

测试表和数据是否已添加

如果一切顺利,您应该在服务器资源管理器中的“表”节点下看到一个新表。您还将在“存储过程”节点下看到一个新的存储过程。

如果确实如此,那么您可以清除查询窗口(这样您就不会再次运行命令),然后键入新存储过程的名称并运行它。它应该返回我们的一行数据。它看起来像这样

run stored proc

请注意,底部窗口中的结果集显示了我们插入到 Task 表中的行。

差一点就成功了

然而,这仍然不是我想要的。这是一种帮助另一个开发人员设置数据库的好方法,但我真正想要的是提供带有表和数据的 MDF 文件,让开发人员可以连接并使用它。

这里还有一件事要提,它可以帮助你找到物理数据库文件。当你点击服务器资源管理器中的 maintask.mdf 时,Visual Studio 会在你的属性对话框中显示一些关于它的信息。它看起来像下面这样(我将我的属性对话框移到离服务器资源管理器更近的地方,以便拍照。你的可能会在其他地方)

mdf properties

这里有很多有用的信息。首先,我们可以看到它使用的是 SQL Express 引擎的 11.00.3000 版本。我们还可以看到 datasource 连接使用的是 (LocalDb)\v11.0(您的可能根据您使用的 Visual Studio 版本而使用不同的版本)。

复制 MDF 文件以供以后使用

我们还可以从主文件路径复制路径,这样我们就可以复制 MDF 文件,如果我们需要的话,以便我们可以共享它。

但是,要能够复制文件,您必须在服务器资源管理器中右键单击 maintask.mdf 并断开连接,否则您会收到文件正在使用中的警告。

停止数据库服务器

这实际上是不正确的。我刚试过,它失败了。我相信真正的问题是我们需要停止数据库服务器的 v11.0 实例。为此,我们需要使用 SqlLocalDb 命令行工具。

希望您之前在尝试 SqlLocalDb 时能够成功运行它。再次打开命令提示符并尝试以下操作

sqllocaldb p v11.0<ENTER>

当你这样做时,该版本的数据库服务器 (sql express) 将被停止。是的,p 表示停止,因为他们已经用 s 表示启动。如果成功,你将看到类似以下内容

LocalDB instance "v11.0" stopped.

您的数据库服务器实例可能不同

此外,请记住,您的数据库服务器名称可能有所不同。它是“属性”对话框中紧跟在(LocalDb)\部分之后的名称。或者,您可以键入以下内容以查看机器上安装的 SQL Express 实例列表(就像我们之前所做的那样)

sqllocaldb info<ENTER>

一旦您能够停止数据库实例,您就可以将这两个文件(db 和日志文件)复制到您想要复制的任何地方,以便您可以共享它们。

这两个文件名为

  1. maintask.mdf -- 数据文件
  2. maintask_log.ldf -- 数据库的日志文件

我将这些文件打包并作为下载添加到其中,这样您就可以尝试在您的机器上连接它们。

现在,您只需将这两个文件提供给任何人,即可与他们共享您的数据库。

使用 Visual Studio 连接到数据库文件

以下是如何使用 Visual Studio 再次连接到数据库。

1. 右键单击服务器资源管理器中的 [数据连接] 节点。

2. 选择 [添加连接...]

add connection

对话框将弹出。

3. 这次我们想在顶部下拉列表中选择 Microsoft SQL Server 数据库文件 (SqlClient)。

4. 接下来,我们点击 [浏览...] 按钮并导航到 MDF 文件所在的位置(当然 LDF 文件也会在那里,但您看不到它。从本文顶部下载 maintaskDB.zip

它看起来像这样

open file database

设置完成后,只需单击 [确定] 按钮,Visual Studio 就会将连接添加到服务器资源管理器中。

2013 与 2017:SqlExpress SQL 引擎

在我发布这篇文章之后(当然),我尝试使用 Visual Studio 2017 打开这个数据库文件。它是使用 Visual Studio 2013 创建的,该版本使用 v11.0 数据库引擎。

如果你使用 Visual Studio 2017 并尝试测试与数据库的连接,你会看到类似以下内容

upgrade db warning

您只需点击 [OK] 按钮即可运行升级,它会要求您通过以下对话框接受更新。点击 [Yes] 按钮确认您的选择,它会处理好一切。之后,其他一切都将保持不变。

upgrade yes

继续打开一个“新建查询”窗口,然后运行存储过程或针对 Task 表运行 select 语句,您将获得数据。

Sql Server Management Studio (SSMS)

最后一项快速内容。如果你想使用 SSMS 连接到这个文件数据库,你需要知道它监听的命名管道。为此,你再次需要运行 sqllocaldb 工具,如下所示

sqllocaldb info v11.0<ENTER>

当我运行该命令时,我看到实例正在运行,并且命名管道是

C:\Visual Studio 2013\Projects\TaskFlow>sqllocaldb info v11.0
名称:               v11.0
版本:            11.0.3000.0
共享名称
所有者:              \roger
自动创建:        是
状态:              正在运行
上次启动时间:    2017/8/14 11:30:03 AM
实例管道名称: np:\\.\pipe\LOCALDB#CACCCF57\tsql\query

我复制该名称并将其粘贴到 SSMS 中,如下所示

ssms connect

点击 [连接] 按钮,您就可以使用 SSMS 与数据库进行交互了。

ssms file database

SqlCmd:命令行工具

我喜欢使用 SqlCmd 编写我的整个数据库创建和加载脚本。它非常容易,但与 Sql Express (Sql 引擎) 版本相关联存在一些挑战。

这是因为旧的 SqlCmd 无法与新版本的 Sql Express 引擎一起使用,当它失败时,你会得到一个有点奇怪的错误。一旦我向你展示那个错误,你就会知道发生了什么并且没有任何问题。

Visual Studio 2017 & 路径

因为我的系统上安装了 Visual Studio 2017,所以我的机器上运行着一个 Sql Express 2016 引擎 v13.0.1601.5。

然而,我不确定为什么命令行工具仍然指向一个旧版本的 SqlCmd。这意味着当我打开正常的命令提示符并尝试连接到我的名为 MSSqlLocalDb 的 LocalDb 时,我看到了一个错误,如下图所示。我正在使用以下 sqlcmd 尝试连接

sqlcmd -S (LocalDb)\mssqllocaldb<ENTER>

sqlcmd connection fail

这是一个非常糟糕的错误,因为它是一个红鲱鱼(误导或转移注意力的问题)。错误消息与实际发生的问题无关。

错误消息实际上是由于我的路径变量指向了一个旧版本的 sqlcmd 工具而发生的。

SqlCmd 通常在哪里找到?

您通常会在以下两个位置之一找到 sqlcmd 实用程序

%ProgramFiles%\Microsoft SQL Server\110\Tools\Binn\

对我所有 SQL Express 引擎都有效的是

C:\Program Files\Microsoft SQL Server\110\Tools\Binn\

奇怪的是,我放在以下位置的那个似乎没有正常工作。

C:\Program Files\Microsoft SQL Server\120\Tools\Binn\

我的意思是,如果你收到上面奇怪的错误信息,你需要确保你是

  1.  使用正确的连接字符串格式:(LocalDb)\<数据库实例名称>
  2. 指向正确的版本。

成功连接后,您将看到类似以下内容的提示

sqlcmd prompt

那是 SqlCmd 提示符,表示您已成功连接到数据库。

如何使用 SqlCmd 列出可用数据库?

要列出可用数据库,我们需要运行一个 MS SQL 系统存储过程。键入以下命令: 

sp_databases;<ENTER>

go<ENTER>

请务必记住分号。分号表示 SQL 命令的结束,SqlCmd 工具需要它。另外,请注意,go 命令后没有分号

一旦您输入go并按,您将看到以下内容

list of databases

您可以看到我们的 taskflow 数据库正在此实例中运行。当然,还包括一些默认数据库(msdb、tempdb 等)。

我们如何切换到数据库以便查询它?

我们可以应用 use 命令。键入以下内容以切换到其他数据库

use taskflow;<ENTER>

go<ENTER>

当您正确运行该命令时,您将看到如下结果

use database;

现在我们可以使用以下命令从我们的任务表中进行选择

select * from task;<ENTER>

go<ENTER>

退出 SqlCmd

要退出 sqlcmd,只需键入

exit<ENTER>

那将使您回到正常的命令提示符。

使用 SqlCmd 自动化

现在,让我们看看如何使用 SqlCmd 和批处理文件来

  1. 在我们的 taskflow 数据库中创建一个新表
  2. 向该表中插入数据
  3. 查询数据库并打印结果,向我们展示我们的插入操作按预期工作。

在我向您展示简单的脚本之前,让我解释一下这对开发人员有何帮助。

这有什么帮助?

您可以使用此方法创建整个数据库以及所有表和存储过程,然后使用基线数据加载所有表。然后,在您进行开发时,如果需要返回基线数据,只需删除数据库并重新运行即可。

这也很棒,因为您可以与团队中的任何其他测试人员或开发人员共享基线数据库,他们可以在本地使用,而不会损坏其他人的数据。

脚本说明

我们需要的第一个脚本(SQL DDL -- 数据定义语言)文件是创建新Project表的那个。

从文章顶部下载

我在本文顶部添加了另一个 zip 文件 (CreateAndLoadProjectTable.zip)。立即下载该 zip 文件并查看内部。我将在此处显示三个文件

  1. ProjectTable_Create.sql -- 用于创建 Project 表的 DDL
  2. ProjectTable_DataInsert.sql -- DML(数据操作语言),用于向 Project 表中插入两条新行
  3. createAndLoadProjectTable.bat -- 您运行的批处理文件,它运行 SqlCmd 并使用另外两个文件创建表并加载数据。

让我们看看这些文件中的内容,并稍微讨论一下它们。

第一个只是项目表创建脚本。

CREATE TABLE [dbo].[Project]
(
    [Id] INT  IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    [Name] VARCHAR(200) NOT NULL, 
    [Title] VARCHAR(150) NULL, 
    [Description] VARCHAR(500) NULL, 
    [Notes] VARCHAR(MAX) NULL, 
    [Created] DATETIME NOT NULL DEFAULT getdate(), 
    [Updated] DATETIME NULL, 
    [Active] BIT NOT NULL DEFAULT 1
)

第二个包含两个插入语句。它就像您可能手动运行的普通 SQL。这里我们还在每个语句之后添加了一个go语句,以便如果一个语句失败,另一个仍然会运行。

insert into Project (Name,Title,Description,Notes) values 
('Delta Epsilon','First Test Project', 
'Software to determining differences of negative space in drawings.',
'This is the first test project.');
go
insert into Project (Name,Title,Description,Notes) values 
('Bravo Alpha', 'Second Test Project', 
'Software to allow alpha particle changes.', 'This cannot be explained.');
go

最后,最后一个是批处理文件,它将所有内容组合在一起并为我们运行 SqlCmd。

警告: 请注意,我已包含我的 SqlCmd 副本的绝对路径。这对于您的机器可能不正确,您可能根本不需要完整的路径。

注意2:请注意,我正在连接到我机器上的v11.0数据库。这在您的机器上可能不正确。如有必要,请更改这些项。

"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\sqlcmd" -S (LocalDB)\v11.0 -d taskflow -i ProjectTable_Create.sql
"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\sqlcmd" -S (LocalDB)\v11.0 -d taskflow -i ProjectTable_DataInsert.sql
@echo off
"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\sqlcmd" -S (LocalDB)\v11.0 -d taskflow -E -Q "select count(*) as ProjectRowCount from Project;"
echo ProjectRowCount should be 2
@echo on

让我们逐行了解每行的功能,以便您了解这里发生了什么。

批处理的第一行执行以下操作

  1. 运行SqlCmd
  2. 连接到数据库的 (LocalDb)\v11.0 实例(使用 -S(服务器))
  3. 打开 taskflow 数据库(使用 -d 和数据库名称)
  4. 使用名为 ProjectTable_Create.sql 的输入文件 ( -i ) -- 它在我们的数据库中创建项目表

第二行执行所有相同操作,只是它使用 ProjectTable_DataInsert.sql 文件,该文件包含用于添加数据的插入语句。

批处理的第三行使用 DOS 命令暂时关闭命令回显——只是为了清理输出(我将在下一张图片中向您展示)。

第四行再次使用SqlCmd进行连接,但这次我们要运行一个看起来像这样的查询

select count(*) as ProjectRowCount from Project;

我们这样做是为了获取项目表中行数的计数,以确定我们的插入是否成功。

第五行只是回显一条消息,以便我们知道我们期望什么。

最后一行重新打开 echo 命令,这样当您在命令提示符下键入时,它会正常工作。

这是您成功运行批处理文件时的情况。

batch script run

就是这样。您可以通过在命令提示符下键入以下内容来获取有关运行 SqlCmd 的更多信息

sqlcmd -?<ENTER>

现在您应该能够创建自己的脚本来重建整个数据库并加载数据。

摘要

我已带您了解了 Visual Studio、Sql Express、LocalDb 周围的一些工具,从多个角度展示了连接。我希望这能帮助您使用 LocalDb 进行更轻松的测试和开发。

历史

2017-08-14 :文章的第二版,更改了在 VStudio 2017 上打开时升级数据库的内容。

2017-08-14 :文章和数据库脚本的第一版发布。

© . All rights reserved.