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

使用 Node JS 进行 SQL Server CRUD 操作

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (12投票s)

2016 年 11 月 27 日

CPOL

6分钟阅读

viewsIcon

39131

在这篇文章中,我们将了解如何使用 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。所以我建议您安装它。

要下载该工具,请点击此 链接。下载安装文件后,就可以开始安装了。

node_js_tool_for_visual_studio

希望您已经安装了该应用程序。现在,我们可以在 Visual Studio 中创建一个 Node.js 应用程序。

在 Visual Studio 中创建 Node.js 应用程序

您可以在“添加新项目”窗口中找到一个名为 Node.js 的选项,如下所示。请点击它并创建一个新项目。

new_node_js_project

现在我们的 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_manager_location

现在转到 SQL Server 网络配置,然后点击 SQLEXPRESS(您的 SQL Server)的协议,并启用 TCP/IP。

protocols_for_sql_express

现在右键单击 TCP/IP 并选择属性。转到 IP 地址并为所有 IP 分配端口。

assigning_tcp_ip_port_in_sql_server

如果您已完成此操作,则该设置数据库并插入一些数据的时候了。请不要忘记重新启动您的服务,因为更新我们所做的配置更改是强制性的。

restart_sql_express

创建数据库

在这里,我正在创建一个名为“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

mssql_node_js_install

然后,我们可以使用 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_select_all_data_from_database

使用 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_select_particular_data_from_database

使用 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_data_to_database

使用 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_delete_data_from_database

使用 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

这是输出

node_js_update_data_from_database

您随时可以下载附带的源代码来查看完整的代码和应用程序。祝您编码愉快!

另请参阅

结论

我是否遗漏了您认为需要的内容?您觉得这篇文章有用吗?希望您喜欢这篇文章。请分享您宝贵的建议和反馈。

现在轮到你了。你有什么想法?

没有评论的博客算不上博客,但请尽量保持主题。如果您有与此帖子无关的问题,最好将其发布到 C# Corner、Code Project、Stack Overflow、ASP.NET 论坛,而不是在此处发表评论。在 Twitter 或电子邮件中向我发送您在那里提问的链接,如果我能帮上忙,我一定会尽力。

© . All rights reserved.