VS2015 C#数据库项目实战:从连接SQL Server到部署避坑

📅 发布时间:2026/10/8 8:29:54
VS2015 C#数据库项目实战:从连接SQL Server到部署避坑
简介面向C#与Visual Studio 2015开发者的数据库项目实战资料适合希望系统掌握Windows平台数据库应用开发的初学者和进阶学员。资源包共3423个文件压缩后约95.9MB其中以.cs源文件、.resx界面资源、.rdlc报表定义、.dll依赖库及.ppt课件为主体另含.txt环境说明便于对照源码、报表模板与文档进行系统性学习。已有1081人学习下载。包内实训项目从环境配置起步逐步覆盖ADO.NET数据库连接、SQL语句构造、CRUD操作以及DataSet/DataTable等离线数据管理并延伸至事务处理、异常捕获与性能优化附录和教材项目还涉及多表查询、存储过程、视图、索引与数据库安全。配套课件对数据库设计原则、关系模型和SQL基础做了理论梳理预览页面中的登录、购物车、订单、产品详情等场景可帮助串联完整业务数据流为实际项目开发提供可复用的参考。1. 拿到一个 .zip 的 VS2015 C# 数据库项目先别急着解压跑起来很多人的第一个 C# Windows 数据库程序是从一个Visual Studio 2015(C#) Windows数据库项目开发.zip开始的。它通常不是一个安装包而是一整套源码工程Form 界面、数据库访问类、连接配置甚至带着几个 .mdf 或 .bak 的数据文件。解压之后真正要面对的问题很具体用哪个 Visual Studio 版本打开、C# 代码怎么连上 SQL Server、DataGridView 怎么显示数据、换一台电脑部署为什么报错。这篇笔记就按一条能复现的路线讲清楚——从环境安装、项目模板、连接数据库、增删改查到部署前的避坑检查。适读人群是刚把 C# 语法过完、准备做上位机或桌面进销存的新手以及手头维护老工程、被迫从 .zip 里接手代码的“接盘侠”。我会直接按一线干活的方式写命令能跑、参数能改、坑是亲踩过的。2. 还选 Visual Studio 2015环境安装、组件勾选与第一个窗体2.1 为什么现在还要用 VS2015存量工程与兼容性不是所有人都有条件用最新的 Visual Studio 2022。工业现场、老设备配套的上位机、学校课程设计的遗留代码很多就是用 VS2015 建的工程。用新版打开老工程经常遇到两类麻烦一是工程文件中的 GUID、工具集版本需要迁移二是项目里用了第三方组件或旧版 .NET Framework迁移后编译通过但运行行为变了。所以接手这类 .zip 工程时最稳的做法不是升级工程而是装一个 VS2015 把工程原样跑起来。VS2015 对应的 .NET Framework 版本主要是 4.5.2、4.6 和 4.6.1。如果目标机器是 Windows 7 或老款工控机.NET 4.6.2 以上还要额外安装而 VS2015 自带的目标框架足够覆盖大部分场景。加上 Visual Studio 2015 的 C# 编译器支持 C# 6.0lambda、字符串插值、null 条件运算符这些语法在工程里很常见用新版编译器打开旧工程虽然也能编译但一旦混入编码问题或项目依赖排查成本远高于直接装一个匹配版本。我一般会建议先确认 .zip 里的 .sln 文件版本。用记事本打开 .sln看到# Visual Studio 14就是 VS2015 生成的# Visual Studio 15对应 2017。版本对不上时直接用旧版打开最省心。2.2 安装 Visual Studio 2015 with Update 3组件勾选与配置安装时不要一股脑全选。VS2015 的安装器是 ISO 镜像或 exe 引导程序最关键的是勾选“自定义”并按需选择组件。做 Windows 数据库项目必选的是“Visual C#”和“Microsoft SQL Server Data Tools”SSDT。SSDT 能够让你在工程里直接管理数据库项目、数据集和 .mdf 文件没有它很多“数据库项目”模板会缺失。装完 Visual Studio 2015 with Update 3也就是常说的 SP3之后建议再检查一下是否有可用的更新。这个版本号在联网搜索时被频繁提及因为 Update 3 修复了大量与 Windows 10 兼容性和调试器相关的问题。如果你拿到的是不带 Update 3 的原始 ISO装完经常遇到调试器无法附加进程、智能感知卡顿所以至少要升到 Update 3。组件勾选的最小组合可以这样记Visual C# 工具必选Microsoft SQL Server Data ToolsSSDT必选Windows 10 SDK可选但做部署时会用到签名工具单个组件里勾上 .NET Framework 4.6.1 SDK 和 Targeting Pack安装时间按机器配置大约 20 到 60 分钟。装完后第一次启动会要求登录或选择主题直接选“以后再说”跳过即可不影响编译。2.3 新建数据库项目从模板到第一个可在本地跑通的窗体打开 VS2015新建项目时选择“Visual C# → Windows → Windows 窗体应用程序”。这里不要选“数据库项目”那是管理数据库架构用的我们要做的是“Windows 应用程序”里引用数据库而不是建一个数据库服务器工程。很多初学者卡在这一步是因为被标题里的“数据库项目开发”误导建了一个空空的数据库项目发现没有窗体可用。正确路径是新建 Windows 窗体应用程序目标框架选 .NET Framework 4.6.1。从工具箱拖入一个 Button、一个 DataGridView 和一个 TextBox。双击按钮进入按钮的 Click 事件。此时工程已经可以编译。为了验证数据库连接我们直接进入下一步在按钮事件里写下连接 SQL Server 的代码。如果你还不确定本机有没有 SQL Server可以用 Visual Studio 自带的 LocalDB 顶替。LocalDB 随 VS2015 一同安装连接字符串中的服务器名写成(localdb)\MSSQLLocalDB即可。private void btnConnect_Click(object sender, EventArgs e) { string connStr Server(localdb)\MSSQLLocalDB;Databasemaster;Integrated Securitytrue;; using (System.Data.SqlClient.SqlConnection conn new System.Data.SqlClient.SqlConnection(connStr)) { conn.Open(); MessageBox.Show(连接成功状态 conn.State); } }这段代码的关键在于Server指定数据库实例Database指定库名Integrated Securitytrue表示用 Windows 身份认证不需要账号密码。using语句确保连接用完后一定会被关闭避免句柄泄漏。如果你要连接的数据库不在 LocalDB 里先把Server换成localhost或机器名再确认 SQL Server 服务是否启动。这是后面所有数据库操作的前提跑不通时不要急着写增删改查先解决连接问题。3. C# 连接 SQL Server连接字符串、SqlConnection 与参数化查询3.1 连接字符串写法与参数说明从本地到远程的三种常用形态连接字符串是 C# 数据库项目里最容易翻车的地方。数据库项目开发环境的数据库最常见的是 SQL Server 2008 R2 / 2012 / 2014都是 VS2015 时代的主流版本。连接字符串的通用格式由键值对组成分号分隔。本地开发最常用的是 Windows 身份认证Serverlocalhost;DatabaseMyDB;Integrated Securitytrue;TimeOut15;如果数据库只能用 SQL Server 账号登录比如在客户服务器上部署上位机时改为Server192.168.1.10,1433;DatabaseMyDB;User IDsa;Passwordxxxx;TrustServerCertificatetrue;注意服务器地址中逗号后面是端口号不是冒号。SQL Server 默认端口是 1433写成192.168.1.10,1433是 TDS 协议的标准写法。TimeOut15表示连接超时时间单位是秒。默认 15 秒已经够用在弱网环境中调大到 30 秒比较稳妥。如果你要连的是 SQLite 或 Access连接字符串完全不同但标题既然锁定了 Windows 数据库项目最常见还是 SQL Server 或 LocalDB。我遇到过的“坑”大多数不是代码问题而是字符串里多了一个空格、数据库实例名写错或者服务没启动。3.2 用 SqlConnection 打开数据库的最小代码块写一个可复用的数据库访问层是所有 C# 数据库项目的基底。以下是最小代码块把它封装到DbHelper.cs类里后面所有窗体都可以调用using System; using System.Data; using System.Data.SqlClient; public class DbHelper { private static string connStr System.Configuration.ConfigurationManager.AppSettings[ConnStr]; public static DataTable Query(string sql, params SqlParameter[] paras) { using (SqlConnection conn new SqlConnection(connStr)) { using (SqlCommand cmd new SqlCommand(sql, conn)) { if (paras ! null) cmd.Parameters.AddRange(paras); conn.Open(); SqlDataAdapter da new SqlDataAdapter(cmd); DataTable dt new DataTable(); da.Fill(dt); return dt; } } } }这个类做了什么Query方法接收 SQL 字符串和参数数组在using块里创建连接、命令用SqlDataAdapter把结果填充到DataTable然后返回。这样做的原因是DataTable是断开式数据连接在方法结束前已关闭不会占用数据库连接数。之后在窗体里调用DataTable dt DbHelper.Query(SELECT * FROM Users WHERE Age age, new SqlParameter(age, 18)); dataGridView1.DataSource dt;逻辑说明using有两个作用——保证资源释放以及在编译期生成 try/finally 结构。参数数组用params关键字调用时可以传任意多个参数也可以传 null。SqlDataAdapter.Fill会打开连接、执行命令并填充 DataTable但要求打开连接前不要做多余操作。参数说明里有一个易错点SqlParameter的名称必须与 SQL 语句中的参数名一一对应比如 SQL 写age代码里也必须用age大小写不敏感但前面的不能丢。另外System.Configuration.ConfigurationManager在新建控制台或窗体工程时默认没有引用需要在“添加引用”里找到System.Configuration.dll并添加config文件否则这句代码会报“未引用”错误。3.3 参数化查询防注入与中文乱码的根源很多新手喜欢用字符串拼接 SQLstring sql SELECT * FROM Users WHERE Name txtName.Text ;这种写法短时间内能跑但有两个隐患。第一是 SQL 注入用户在文本框输入 OR 11SQL 就变成了WHERE Name OR 11所有行都查出来如果后面跟的是 DELETE后果更严重。第二是中文乱码当文本框的内容包含中文拼接进 SQL 后如果连接字符串里没有合适编码或者数据库字段是 varchar 而不是 nvarchar很容易变成问号。参数化查询是数据库项目的标准做法。它把 SQL 结构固定值通过参数传给数据库SQL Server 会按参数类型处理既避免了注入也避免了转义问题。上面DbHelper.Query里的age就是参数化用法。对于带中文的字符串参数建议数据库字段定义为nvarchar代码里的SqlParameter类型用SqlDbType.NVarChar这样从根源上减少乱码。额外提醒一点连接字符串里有一个容易被忽略的Application Name键。设置它可以在 SQL Server 的“活动监视器”里看到是哪个程序访问的数据库对排查 ACS 或事务所很有帮助Serverlocalhost;DatabaseMyDB;Integrated Securitytrue;Application NameMyWinApp;4. 数据库项目里的增删改查与数据显示DataSet、DataGridView 与事务4.1 用 SqlDataAdapter 填充 DataSet省掉一堆手写代码在 Windows 窗体里操作数据最常见的套路是查询得到 DataTable 或 DataSet绑定到控件修改后调用更新方法。DataSet 是内存中的数据库快照可以包含多张表以及表之间的关联。对于中小规模的单机数据库项目比如进销存、上位机配方管理DataSet 加上SqlDataAdapter就能完成大部分操作。一个典型套路是在窗体加载时填充 DataSet然后用 DataGridView 显示private DataSet ds new DataSet(); private SqlDataAdapter adapter; private void Form1_Load(object sender, EventArgs e) { adapter new SqlDataAdapter(SELECT * FROM Devices, connStr); adapter.Fill(ds, Devices); dataGridView1.DataSource ds.Tables[Devices]; }SqlDataAdapter内部维护了SelectCommandFill执行这条命令并填充表。如果要让用户直接修改 DataGridView 里的数据然后保存还需要配置InsertCommand、UpdateCommand、DeleteCommand。手工写这三个命令很繁琐但 VS2015 里有一个可视化工具从工具箱拖一个 DataGridView右上角的智能任务里选择“数据源”引导配置连接并生成对应的适配器。生成的代码虽然啰嗦但逻辑完整适合新手读懂增删改查的关系。注意Fill之后用户修改的是内存中的 DataTable并没有写回数据库。要让修改生效需要调用adapter.Update(ds.Tables[Devices])。Update 方法会逐行检查 RowState根据行状态的 Added/Modified/Deleted 调用对应的 Command。4.2 DataGridView 绑定数据源与列显示的四个实用配置DataGridView 绑定 DataTable 后默认会自动生成所有列的列头。但实际项目里经常只需要显示部分字段或者要把字段名改成中文列头。这时要设置AutoGenerateColumns false然后手工添加列。dataGridView1.AutoGenerateColumns false; dataGridView1.Columns.Clear(); DataGridViewTextBoxColumn colId new DataGridViewTextBoxColumn(); colId.DataPropertyName Id; colId.HeaderText 设备编号; colId.Width 100; DataGridViewTextBoxColumn colName new DataGridViewTextBoxColumn(); colName.DataPropertyName Name; colName.HeaderText 设备名称; colName.Width 200; dataGridView1.Columns.Add(colId); dataGridView1.Columns.Add(colName);这里的关键是DataPropertyName它必须等于 DataTable 的列名这样单元格才能正确取值。如果你不设置AutoGenerateColumnsfalse会出现两套列一套自动生成的。另一套手工加的界面很乱。另外如果表里有Id主键列但不希望用户修改可以把该列设置成ReadOnlytrue这样 DataGridView 里该列就不可编辑避免误改主键导致更新出错。在实际的上位机项目里还会需要一列按钮比如“查看详情”。DataGridView 可以通过加一列DataGridViewButtonColumn实现。这属于进阶但基本思路一样把按钮列的DataPropertyName留空在CellClick事件里判断点击的是不是按钮列。4.3 新增、修改、删除的执行套路ExecuteNonQuery 与事务除了显示数据库项目最核心的操作就是增删改查。查询用ExecuteReader或DataAdapter新增修改删除则用ExecuteNonQuery它返回受影响的行数。public static int ExecuteNonQuery(string sql, params SqlParameter[] paras) { using (SqlConnection conn new SqlConnection(connStr)) { using (SqlCommand cmd new SqlCommand(sql, conn)) { if (paras ! null) cmd.Parameters.AddRange(paras); conn.Open(); return cmd.ExecuteNonQuery(); } } }调用示例string insertSql INSERT INTO Devices(Name, Type) VALUES(name, type); int rows DbHelper.ExecuteNonQuery(insertSql, new SqlParameter(name, 温控器), new SqlParameter(type, PLC));执行修改和删除都是同一套路。如果要执行多条 INSERT 或 UPDATE需要包裹在事务里。最常见的场景是“先删除旧记录再插入新记录”如果删除成功了插入却因某个字段超长而失败数据就丢失了。事务能保证这些操作要么全成功要么全回滚。using (SqlConnection conn new SqlConnection(connStr)) { conn.Open(); SqlTransaction tx conn.BeginTransaction(); try { SqlCommand cmd new SqlCommand(DELETE FROM Devices WHERE GroupIdgid, conn, tx); cmd.Parameters.AddWithValue(gid, groupId); cmd.ExecuteNonQuery(); foreach (DataRow row in newDevices.Rows) { cmd.CommandText INSERT INTO Devices(Name) VALUES(name); cmd.Parameters.Clear(); cmd.Parameters.AddWithValue(name, row[Name]); cmd.ExecuteNonQuery(); } tx.Commit(); } catch { tx.Rollback(); throw; } }事务的关键点SqlCommand 必须传入同一个SqlConnection和SqlTransaction对象。任何一条命令失败Commit不会执行事务被回滚。还要注意AddWithValue虽然方便但在某些版本里会把字符串推断为 NVarchar类型不匹配时可能走不到索引大规模循环更新时性能会降更稳妥的做法是显式声明SqlParameter的类型。5. VS2015 C# 数据库项目避坑指南5 个常被搜索又容易翻车的问题5.1 “Provider not registered” 与 BadImageFormatException32/64 位不匹配现象本机明明装了 SQL Server运行程序时却报System.BadImageFormatException或者The 32-bit OLE DB provider ... cannot be loaded in-process on 64 bit SQL Server。原因VS2015 默认把工程的“平台目标”设为 Any CPU。在 64 位 Windows 上Any CPU 模式下程序会以 64 位进程运行而你引用的某些数据库驱动特别是 Access 的 Jet OLEDB 驱动、某些老式第三方组件只有 32 位版本导致无法加载。解决在项目的“属性 → 生成 → 平台目标”里把 Any CPU 改成 x86重新生成。如果客户机器是 64 位但用的还是 32 位驱动x86 程序也能在 64 位系统上正常运行因为 Windows 有 WoW64 兼容层。不要把平台目标和操作系统的位数混为一谈。另外如果是连接 Access 数据库.mdb / .accdb注意 VS2015 默认不直接支持新的 ACE 驱动需要安装“Microsoft Access Database Engine”并检查工程引用的 OleDb 提供程序名称是否匹配。C# 里连接 Access 时连接字符串中的 Provider 常用Microsoft.ACE.OLEDB.12.0缺驱动时报的就是“Provider not registered”。5.2 连接超时与“已成功与服务器建立连接但在登录过程中发生错误”现象数据库项目运行在客户机器上点了按钮后等待十几秒提示“连接超时”或者建立连接后立刻报“用户 sa 登录失败”。原因这是一个多环节问题。连接超时通常网络不通、防火墙拦截或 SQL Server 未启用 TCP/IP。登录失败则要分别看账号是否存在、密码是否正确、SQL Server 是否处于“仅 Windows 身份验证模式”。解决按顺序排查。第一步在代码运行前用 SQL Server Management StudioSSMS在目标机器上本机连接数据库能连则说明服务本身正常。第二步在开发机上用命令行测试网络端口ping 192.168.1.10 telnet 192.168.1.10 1433telnet 能连上说明网络层没有阻断。连不上先检查 Windows 防火墙是否放行 1433 端口再去 SQL Server 配置管理器里确认“SQL Server 网络配置 → 协议 → TCP/IP”是否已启用并且 IP 地址里设了端口 1433。很多老工程还会遇到默认实例名的问题。如果客户装的是命名实例连接字符串里不能只写 IP得写成192.168.1.10\SQLEXPRESS或192.168.1.10\SQLEXPRESS,1433。5.3 中文乱码显示问号或“????”现象DataGridView 里显示的中文正常INSERT 进数据库后变成问号或者反过来数据库里中文正常程序里读出来乱码。原因最常见的是数据库表字段类型为varcharVARCHAR 只存储 8 位字节中文按 GBK 存没问题但连接字符串如果用了默认字符集或代码里以 UTF-16 传参SQL Server 会做隐式转换。另一个常见原因是你在 SQL 语句中用N前缀但字段不是 NVARCHAR读出来再写回时就丢了字。解决在设计表结构时所有存储中文的字段一律用nvarchar(n)而不是varchar(n)。代码里所有中文字符串参数都显式声明为SqlDbType.NVarChar。写入时避免字符串拼接用参数化。如果数据库里已经有一批乱掉的 varchar 数据只能通过ALTER TABLE把字段类型改成nvarchar并保留已有数据但这需要谨慎处理建议先备份再操作。另外检查 .cs 源文件的编码。以前从 .zip 解压出来的源码如果是在 GB2312 环境编辑的VS2015 用默认编码打开后中文注释可能显示乱码。这不是运行逻辑问题但会导致修改代码时误删中文注释。可以在“文件 → 高级保存选项”里把编码改为“简体中文(GB2312)”或 UTF-8 with BOM。5.4 目标机运行报 MissingMemberException.NET Framework 版本不对现象程序在开发正常复制到一台干净的 Windows 7 或 Windows 10 精简版后双击运行直接崩溃事件日志里提示异常来自System.MissingMethodException或System.IO.FileNotFoundException指向 System.Core 或 System.Configuration。原因VS2015 工程的默认目标框架可能是 4.6.1而目标机器只装了 .NET Framework 4.0 或 4.5。程序集版本不匹配运行时找不到对应方法。解决在项目属性里把目标框架改为低版本比如从 4.6.1 改成 4.5之后再重新生成。前提是代码里没有使用 4.6 才有的 API比如System.Net.Http.HttpClient的某些重载。如果代码依赖新版框架退版本会编译报错那就在部署包里带上 .NET Framework 4.6.1 的安装包首次启动时提示安装。在客户现场我一般习惯把安装包内置 dotNetFx461 离线安装包而不是依赖在线下载。此外VS2015 生成的程序还需要对应版本的 VC 运行库吗纯 C# 程序不需要但如果引用了用 C/CLI 写的混合程序集则可能需要 VC 2015 Redistributable。这个在部署时一并打包比较稳妥。5.5 .zip 工程里缺引用引用的 DLL 不在包内现象打开 .zip 里的解决方案编译时报“未能找到类型或命名空间名称”比如System.Configuration.ConfigurationManager或某个第三方数据库驱动。查看引用时显示黄色感叹号。原因很多 zip 包为了压缩体积没有包含别名的第三方 DLL或者工程文件中的引用路径写的是原作者机器的绝对路径比如D:\Projects\DBAccess.dll。换一台电脑后路径不存在。解决先把整个解决方案放到一个不含中文、不带空格的目录比如C:\DBProject。然后展开“引用”删除黄色感叹号的引用到对应 DLL 的目录重新添加。如果是 NuGet 包在解决方案管理器中右键“还原 NuGet 包”。VS2015 的 NuGet 包里带了一个包管理器控制台输入Update-Package -Reinstall可以强制重装所有包。特别注意老的 .zip 工程里经常有 bin 目录下带了一个*.dll但项目引用的版本比 bin 里的新运行时就会报“程序集版本冲突”。处理办法是把 bin 里不一致的 DLL 清掉重新生成让编译器按引用路径复制正确的版本。6. 把 C# 数据库项目做成可交付的 Windows 程序app.config、发布与上线前验证6.1 用 app.config 管理连接字符串换环境只改配置文件开发的时候连接字符串写在代码里确实能跑但交付后客户换了一台服务器你得重新编译整个程序。合理的做法是把连接字符串放在app.config的connectionStrings节点里。configuration connectionStrings add nameMainDb connectionStringServerlocalhost;DatabaseMyDB;Integrated Securitytrue; providerNameSystem.Data.SqlClient / /connectionStrings /configuration在代码里读取时先引用System.Configuration.dllstring connStr System.Configuration.ConfigurationManager.ConnectionStrings[MainDb].ConnectionString;这样改配置不需要改动代码。这个技巧同样适用于其他易变参数比如AppSettings节点里放一个“采集间隔”或“超时秒数”。VS2015 的 app.config 在生成时会自动复制到输出目录并改名为程序名.exe.config所以部署时把这个 exe.config 一起拷走即可。6.2 生成与发布Release 模式、平台目标与单目录部署交付前的生成配置建议用 Release 而非 Debug。Debug 生成包含调试符号运行速度稍慢而且如果客户环境调试器不匹配会有奇怪行为。在工具栏下拉里切换 Release重新生成。平台目标按前面讲的如果使用了 32 位组件在项目属性中将平台目标设为 x86。生成后确认输出目录里包含以下文件程序 exe程序 exe.config依赖的数据库 DLL如 System.Data.SqlClient 在 .NET 框架自带不需要额外拷如果有调用外部原生 DLL需要放到对应架构目录下输出文件列表可以用一张表确认文件是否必须说明App.exe是程序主体App.exe.config是连接字符串与用户设置第三方数据库驱动 dll视情况如 SQLite、MySQL Connector图标、图片资源视情况嵌入资源时不需要单独拷.pdb 文件否Release 下可不输出6.3 上线前的自检清单从功能验证到异常日志在把程序交给使用者之前建议按下面顺序验证一遍第一功能验证。在开发机器上先跑通增删改查再把数据库文件复制到目标机器上用目标机器的数据库实例重新连接。不要用 LocalDB 测试过就觉得万事大吉LocalDB 和生产环境 SQL Server 的行为有差异。第二异常日志。窗体程序最容易出现“闪退”或“没反应”高优先级客户机连不上数据库时界面也不提示。给 Main 方法加一个全局异常捕获把异常信息写入日志文件Application.ThreadException (sender, e) { System.IO.File.AppendAllText(error.log, DateTime.Now : e.Exception.ToString() Environment.NewLine); };这段代码写在Program.Main里Application.Run之前。全局异常捕获能在弹窗崩溃前把堆栈写到日志之后再根据日志排查。C# 初学者往往忽略这个导致同事在客户那里遇到问题只能靠截图现场猜。第三数据备份。交付时不要忘了跟客户说清楚数据库文件在哪里多久备份一次。很多 Windows 数据库项目的崩溃根源不在代码而是数据库文件满了或者被删了。我自己的一次血泪经验是给一个工厂做设备数据采集程序反复连接不上数据库怕影响生产最后发现是连接字符串里的服务器名写成了开发机的计算机名。改成 IP 之后就没再出过问题。后来我养成了习惯——交付前把所有连接字符串参数逐项检查一遍服务器名、端口、实例名、认证方式、超时时间一个不落。希望帮到你让这次 Visual Studio 2015 下的 C# 数据库项目开发少走点弯路。本文还有配套的精品资源点击获取