.NET MAUI连接MS SQL遇异常:找不到对象/预登录握手错误求助
.NET MAUI连接MS SQL数据库问题解决建议
一、解决System.Data.SqlClient找不到SqlConnection的问题
.NET MAUI基于.NET 6+,System.Data.SqlClient已被官方标记为过时,推荐使用Microsoft.Data.SqlClient替代。你需要:
- 在项目中安装
Microsoft.Data.SqlClientNuGet包(版本建议选适配.NET MAUI的稳定版,比如最新的6.x或7.x) - 代码中引用命名空间:
using Microsoft.Data.SqlClient;(注意不是System.Data.SqlClient)
二、解决“Connection was established but there is problem during pre login handshake”错误
这个错误通常和连接字符串配置、SQL Server服务设置或加密兼容性有关,按以下步骤排查:
1. 修正连接字符串
- 连接字符串中的反斜杠
\需要转义,或用逐字字符串(@前缀)避免转义解析:
错误写法:"Data Source =hostname\servername;"
正确写法:@"Data Source=hostname\servername;Initial Catalog=dbase;User ID=user;Password=pass;" - 若SQL Server未强制加密,可添加
Encrypt=False参数(仅测试环境使用,生产环境建议启用加密):@"Data Source=hostname\servername;Initial Catalog=dbase;User ID=user;Password=pass;Encrypt=False;"
2. 检查SQL Server配置
- 打开SQL Server配置管理器,在SQL Server网络配置中启用TCP/IP协议
- 确认SQL Server服务正常运行,默认监听端口1433未被占用
- 验证登录账号
user拥有目标数据库dbase的访问权限,且密码正确
3. 加密协议兼容处理
如果SQL Server使用较旧的TLS版本(如TLS 1.0/1.1),而.NET MAUI默认禁用这些协议,可尝试添加以下配置到项目的appsettings.json:
{ "Microsoft.Data.SqlClient": { "Tls": { "AllowedProtocols": "Tls12,Tls13" } } }
测试环境下也可在连接字符串中添加TrustServerCertificate=True(生产环境不推荐,会跳过证书验证)
4. 防火墙设置
- 确保客户端设备能访问SQL Server所在服务器的1433端口(或自定义端口)
- 服务器端防火墙需允许SQL Server的入站连接
三、优化代码(避免资源泄漏)
使用using语句自动释放数据库资源,避免内存泄漏:
using Microsoft.Data.SqlClient; private async void LoginButton_Clicked(object sender, EventArgs e) { string connectionString = @"Data Source=hostname\servername;Initial Catalog=dbase;User ID=user;Password=pass;Encrypt=False;"; using (SqlConnection myConnection = new SqlConnection(connectionString)) { try { await myConnection.OpenAsync(); string query = "SELECT * FROM logins WHERE UserName = @user AND PassWord = @pass"; using (SqlCommand myCmd = new SqlCommand(query, myConnection)) { myCmd.Parameters.AddWithValue("@user", txtUser.Text); myCmd.Parameters.AddWithValue("@pass", txtPass.Text); using (SqlDataReader myRead = await myCmd.ExecuteReaderAsync()) { if (myRead.Read()) { await DisplayAlert("TEST", "PasswordOK", "Press"); } else { await DisplayAlert("TEST", "Password Is Bad", "Press"); } } } } catch (Exception ex) { await DisplayAlert("Error", ex.Message, "OK"); } } }
内容的提问来源于stack exchange,提问作者Yasseralim
相关产品推荐
相关产品推荐

