C# Winform连接SQL Server:从环境配置到增删改查完整指南
简介这是一套面向C#初学者的WinformSQL Server数据库增删改查入门资源适合刚接触桌面数据库开发、希望掌握本地与网络连接方式的读者。资源以完整VS工程形式提供包含CrudTest项目源码、SQLQuery1.sql数据库查询脚本、说明文档及编译生成的exe可执行文件覆盖连接字符串配置、ADO.NET操作、SELECT/INSERT/UPDATE/DELETE语句编写以及DataGridView数据绑定等关键环节可直接打开运行并结合说明文档对照学习。压缩包共28个文件以cs源码、sql脚本、resx界面资源、pdb调试文件、txt说明和exe程序为主整体仅168KB轻量易用。目前站内已有2600余人浏览学习适合通过实际项目快速上手SQL Server连接与基础增删改查。1. 先别急着写增删改查C# Winform 与 SQL Server 的连接方式先要理清想用 C# Winform 连 SQL Server 做增删改查的新手十个里有八个不是卡在界面代码而是卡在数据库连不上。最常见的一幕是程序在自己电脑上跑得好好的把连接字符串里的 localhost 改成服务器 IP界面直接弹“在与 SQL Server 建立连接时出现网络相关错误”。一查原因SQL Server Express 默认没开 TCP/IP命名实例不固定端口防火墙又刚好拦着 1433。这套开发栈在课程设计、内部小工具里出现频率极高从版本搭配、建库脚本到本地与网络连接配置每个环节都有能让人卡半天的坑。本地连接和网络连接看似只是换一个 IP实际上牵涉身份验证模式、TCP 协议、端口监听、防火墙规则和登录名映射。这篇把环境选型、安装、连接字符串、增删改查代码和排错顺序一次讲清适合刚接触 Winform 数据开发或者正要把本地 Demo 迁到局域网环境的朋友。2. 环境准备Visual Studio 2022 社区版与 SQL Server 2019 Express 的版本搭配2.1 三件套版本怎么选VS2022、SQL Server Express、SSMS 的对应关系先用一张表把整套环境定下来后续所有步骤都以这组版本为准。组件本文采用版本说明Visual Studio2022 Community社区版免费自带 C# Winform 模板SQL Server2019 Express免费支持本机和局域网连接SSMS20.x管理数据库、执行脚本非必需但建议装.NET 环境.NET Framework 4.8VS2022 创建 Winform 项目时可选SQL Server 2019 Express 是当前最稳的免费版本如果你下载时只找得到 2022 Express完全可以装后续所有配置操作和参数基本一致不影响阅读。Express 最大单库 10GB做课设、做小工具绰绰有余。这里有一个新手最容易搞混的概念LocalDB 和 Express 是两回事。VS2022 安装时会自动带上 SQL Server Express LocalDB很多人以为数据库已经有了结果 LocalDB 只能本机进程内连接根本不能被局域网另一台电脑连过来。标题里明确要求“网络连接数据库”所以必须装完整的 SQL Server Express 或 Developer 版而不是依赖 LocalDB。Developer 版功能更全但只能用于开发环境想踏实点就按本文用 Express。2.2 安装 Visual Studio 2022.NET 桌面开发和数据存储和处理组件Visual Studio 2022 安装时如果只勾了“ASP.NET 和 Web 开发”这类工作负载是找不到 Windows 窗体应用模板的。界面操作路径打开 Visual Studio Installer点“修改”在“工作负载”里勾选“.NET 桌面开发”和“数据存储和处理”右侧单个组件不需要手动补安装程序会按依赖自动带出来然后点“修改”等待完成。如果你是批量部署或重装环境用命令行改组件更高效。先找到 Visual Studio Installer 目录下的 vs_installer.exe在管理员命令行里执行vs_installer.exe install --installPath C:\Program Files\Microsoft Visual Studio\2022\Community --add Microsoft.VisualStudio.Workload.ManagedDesktop --add Microsoft.VisualStudio.Workload.Data --includeRecommended --passive --norestart说明一下参数--installPath指定安装目录和安装器界面对应--add可以重复出现ManagedDesktop对应“.NET 桌面开发”Data对应“数据存储和处理”--includeRecommended把推荐的附属组件一并装上数据开发相关工具不会缺--passive表示显示安装进度但不需要手动交互--norestart装完不强制重启。如果 VS 已经装过把install换成modify其余参数保持不变。安装完成后在新建项目里搜“Windows 窗体应用”注意模板语言选 C#。如果你打算用 .NET Framework 4.8就选带“.NET Framework”字样的那个模板想用 .NET 6/8 也能跑本文代码但 SqlClient 命名空间和配置方式略有差异新手建议直接走 .NET Framework 这条线例子最多、遇到坑最好搜。2.3 安装 SQL Server 2019 Express实例名、身份验证模式与静默安装参数SQL Server Express 安装包叫 SQLEXPR_x64_CHS.exe下载后管理员身份运行。图形向导一路下一步时有两个选择直接决定后面能不能网络连接一是实例名二是身份验证模式。Express 默认实例名是SQLEXPRESS也就是说本机连接串不是简单的localhost而是.\SQLEXPRESS或localhost\SQLEXPRESS。很多人装完用 localhost 连不上就是栽在这里。身份验证模式如果选了“Windows 身份验证”后面网络连接必须切成“混合模式”否则局域网那台机器根本没法用账号密码登进来所以安装这一步我建议直接选“混合模式”顺手把 sa 密码设成高强度密码省得后面再改。不想点向导、或者要给多台机器装同样环境可以走静默安装。把安装包放在某个目录下管理员 cmd 进入该目录执行SQLEXPR_x64_CHS.exe /ACTIONInstall /IACCEPTSQLSERVERLICENSETERMS /Q /INSTANCENAMESQLEXPRESS /SECURITYMODESQL /SAPWDYourStrongPassw0rd /TCPENABLED1 /HIDEPROGRAMStrue/Q是全静默安装不想黑屏干等可以把/Q换成/INDICATEPROGRESStrue窗口里能看到进度条/SECURITYMODESQL表示使用混合模式/SAPWD给 sa 设置强密码必须满足 Windows 密码策略否则装到一半直接翻车/TCPENABLED1是让安装完成后自动启用 TCP/IP这条对网络连接非常重要图形向导默认不会帮你开/INSTANCENAMESQLEXPRESS保持和默认一致。装完先确认服务是启动状态PowerShell 里执行Get-Service MSSQL$SQLEXPRESS返回Running就说明数据库引擎起来了。服务名里的$在 PowerShell 里是变量前缀所以必须用单引号包住这是经常有人抄错的地方。3. 数据库配置本地连接和网络连接的两套连接串与建库脚本3.1 本地与网络连接的本质差异Server 部分的四种写法C# Winform 连接 SQL Server核心就是 SqlConnection 的连接字符串。本地和网络连接的差别集中在两个地方Server怎么写身份验证用哪套。先记住一个结论本地连接优先用 Windows 身份验证网络连接用 SQL 身份验证加账号密码。Windows 身份验证跨机器的时候要求两台机器的 Windows 账号体系匹配要么在同一域里要么本地账号名密码完全一致课程设计和内网工具里基本不具备这个条件所以网络连接老老实实用 SQL 账号。连接场景Server 部分身份验证写法本机 Windows 身份验证.\SQLEXPRESS或localhost\SQLEXPRESSIntegrated SecurityTrue本机 SQL 身份验证.\SQLEXPRESSUser IDapp_user; Password密码局域网 SQL 身份验证192.168.1.100,1433User IDapp_user; Password密码.\SQLEXPRESS的.\表示本机等价于localhost\SQLEXPRESS换成 IP 时如果服务器是默认实例可以只写Server192.168.1.100但 Express 是命名实例SQLEXPRESS所以要写成Server192.168.1.100\SQLEXPRESS。我一般习惯把端口也写上Server192.168.1.100,1433这样能跳过 SQL Browser 服务解析实例名的环节连接更快也更确定。注意端口后面的 1433 是默认实例端口而命名实例默认是动态端口。也就是说你光把实例名换成 IP 还不够必须先按下一节把端口固定成 1433否则对方机器根本不知道该往哪个端口连。3.2 启用 TCP/IP 协议并固定 1433 端口网络连接的前置条件SQL Server 安装后默认禁用 TCP/IP本机用共享内存协议连没问题局域网机器绕不开 TCP。打开方式Windows 搜索框输入SQLServerManager15.msc2019 对应 152022 对应 16打开 SQL Server 配置管理器左侧选“SQL Server 网络配置”找到“SQLEXPRESS 的协议”右侧 TCP/IP 默认是“已禁用”右键启用。启用之后千万别以为完事了。命名实例启用 TCP/IP 后的默认状态是“动态端口”也就是每次服务启动随机挑一个端口监听这种情况你根本没法在防火墙里预先放行。必须固定端口TCP/IP 右键属性 → IP 地址选项卡 → 拉到最下面 IPAll → 把“TCP 动态端口”里的数字清空空着才是关闭动态端口“TCP 端口”填1433。这里最坑的是界面里动态端口显示 0有人以为 0 就是不用实际上 0 代表启用动态端口要删干净。改完配置必须重启 SQL Server 服务才生效PowerShell 里执行Restart-Service MSSQL$SQLEXPRESS重启完验证端口监听netstat -ano | findstr 1433看到类似TCP 0.0.0.0:1433 LISTENING的行就说明监听正常。如果这里没有输出不要急着排查程序回到配置管理器检查动态端口是不是没清空。最后是防火墙。Windows 防火墙默认拦外部入站连接需要放行 1433。管理员 PowerShell 执行netsh advfirewall firewall add rule nameSQLServer1433 dirin actionallow protocolTCP localport1433也可以允许程序而不是端口在防火墙“允许应用通过防火墙”里找到sqlservr.exe并勾选效果一样。提醒一句这条规则加完之后要注意规则作用域的“公用/专用”网络配置和你当前网络的类型一致否则换了个 WiFi 又连不上。3.3 建库建表与权限脚本一张 Student 表和网络登录名一次配齐数据库侧的准备分成两件事建库建表和建登录名。新建查询把下面这段完整执行CREATE DATABASE StudentDB; GO USE StudentDB; GO CREATE TABLE Student ( Id INT IDENTITY(1,1) PRIMARY KEY, Name NVARCHAR(50) NOT NULL, Age INT NULL, Class NVARCHAR(50) NULL ); GO INSERT INTO Student (Name, Age, Class) VALUES (N张三, 20, N软件1班); INSERT INTO Student (Name, Age, Class) VALUES (N李四, 21, N软件2班); GO CREATE LOGIN app_user WITH PASSWORD YourStrongPassw0rd, CHECK_POLICY ON; GO USE StudentDB; GO CREATE USER app_user FOR LOGIN app_user; GO ALTER ROLE db_datareader ADD MEMBER app_user; ALTER ROLE db_datawriter ADD MEMBER app_user; GO ALTER LOGIN app_user WITH DEFAULT_DATABASE StudentDB; GO说明几个点GO是批处理分隔符SSMS 按段执行Id 用IDENTITY(1,1)自增插入时不用管它N张三前面的 N 表示 Unicode 字符串SQL Server 里中文列推荐用NVARCHAR不加 N 在某些默认排序规则下会变成乱码这是很常见的坑。登录名和用户名是两个层级的东西CREATE LOGIN app_user建的是 SQL Server 实例级的登录名CREATE USER app_user FOR LOGIN app_user才是在 StudentDB 这个库里建立映射。只建登录名不建用户连接时会报“无法打开数据库”或者“用户登录失败”。权限方面db_datareader给 SELECT 权限db_datawriter给 INSERT、UPDATE、DELETE 权限增删改查刚好够用比直接给 sa 安全得多。最后的DEFAULT_DATABASE把登录名默认库指向 StudentDB避免登录后落到 master 库导致 4060 错误。4. 增删改查落地App.config 连接字符串与参数化查询的实现4.1 把连接字符串挪到 App.config换环境不用重新编译很多人写 Winform 数据库程序喜欢把连接字符串直接 new 在代码里本地跑通了换个机器还要改代码重新编译这是最浪费生命的行为。正确做法是放进 App.config程序启动时自动读取换数据库只改配置文件。先给项目添加 System.Configuration 引用解决方案资源管理器里右键项目 → 添加引用 → 程序集 → 搜索 System.Configuration → 勾选确定。不加这一步代码里写ConfigurationManager.ConnectionStrings会直接报“命名空间不存在”。App.config 里添加连接字符串节点?xml version1.0 encodingutf-8 ? configuration startup useLegacyV2RuntimeActivationPolicytrue supportedRuntime versionv4.0 sku.NETFramework,Versionv4.8 / /startup connectionStrings add nameconnStr connectionStringServer.\SQLEXPRESS;DatabaseStudentDB;User IDapp_user;PasswordYourStrongPassw0rd;Integrated SecurityFalse; providerNameSystem.Data.SqlClient / /connectionStrings /configurationconnectionString里Server.\SQLEXPRESS是本机命名实例写法如果要在局域网里连数据库服务器把.\SQLEXPRESS改成192.168.1.100,1433其余内容不用动。Integrated SecurityFalse表示走 SQL 账号密码验证如果要临时本机调试切回 Windows 身份验证改成Integrated SecurityTrue并删掉 User ID 和 Password 即可。项目编译后App.config 的内容会被复制成输出目录下的StudentManager.exe.config部署时带这个文件一起拷走就行程序里读到的就是这个文件的值。4.2 封装 SqlHelper用参数化查询代替拼接字符串增删改查的代码如果每个按钮都写一遍打开连接、创建命令、关闭连接不仅啰嗦还容易漏掉释放连接。我一般会先封装一个最简版 SqlHelper只提供两个方法一个查询返回 DataTable一个执行非查询语句返回受影响行数。using System.Configuration; using System.Data; using System.Data.SqlClient; namespace StudentManager { public class SqlHelper { private static readonly string connStr ConfigurationManager.ConnectionStrings[connStr].ConnectionString; public static DataTable ExecuteQuery(string sql, SqlParameter[] parameters null) { using (SqlConnection conn new SqlConnection(connStr)) using (SqlCommand cmd new SqlCommand(sql, conn)) { if (parameters ! null) { cmd.Parameters.AddRange(parameters); } SqlDataAdapter adapter new SqlDataAdapter(cmd); DataTable dt new DataTable(); adapter.Fill(dt); return dt; } } public static int ExecuteNonQuery(string sql, SqlParameter[] parameters null) { using (SqlConnection conn new SqlConnection(connStr)) { conn.Open(); using (SqlCommand cmd new SqlCommand(sql, conn)) { if (parameters ! null) { cmd.Parameters.AddRange(parameters); } return cmd.ExecuteNonQuery(); } } } } }关键点两个方法里 SqlConnection 都放在了 using 块中不管执行成功还是抛异常连接都会释放这是避免连接池耗尽的前提。ExecuteQuery用SqlDataAdapter.Fill填充 DataTable适配器内部会自己处理连接的开和关所以不用显式 OpenExecuteNonQuery必须手动conn.Open()后执行。参数化查询是必须养成的习惯。文本框里的内容直接拼进 SQL 字符串某天用户输入一个; DROP TABLE Student; --后果就是整张表没了这不是危言耸听。用Name这种占位符加SqlParameterSQL Server 会把参数当数据而不是可执行语句处理注入这条路就被堵死了。4.3 DataGridView 绑定与增删改查四个按钮的事件代码窗体布局建议上面一排 TextBox 分别录入姓名、年龄、班级中间放四个按钮“新增”“修改”“删除”“查询”下面一个 DataGridView 显示学生列表。控件命名对应txtName、txtAge、txtClass、txtKeyword按钮 btnAdd、btnUpdate、btnDelete、btnSearch。窗体加载和查询按钮共用同一个加载方法private void LoadData() { string sql SELECT Id, Name, Age, Class FROM Student; DataTable dt SqlHelper.ExecuteQuery(sql); dataGridView1.DataSource dt; }新增按钮private void btnAdd_Click(object sender, EventArgs e) { string sql INSERT INTO Student (Name, Age, Class) VALUES (Name, Age, Class); SqlParameter[] p { new SqlParameter(Name, txtName.Text.Trim()), new SqlParameter(Age, Convert.ToInt32(txtAge.Text.Trim())), new SqlParameter(Class, txtClass.Text.Trim()) }; SqlHelper.ExecuteNonQuery(sql, p); LoadData(); }修改和删除要依赖当前选中行取 Id 时注意列名要和 SELECT 里的字段名对上private void btnUpdate_Click(object sender, EventArgs e) { if (dataGridView1.CurrentRow null) return; int id Convert.ToInt32(dataGridView1.CurrentRow.Cells[Id].Value); string sql UPDATE Student SET Name Name, Age Age, Class Class WHERE Id Id; SqlParameter[] p { new SqlParameter(Id, id), new SqlParameter(Name, txtName.Text.Trim()), new SqlParameter(Age, Convert.ToInt32(txtAge.Text.Trim())), new SqlParameter(Class, txtClass.Text.Trim()) }; SqlHelper.ExecuteNonQuery(sql, p); LoadData(); }删除同理执行DELETE FROM Student WHERE Id Id。查询按钮支持按姓名模糊搜索private void btnSearch_Click(object sender, EventArgs e) { string sql SELECT Id, Name, Age, Class FROM Student WHERE Name LIKE Keyword; SqlParameter[] p { new SqlParameter(Keyword, % txtKeyword.Text.Trim() %) }; DataTable dt SqlHelper.ExecuteQuery(sql, p); dataGridView1.DataSource dt; }每次增删改之后都调一次LoadData()重新绑定数据源界面立刻刷新这是最直觉的同步方式。关于参数类型提醒一句Convert.ToInt32(txtAge.Text)会把文本框内容转成 intnew SqlParameter(Age, int类型)推断类型也是 Int没问题。但如果用AddWithValue且传入字符串SQL Server 可能把它当成 NVARCHAR遇到索引列会有隐式转换导致索引失效数据量大了会变慢。想严谨就在建参数时显式指定SqlDbType.Int对小课设来说影响不大但习惯要往这个方向走。5. 避坑排查SQL Server 连不上的五个高频原因下面五类问题我替人排查过很多回按出现频率排序。每一条都按“现象 → 原因 → 解决”写你在报错信息里看到对应关键字可以直接照做。5.1 本地能连、改成 IP 就报网络错误TCP/IP 未启用或实例名写错现象程序在开发机器上一切正常把连接字符串改成Server192.168.1.100,1433后报“在建立与服务器的连接时出错。在连接到 SQL Server 时网络相关或特定实例的错误”。原因先怀疑 TCP/IP 没启用再怀疑命名实例动态端口。SQL Server 安装后默认禁用 TCP/IP而且 SQLEXPRESS 命名实例启用后默认还是动态端口。解决按第 3.2 节步骤在 SQL Server 配置管理器里启用 TCP/IP清空 IPAll 的 TCP 动态端口填上 TCP 端口 1433重启MSSQL$SQLEXPRESS服务然后netstat -ano | findstr 1433确认监听。本机测试时注意连接字符串写.\SQLEXPRESS而不是localhostExpress 的实例名不是默认实例。5.2 报错 18456sa 登录失败身份验证模式和登录名状态一起查现象错误信息是“用户 sa 登录失败”错误号 18456。原因三种最常见的情况——服务器身份验证模式还是 Windows 身份验证sa 被禁用密码不对或者密码策略要求必须改密。18456 后面的状态码也有区分但界面默认不显示。解决先确认身份验证模式。SSMS 里右键实例 → 属性 → 安全性选中“SQL Server 和 Windows 身份验证模式”确定后必须重启服务。不想点界面的可以用管理员 PowerShell 直接改注册表Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQLServer -Name LoginMode -Value 2 Restart-Service MSSQL$SQLEXPRESSLoginMode的值 1 代表仅 Windows 身份验证2 代表混合模式MSSQL15 对应 SQL Server 20192022 的话改成 MSSQL16。改完再用 SSMS 连接在安全性 → 登录名里找到 sa右键属性确认“启用”是勾选状态重新设置一个符合复杂度要求的密码。5.3 telnet IP 1433 不通防火墙拦住了 SQL Server 监听端口现象SQL Server 本机 SQL 身份验证连接正常局域网另一台电脑连接直接超时telnet 192.168.1.100 1433也连不上。原因Windows 防火墙拦截了入站 TCP 1433。本机连接走的是共享内存不经过防火墙所以只有远程连不上时才能暴露这个问题。解决管理员 PowerShell 执行入站规则netsh advfirewall firewall add rule nameSQLServer1433 dirin actionallow protocolTCP localport1433再加一条允许 sqlservr.exe 程序的规则更稳妥或者到“允许应用通过防火墙”里勾选 SQL Server。注意当前网络类型是专用还是公用规则作用域要覆盖对应类型不然换个网络环境又连不上。5.4 报错 4060 或“未找到登录名”登录名没有映射到目标数据库现象账号能登录 SQL Server但执行任何查询都报“无法打开数据库 StudentDB”或者报“用户登录失败未找到与该提供的用户名匹配的登录名”。原因只在实例层建了CREATE LOGIN没有在 StudentDB 库里建CREATE USER登录名和数据库之间不存在映射。另一个常见原因是用 sa 之外的新登录名时登录名属性里的默认数据库填了不存在的库。解决第 3.3 节的脚本里已经包含映射语句如果之前漏了单独补上USE StudentDB; GO CREATE USER app_user FOR LOGIN app_user; GO ALTER ROLE db_datareader ADD MEMBER app_user; ALTER ROLE db_datawriter ADD MEMBER app_user; GO ALTER LOGIN app_user WITH DEFAULT_DATABASE StudentDB; GO执行完再让 app_user 重新连接一次4060 就会消失。5.5 运行一段时间后连接超时连接对象没有释放连接池被占满现象程序刚启动时一切正常反复操作增删改查半小时后突然报“超时时间已到。从池中获取连接之前已经超时”。原因SqlConnection 默认开启连接池Poolingtrue物理连接不会立即断开而是归还到池里复用。代码里new SqlConnection没有Close()或Dispose()连接就一直被占用池子默认上限 100满员后新请求只能排队等超时。解决所有 SqlConnection 都放进 using 块第 4.2 节的 SqlHelper 已经示范了正确写法。如果你在按钮事件里直接 new 了连接务必加上 using。DataReader 用完后也要在 finally 里关掉否则同样占用连接不归还。用了 SqlHelper 之后基本不会再踩这个坑但重构旧代码时值得全文搜一遍有没有漏网之鱼。6. 验证让增删改查在本地和网络各完整跑一遍环境装完、代码写完别急着收工走一遍验证链。我的固定顺序是命令行通 → 程序通 → 换 IP 通三步全过才算这套环境真的配好了。第一步命令行验证 SQL 身份验证和数据库映射。在装有 SQL Server 的机器上用管理员 cmd 执行sqlcmd -S .\SQLEXPRESS -U app_user -P YourStrongPassw0rd -d StudentDB -Q SELECT COUNT(*) FROM Student返回2说明实例名、登录名、密码、默认数据库四项全部正确。如果提示 sqlcmd 不是内部或外部命令说明没装命令行工具直接打开 SSMS 用 app_user 登录 StudentDB 执行SELECT COUNT(*) FROM Student效果一样。第二步程序验证。启动 Winform点“新增”输入一条测试数据DataGridView 立刻刷新出现新行切到 SSMS 按F5刷新表数据看到同一行说明 INSERT 真正落库了。接着在 DataGridView 里选中这一行点“修改”改名再点“删除”删掉每次操作后 DataGridView 和 SSMS 两边数据保持一致就对了。这步验证的是参数化查询和 DataGridView 绑定有没有互相串场。第三步网络验证。把连接字符串里的.\SQLEXPRESS改成192.168.1.100,1433生成后拷到另一台电脑上运行也去执行一次新增和查询然后回到数据库服务器上的 SSMS 刷新确认数据。这一步能过说明 TCP/IP、端口、防火墙全链路都是通的。最后分享一个我比较依赖的调试技巧程序里连接数据库的代码不要只弹ex.Message把 SqlException 的错误号提取出来排错会快非常多。catch (SqlException ex) { if (ex.Number 18456) MessageBox.Show(登录失败检查用户名、密码或身份验证模式); else if (ex.Number 4060) MessageBox.Show(无法打开数据库检查登录名映射和默认库); else if (ex.Number 40 || ex.Number 53) MessageBox.Show(网络层错误检查 TCP/IP 是否启用、端口和防火墙); else MessageBox.Show(ex.Message); }对应关系列成表备查ex.Number含义常见场景40无法打开 SQL Server 连接TCP/IP 未启用、1433 没监听53找不到服务器IP、端口写错18456用户登录失败密码错、sa 禁用、身份验证模式不匹配4060无法打开指定数据库登录名未映射、默认库不存在26定位服务器出错实例名写错、SQL Browser 未运行从那以后我每次接到数据库相关的新环境都先把这条链走一遍sqlcmd 本机通 → 程序通 → 换 IP 通顺序不会乱。这套流程看起来琐碎但真能把后续排查时间省掉一大半尤其是帮别人看环境的时候不用再从报错文案开始猜。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Unity WebGL构建报错unityLinker与IL2CPP排查指南

