从 WSL 连接到 SQL Express - SQL 网络接口,错误:25

Connecting to SQL Express from WSL - SQL Network Interfaces, error: 25

提问人:gin93r 提问时间:9/12/2023 最后编辑:Charliefacegin93r 更新时间:9/13/2023 访问量:104

问:

我已经工作了将近两天,我别无选择。也许你们可以帮忙。

背景:我将 .netcore api 从 Windows 迁移到 WSL2 (Ubuntu 20.04)。My Database 正在 Windows 上运行。尝试运行时,它给了我错误:dotnet ef database update

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 25 - Connection string is not valid: Connection string is not valid)

我的连接字符串(ip 是占位符):

"Server=192.168.0.1,1433/SQLEXPRESS,1433;Database=MyDatabase;Integrated Security=True;MultipleActiveResultSets=True;Encrypt=no"

我已经在谷歌上搜索了该错误并尝试(或已经完成)许多建议的解决方案,包括:

  • 确保我的入站端口已针对 Windows 防火墙设置;1433 用于 SQL Server,1434 用于 Sql Server 浏览器
  • 已确保 SQL Server 和 SQL Server Browser 正在运行
  • 确保在 SQLEXPRESS 的 SQL Server 网络配置>协议中启用了 TCP/IP
  • 已确保 wsl 的 IP 地址处于“活动”、“已启用”状态,并且具有 TCP 端口 1433 TCP/IP 属性
  • 已确保将 TCP/IP 属性的 TCP 端口设置为 1433,> IPAll
  • 我可以成功ping通ip
  • 我可以成功telnetip
  • 我已经检查了实例名称是否为 SQLEXPRESS
  • 确保我的数据库允许远程连接
  • 确保数据库允许混合 SQL Server 和 Windows 身份验证
  • 我尝试了连接字符串的许多变体 - 带和不带 Encrypt、TrustServerCertificate、用户 ID 和密码(使用 sa)
  • 我尝试了服务器的几种变体:IP,Port,IP,Port/InstanceName,IP/InstanceName,InstanceName,localhost/InstanceName,MachineName/InstanceName,IP/InstanceName,Port
  • 我试过用 tcp 作为上述前缀:

在Windows端使用powershell,我运行了以下命令:

$sqlConn = New-Object System.Data.SqlClient.SqlConnection
$sqlConn.ConnectionString = "Server=localhost,1433;Database=MyDatabase;Encrypt=no;TrustServerCertificate=True;User ID=sa;Password='';Integrated Security=True;MultipleActiveResultSets=True"
$sqlConn

它打印出所有正确的信息。省略会给我一个错误 40,这与自签名的 ssl 证书有关。省略用户 ID 和密码仍能成功连接。Encrypt=no

我错过了什么?

sql-server .net-core windows-subsystem-for-linux sql-server-express sqlclient

评论

0赞 Charlieface 9/12/2023
您是否使用此方法获取主机的 IP 地址 learn.microsoft.com/en-us/windows/wsl/...?同时使用实例名称和端口号没有意义。如果您有固定端口,请使用它。 无法从 WSL 工作,因为它未加入域,但这还不是你的问题。此外,当您使用时,提供用户名/密码是没有意义的。Integrated Security=trueIntegrated Security=true
0赞 gin93r 9/12/2023
现在问题已经解决。(我确实以这种方式获得了IP)我认为有几个问题。1. 未启用“sa”用户。翻白眼。我最终专门为这个项目创建了一个新的登录名(这就是它在旧机器上的样子)。一旦我删除了实例名称,它就起作用了。最后,我认为是踢球者。谢谢!如果你想要互联网积分,请随时写一个答案,我会标记它。Integrated Security=trueIntegrated Security
0赞 gin93r 9/12/2023
还有一件事。我能够更好地解决这个问题,因为它提供了更好的错误消息。sqlcmd

答:

1赞 Charlieface 9/13/2023 #1

如果您使用的是固定端口,则需要删除实例名称。当然,您不应该在实例名称之后指定端口。

而 SQL 身份验证使用 .如果是,则它使用 Windows 身份验证,传递用户名和密码是没有意义的。不能从 WSL 使用 Windows 身份验证。Integrated Security=Falsetrue

Server=192.168.0.1,1433;Database=MyDatabase;MultipleActiveResultSets=True;User ID=sa;Password=''

如果确实有必要,请添加,请注意这是安全风险。TrustServerCertificate=True

评论

0赞 gin93r 9/13/2023
TrustServerCertificate 仅在本地使用。谢谢查理法斯。