You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI连接MS SQL遇异常:找不到对象/预登录握手错误求助

.NET MAUI连接MS SQL数据库问题解决建议

一、解决System.Data.SqlClient找不到SqlConnection的问题

.NET MAUI基于.NET 6+,System.Data.SqlClient已被官方标记为过时,推荐使用Microsoft.Data.SqlClient替代。你需要:

  • 在项目中安装Microsoft.Data.SqlClient NuGet包(版本建议选适配.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:40:34