Unity WebGL构建报错unityLinker与IL2CPP排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:53:10 阅读更多 →
Wireshark实战入门:从抓不到包到定位TCP窗口缩放故障

Wireshark实战入门:从抓不到包到定位TCP窗口缩放故障

1. 为什么今天还要学Wireshark?——从“看不见的网络”到“可触摸的数据流”很多人第一次听说Wireshark,是在某次服务突然卡顿、接口返回超时、或者App连不上服务器的时候。运维同事皱着眉头说:“得抓个包看看”,然后打开一个蓝白…

2026/10/16 3:53:10 阅读更多 →
SpringBoot家具销售管理系统实战:从CRUD到库存并发设计

SpringBoot家具销售管理系统实战:从CRUD到库存并发设计

花了整整两天时间把这类基于SpringBoot的家具销售管理系统从头到尾梳理了一遍。单看标题,很多人会觉得这又是一个普通的CRUD练习项目,但真正把业务模块拆开之后你会发现,家具销售里那些大件、低频、高客单价带来的逻辑细节,它其实…

2026/10/16 3:53:10 阅读更多 →

最新新闻

Spring Boot+MyBatis扫描不到@Mapper?核心原因与十分钟定位排查实战

Spring Boot+MyBatis扫描不到@Mapper?核心原因与十分钟定位排查实战

