无法从我的 VS Code 扩展 (node.js) 连接到 SQL Server

Posted

技术标签:

【中文标题】无法从我的 VS Code 扩展 (node.js) 连接到 SQL Server【英文标题】:Can't connect to SQL Server from my VS Code extension (node.js) 【发布时间】:2019-09-23 07:39:53 【问题描述】:

我正在开发 VS Code 扩展并想从 SQL Server 数据库中获取一些数据。我尝试了许多不同的示例,但没有一个对我有用。

        const Connection = require('tedious').Connection;

        const config = 
            user: 's-s-rs', // tried userName, username
            password: 's-s-rs', 
            server: 'localhost',
            options: 
                database: 'imdb' 
            
          

          const connection = new Connection(config);
          connection.on('connect', function(err: string) 
            if (err) 
              console.log(err);
             else 
              console.log('Connected');
            
          );

        await sql.connect('mssql://s-s-rs:s-s-rs@localhost/imdb')
        const result = await sql.query`select 1 as one`
        console.dir(result)

    const sql = require("mssql");
    const conn = new sql.ConnectionPool(
        database: "imdb",
        server: "localhost",
        driver: "msnodesqlv8",
        userName: "s-s-rs",
        password: "s-s-rs"
    );

    conn.connect().then(() => 
        console.log('Connected');
    );

ConnectionError: 用户 '' 登录失败。

通过sqlcmd连接:

端口也是开放的(1433),因为我可以远程登录到它。

来自 SQL Server 日志的消息:

日期 2019-05-08 11:19:02 AM 记录 SQL Server(当前 - 2019-05-05 下午 2:53:00)

源登录

用户 '' 的消息登录失败。原因:尝试使用登录 SQL 身份验证失败。服务器配置为集成 仅认证。 [客户端:127.0.0.1]

日期 2019-05-08 11:19:02 AM 记录 SQL Server(当前 - 2019-05-05 下午 2:53:00)

源登录

消息错误:18456,严重性:14,状态:58。

尝试与 Powershell 连接:

  PS C:\WINDOWS\system32> Invoke-Sqlcmd -query "select CURRENT_USER, USER_NAME()" -ServerInstance "localhost" -username "s-s-rs" -password "s-s-rs" -Database 'imdb'

Column1 Column2
------- -------
s-s-rs    s-s-rs   

【问题讨论】:

您能否通过 ODBC(测试 ODBC 连接实用程序)或 SQL Server Management Studio 等本地方式从您用于连接的机器上进行连接? 是的,我可以使用任何其他工具来做到这一点,例如使用“SQL Server 身份验证”的 SSMS。我不确定它使用什么驱动程序。 好的。如果您使用sqlcmd 实用程序进行连接,它是否有效? (例如sqlcmd -S localhost -U sa -P passwd -Q "select @@VERSION" 查询返回版本?)在您尝试通过脚本连接后,日志是否显示任何内容? 修改了问题。我可以连接 SQLCMD。 Sql Server 日志给出相同的错误消息(用户“.”登录失败) ERROR STATE吗? (通常为State: <integer>)在日志中 【参考方案1】:

无法连接的原因写在日志里:

原因:尝试使用 SQL 身份验证登录失败。服务器是 配置为仅集成身份验证。

您必须更改authentication mode(您已经根据发布的屏幕截图进行了更改)并重新启动使用代理的 SQL Server 服务。更改模式后是否重启服务?

【讨论】:

我又做了一次。我相信如果不启用并重新启动它,我将无法使用 SQLCMD 连接到它 @DmitrijKultasev 它对你有用吗? SQLCMD 是一个 SQL Server 实用程序,它可能有一些后备,当你没有源代码时很难说。 @DmitrijKultasev 嗯,设置真的改变了吗?您能否检查HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer\MSSQLServer 节点LoginMode(在SQL Server 机器上)那里的值是多少? @DmitrijKultasev 好的,那应该没问题。那么问题可能出在你的 node.js API 中。如果 Tedious 示例(Tedious 是 TDS 协议的纯 javascript 实现,用于与 Microsoft 的 SQL Server 实例进行交互)对您有用,我首先会推荐 - github.com/tediousjs/tedious/tree/master/examples。 TDS(表格数据流协议)-docs.microsoft.com/en-us/openspecs/windows_protocols/ms-tds/…【参考方案2】:

如屏幕截图所示,您可以通过 SQLCMD 实用程序进行连接。这意味着 SQL Server 中的用户或身份验证模式没有问题。 然而,该错误消息具有误导性,其他用户已经经历过此here。

我不是 node.js 的专家,但我建议您更好地了解 mssql 插件和 Connection 对象的工作原理。我认为您的配置中缺少一些设置导致连接尝试失败。

例如,您发布的这段代码是错误的(用户名无效):

const sql = require("mssql");
const conn = new sql.ConnectionPool(
    database: "imdb",
    server: "localhost",
    driver: "msnodesqlv8",
    userName: "s-s-rs",
    password: "s-s-rs"
);

conn.connect().then(() => 
    console.log('Connected');
);

应该是:

const sql = require("mssql");
const conn = new sql.ConnectionPool(
    database: "imdb",
    server: "localhost",
    driver: "msnodesqlv8",
    user: "s-s-rs",
    password: "s-s-rs"
);

conn.connect().then(() => 
    console.log('Connected');
);

【讨论】:

它刚刚开始工作。在启用正确类型的身份验证之前,我很可能已经尝试过这个“用户”。

以上是关于无法从我的 VS Code 扩展 (node.js) 连接到 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

我无法使用 VS Code、node.js 和 SPFx 进行调试

安装js包管理工具(node.jsyarm)及代码编辑工具(vs code)

如何创建一个简单的VS Code扩展

我无法从我的 node.js firebase 函数 index.js 文件中验证大查询

调试时“运行脚本”如何在 VS Code 中为 node.js 应用程序工作?

VS Code + Node.js 断点调试