使用 Node JS 进行 SQL Server CRUD 操作






4.88/5 (12投票s)
在这篇文章中,我们将了解如何使用 Node.js 在我们的 SQL 数据库中执行 CRUD 应用程序。
在这篇文章中,我们将了解如何使用 Node.js 在我们的 SQL 数据库中执行 CRUD 应用程序。众所周知,Node.js 是一个在 Chrome V8 JavaScript 引擎基础上构建的运行时环境,用于服务器端和网络应用程序。它是一个开源的,支持跨平台。Node.js 应用程序是用纯 JavaScript 编写的。如果您是 Node.js 新手,强烈建议您在此处阅读我之前关于 Node.js 的文章。现在我们开始吧。
背景
曾几何时,我们开发者依赖任何服务器端语言来执行服务器端操作。几年前,一家名为 Joyent, Inc. 的公司为我们提供了一个解决方案。也就是说,如果我们了解 JavaScript,就可以执行服务器端操作。由于这个精彩的想法,它取得了巨大的成功。您可以执行服务器端操作,而无需了解任何与服务器端语言(如 C# 和 PHP)相关的代码。在这里,我们将了解如何使用 Node.js 执行数据库操作,如创建、读取、更新、删除。希望您会喜欢。
在我们开始编写 Node.js 应用程序的代码之前,我们可以为 Visual Studio 设置可用的 Node.js 工具。
Visual Studio 的 Node.js 工具
您始终可以使用命令提示符运行 Node.js 代码,因此设置此工具是可选的。如果安装它,您可以轻松地调试和开发 Node.js。所以我建议您安装它。
要下载该工具,请点击此 链接。下载安装文件后,就可以开始安装了。
希望您已经安装了该应用程序。现在,我们可以在 Visual Studio 中创建一个 Node.js 应用程序。
在 Visual Studio 中创建 Node.js 应用程序
您可以在“添加新项目”窗口中找到一个名为 Node.js 的选项,如下所示。请点击它并创建一个新项目。
现在我们的 Visual Studio 已准备好进行编码,但正如我之前提到的,我们将使用 SQL Server 作为我们的数据库。所以我们也需要做一些相关的配置。我们现在就来做。
配置 Node.js 开发的 SQL Server
您需要确保以下服务正在运行
- SQL Server
- SQL Server 代理(如果您使用的是 SQLEXPRESS,则跳过)
- SQL Server Browser
要检查这些服务的状态,您可以通过在 Run 命令窗口中运行 services.msc 来始终做到这一点。完成后,您需要启用一些协议并为其分配一个端口。现在转到您的 SQL Server 配置管理器。最有可能的是,您可以在 C:\Windows\SysWOW64 位置找到该文件,如果找不到,请启动窗口。
现在转到 SQL Server 网络配置,然后点击 SQLEXPRESS(您的 SQL Server)的协议,并启用 TCP/IP。
现在右键单击 TCP/IP 并选择属性。转到 IP 地址并为所有 IP 分配端口。
如果您已完成此操作,则该设置数据库并插入一些数据的时候了。请不要忘记重新启动您的服务,因为更新我们所做的配置更改是强制性的。
创建数据库
在这里,我正在创建一个名为“TrialDB
”的数据库,您可以通过运行下面的查询来创建数据库
USE [master]
GO
/****** Object: Database [TrialDB] Script Date: 20-11-2016 03:54:53 PM ******/
CREATE DATABASE [TrialDB]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'TrialDB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.SQLEXPRESS\MSSQL\DATA\TrialDB.mdf' , _
SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
LOG ON
( NAME = N'TrialDB_log', _
FILENAME = N'C:\Program Files\Microsoft SQL Server\
MSSQL13.SQLEXPRESS\MSSQL\DATA\TrialDB_log.ldf' , _
SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO
ALTER DATABASE [TrialDB] SET COMPATIBILITY_LEVEL = 130
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [TrialDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [TrialDB] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [TrialDB] SET ANSI_NULLS OFF
GO
ALTER DATABASE [TrialDB] SET ANSI_PADDING OFF
GO
ALTER DATABASE [TrialDB] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [TrialDB] SET ARITHABORT OFF
GO
ALTER DATABASE [TrialDB] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [TrialDB] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [TrialDB] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [TrialDB] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [TrialDB] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [TrialDB] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [TrialDB] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [TrialDB] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [TrialDB] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [TrialDB] SET DISABLE_BROKER
GO
ALTER DATABASE [TrialDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [TrialDB] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [TrialDB] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [TrialDB] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [TrialDB] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [TrialDB] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [TrialDB] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [TrialDB] SET RECOVERY SIMPLE
GO
ALTER DATABASE [TrialDB] SET MULTI_USER
GO
ALTER DATABASE [TrialDB] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [TrialDB] SET DB_CHAINING OFF
GO
ALTER DATABASE [TrialDB] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF )
GO
ALTER DATABASE [TrialDB] SET TARGET_RECOVERY_TIME = 60 SECONDS
GO
ALTER DATABASE [TrialDB] SET DELAYED_DURABILITY = DISABLED
GO
ALTER DATABASE [TrialDB] SET QUERY_STORE = OFF
GO
USE [TrialDB]
GO
ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 0;
GO
ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET MAXDOP = PRIMARY;
GO
ALTER DATABASE SCOPED CONFIGURATION _
SET LEGACY_CARDINALITY_ESTIMATION = OFF;
GO
ALTER DATABASE SCOPED CONFIGURATION FOR _
SECONDARY SET LEGACY_CARDINALITY_ESTIMATION = PRIMARY;
GO
ALTER DATABASE SCOPED CONFIGURATION SET PARAMETER_SNIFFING = ON;
GO
ALTER DATABASE SCOPED CONFIGURATION FOR _
SECONDARY SET PARAMETER_SNIFFING = PRIMARY;
GO
ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_HOTFIXES = OFF;
GO
ALTER DATABASE SCOPED CONFIGURATION FOR _
SECONDARY SET QUERY_OPTIMIZER_HOTFIXES = PRIMARY;
GO
ALTER DATABASE [TrialDB] SET READ_WRITE
GO
在数据库中创建表并插入数据
要创建表,您可以运行下面的查询
USE [TrialDB]
GO
/****** Object: Table [dbo].[Course] Script Date: 20-11-2016 03:57:30 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Course](
[CourseID] [int] NOT NULL,
[CourseName] [nvarchar](50) NOT NULL,
[CourseDescription] [nvarchar](100) NULL,
CONSTRAINT [PK_Course] PRIMARY KEY CLUSTERED
(
[CourseID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, _
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
现在,我们可以向新创建的表中插入少量数据。
USE [TrialDB]
GO
INSERT INTO [dbo].[Course]
([CourseID]
,[CourseName]
,[CourseDescription])
VALUES
(1
,'C#'
,'Learn C# in 7 days')
INSERT INTO [dbo].[Course]
([CourseID]
,[CourseName]
,[CourseDescription])
VALUES
(2
,'Asp.Net'
,'Learn Asp.Net in 7 days')
INSERT INTO [dbo].[Course]
([CourseID]
,[CourseName]
,[CourseDescription])
VALUES
(3
,'SQL'
,'Learn SQL in 7 days')
INSERT INTO [dbo].[Course]
([CourseID]
,[CourseName]
,[CourseDescription])
VALUES
(4
,'JavaScript'
,'Learn JavaScript in 7 days')
GO
所以我们的数据已经准备好了,这意味着我们已经准备好编写 Node.js 应用程序了。转到我们创建的应用程序,您会看到一个 JS 文件,通常命名为 server.js。在这里,我将更改名称为 App.js。
MSSQL – Node.js 的 Microsoft SQL Server 客户端
您可以在 Node.js 中找到许多供我们日常使用的包,您所需要做的就是安装该包并开始使用它。在这里,我们将使用一个名为 MSSQL 的包。
Node-MSSQL
- 为多个 TDS 驱动程序提供了统一的接口。
- 具有内置连接池。
- 支持 SQL Server 2016 中引入的内置 JSON 序列化。
- 支持存储过程、事务、预编译语句、批量加载和 TVP。
- 支持 Geography 和 Geometry CLR 类型的序列化。
- 具有智能的 JS 数据类型到 SQL 数据类型的映射器。
- 支持 Promises、Streams 和标准回调。
- 支持 ES6 标记模板文字。
- 稳定且在生产环境中经过测试。
- 文档齐全。
您可以在此处找到有关该包的更多信息。您可以通过在 Nuget 包管理器控制台中运行以下命令来轻松安装该包。
npm install mssql
然后,我们可以使用 require
函数加载此包。
//MSSQL Instance Creation
var sqlInstance = require("mssql");
接下来,您可以按如下方式设置数据库配置。
/Database configuration
var setUp = {
server: 'localhost',
database: 'TrialDB',
user: 'sa',
password: 'sa',
port: 1433
};
一旦设置了配置,您就可以使用 connect()
函数连接数据库。
sqlInstance.connect(setUp)
现在,我们可以执行 CRUD 操作了。准备好了吗?
使用 Node.js 从数据库中选择所有数据
// To retrieve all the data - Start
new sqlInstance.Request()
.query("select * from Course")
.then(function (dbData) {
if (dbData == null || dbData.length === 0)
return;
console.dir('All the courses');
console.dir(dbData);
})
.catch(function (error) {
console.dir(error);
});
// To retrieve all the data - End
现在,运行您的应用程序,然后看到如下输出
使用 Node.js 从数据库中选择带有 WHERE 条件的数据
您可以通过提供适当的 select
查询来选择特定记录,如下所示
// To retrieve specicfic data - Start
var value = 2;
new sqlInstance.Request()
.input("param", sqlInstance.Int, value)
.query("select * from Course where CourseID = @param")
.then(function (dbData) {
if (dbData == null || dbData.length === 0)
return;
console.dir('Course with ID = 2');
console.dir(dbData);
})
.catch(function (error) {
console.dir(error);
});
// To retrieve specicfic data - End
那么上述代码的输出会是什么?有什么想法吗?
使用 Node.js 向数据库插入数据
我们也可以使用 Node.js 执行一些 insert
查询,这里的区别在于,就像 SQL 中的事务一样,我们也会在这里包含它们。以下代码执行 insert
操作。
// Insert data - Start
var dbConn = new sqlInstance.Connection(setUp,
function (err) {
var myTransaction = new sqlInstance.Transaction(dbConn);
myTransaction.begin(function (error) {
var rollBack = false;
myTransaction.on('rollback',
function (aborted) {
rollBack = true;
});
new sqlInstance.Request(myTransaction)
.query("INSERT INTO [dbo].[Course]
([CourseName],[CourseDescription])
VALUES ('Node js',
'Learn Node JS in 7 days')",
function (err, recordset) {
if (err) {
if (!rollBack) {
myTransaction.rollback(function (err) {
console.dir(err);
});
}
} else {
myTransaction.commit().then(function (recordset) {
console.dir('Data is inserted successfully!');
}).catch(function (err) {
console.dir('Error in transaction commit ' + err);
});
}
});
});
});
// Insert data - End
让我们运行它并查看输出。
使用 Node.js 从数据库中删除数据
正如我们执行了 insert
操作一样,我们也可以对 delete
操作执行相同的操作,如下所示
// Delete data - Start
var delValue = 4;
var dbConn = new sqlInstance.Connection(setUp,
function (err) {
var myTransaction = new sqlInstance.Transaction(dbConn);
myTransaction.begin(function (error) {
var rollBack = false;
myTransaction.on('rollback',
function (aborted) {
rollBack = true;
});
new sqlInstance.Request(myTransaction)
.query("DELETE FROM [dbo].[Course]
WHERE CourseID=" + delValue,
function (err, recordset) {
if (err) {
if (!rollBack) {
myTransaction.rollback(function (err) {
console.dir(err);
});
}
} else {
myTransaction.commit().then(function (recordset) {
console.dir('Data is deleted successfully!');
}).catch(function (err) {
console.dir('Error in transaction commit ' + err);
});
}
});
});
});
// Delete data - End
现在,运行您的应用程序,看看数据是否已被删除。
使用 Node.js 更新数据库中的数据
这里唯一要执行的操作是 UPDATE
。我说的对吗?我们也可以这样做。
// Update data - Start
var updValue = 3;
var dbConn = new sqlInstance.Connection(setUp,
function (err) {
var myTransaction = new sqlInstance.Transaction(dbConn);
myTransaction.begin(function (error) {
var rollBack = false;
myTransaction.on('rollback',
function (aborted) {
rollBack = true;
});
new sqlInstance.Request(myTransaction)
.query("UPDATE [dbo].[Course] SET [CourseName] = 'Test' _
WHERE CourseID=" + updValue,
function (err, recordset) {
if (err) {
if (!rollBack) {
myTransaction.rollback(function (err) {
console.dir(err);
});
}
} else {
myTransaction.commit().then(function (recordset) {
console.dir('Data is updated successfully!');
}).catch(function (err) {
console.dir('Error in transaction commit ' + err);
});
}
});
});
});
// Update data - End
这是输出
您随时可以下载附带的源代码来查看完整的代码和应用程序。祝您编码愉快!
另请参阅
结论
我是否遗漏了您认为需要的内容?您觉得这篇文章有用吗?希望您喜欢这篇文章。请分享您宝贵的建议和反馈。
现在轮到你了。你有什么想法?
没有评论的博客算不上博客,但请尽量保持主题。如果您有与此帖子无关的问题,最好将其发布到 C# Corner、Code Project、Stack Overflow、ASP.NET 论坛,而不是在此处发表评论。在 Twitter 或电子邮件中向我发送您在那里提问的链接,如果我能帮上忙,我一定会尽力。