你要是被项目里那句“Field userMapper in ... required a bean of type ...Mapper that could not be found”折磨过,肯定懂我说的场景:代码写得没问题,注解也加了,启动就是失败。这个“Spring Boot MyBatis 扫描不到 Mapper”的…

2026/10/16 4:36:22 阅读更多 →
Linux 下 GeoClue AccessDenied 报错排查与修复指南

Linux 下 GeoClue AccessDenied 报错排查与修复指南

开篇:这个报错比你想象的常见如果你在 Linux 桌面上跑过任何带位置查询功能的应用——比如天气组件、地图软件、或者通过浏览器访问某个想拿你地理位置的网页——那你八成见过这条报错:"Unable to start GeoClue client: GDBus.Error:org.freedeskt…

2026/10/16 4:36:22 阅读更多 →
并发编程锁的10个高频陷阱:从加锁失效到死锁与性能优化

并发编程锁的10个高频陷阱:从加锁失效到死锁与性能优化

并发编程里的锁,从来不是“加了synchronized就万事大吉”这么简单。这些年我做代码评审和线上问题排查,见过太多锁相关的离奇事故:有人明明加了锁,数据照样错乱;有人用Integer做锁,锁到最后发现每个线程拿的…

2026/10/16 4:36:22 阅读更多 →
Spring Boot+MyBatis中@Mapper扫不到?原理与排查思路一次讲透

Spring Boot+MyBatis中@Mapper扫不到?原理与排查思路一次讲透

前两天在群里看到有人贴报错:启动类能跑,但Service一注入Mapper的时候就挂,提示Consider defining a bean of type xxx.xxx.UserMapper in your configuration.点开代码,明明每个Mapper接口上都写了Mapper,标题也搜的“mybaties扫描不到mapper”。这个问题在Spring Boot MyBat…

2026/10/16 4:36:22 阅读更多 →
计算机网络体系结构:分层思想与TCP/IP模型核心考点精讲

计算机网络体系结构:分层思想与TCP/IP模型核心考点精讲

1. 为什么第一章要从“体系结构”开始很多同学刚开始复习计算机网络,翻到目录看到第一章是“计算机网络体系结构”,心里会嘀咕:这章看起来全是抽象概念,什么分层、协议、服务、接口,又不讲具体技术,是不是可…

2026/10/16 4:36:22 阅读更多 →
基于SSM框架的智能密室逃脱信息管理系统设计与实践

基于SSM框架的智能密室逃脱信息管理系统设计与实践

1. 项目概述1.1 一句话理解这个项目这是一个基于SSM框架(Spring SpringMVC MyBatis)开发的信息管理系统,业务场景切的是“智能密室逃脱”。它不是一个游戏引擎,也不做密室内的机关控制,而是管理密室逃脱门店的日常运…

2026/10/16 4:35:22 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →