首页/新闻资讯/正文详情

SQL Server 与 C 开发入门(Windows):ADO.NET、Entity Framework 与列存储索引实战指南

发布时间:2026/9/25 3:32:21 来源:云帆数科 栏目:资讯中心
SQL Server 与 C 开发入门(Windows):ADO.NET、Entity Framework 与列存储索引实战指南
示例工程数据库教程后端【免费下载链接】sql-server-samplesAzure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge项目地址https://gitcode.com/gh_mirrors/sq/sql-server-samples点击查看免费下载本指南基于微软官方 SQL Server 示例仓库中的 Windows 版 C# 入门教程系统讲解如何在 Windows 环境下使用 C# 连接 SQL Server 2016并通过三个可直接运行的控制台示例分别掌握ADO.NET 原生 CRUD、Entity Framework ORM CRUD以及列存储索引Columnstore性能优化三大核心技能。阅读并运行完本指南你将能够在 Visual Studio 中完成从连接字符串配置、建库建表、增删改查到列存储索引性能对比的完整开发闭环。输出文章关于本示例About this sample本教程对应的示例代码位于仓库的samples/tutorials/c#/Windows目录官方定位为 Windows 平台上「快速上手 C# SQL Server 开发」的入门示例其核心信息如下适用版本SQL Server 2016或更高版本覆盖工作负载使用 .NETADO.NET完成 CRUD增删改查使用 Entity Framework 完成 CRUD使用列存储索引Columnstore获得性能提升编程语言C#作者ajlam整个目录下共包含四个可直接运行的控制台项目其中前三个正是上述三种工作负载对应的示例第四个是面向云场景的附加示例项目目录技术要点SqlServerSample使用 ADO.NETSystem.Data.SqlClient完成数据库创建、建表与完整 CRUDSqlServerEFSample使用 Entity FrameworkDbContext以对象方式完成 CRUD 与关联操作SqlServerColumnstoreSample插入 500 万行数据对比列存储索引添加前后的查询性能SqlMIResilientCloudApp针对 Azure SQL Managed Instance 的瞬时故障重试弹性示例运行前的环境准备Before you begin要运行这些示例需要先准备以下软件环境SQL Server 2016或更高版本本地实例即可满足示例运行要求三个主示例的连接字符串默认指向localhost.NET Framework示例基于 .NET Framework 构建SqlMIResilientCloudApp的配置文件明确要求.NETFramework,Versionv4.7.2见samples/tutorials/c#/Windows/SqlMIResilientCloudApp/App.configEntity FrameworkSqlServerEFSample项目使用 EF 6 风格的System.Data.EntityAPI需要安装 Entity Framework 程序包Visual Studio用于打开、编译与调试示例程序官方教程基于 Visual Studio 的 F5 一键运行工作流设计。快速运行三步法在 Visual Studio 中打开对应的.csproj项目如SqlServerSample找到Program.cs将连接字符串中的用户名UserID和密码Password修改为你自己的 SQL Server 登录凭据直接按F5构建并运行程序对三个示例ADO.NET CRUD、EF CRUD、Columnstore重复上述两步即可逐一体验。示例一使用 ADO.NET 完成原生 CRUDSqlServerSample这是入门的第一课不借助任何 ORM直接使用 ADO.NET 的SqlConnection、SqlCommand、SqlDataReader与 SQL Server 交互。源码见samples/tutorials/c#/Windows/SqlServerSample/Program.cs。构建连接字符串示例使用SqlConnectionStringBuilder以强类型方式拼装连接字符串避免手写字符串的格式错误SqlConnectionStringBuilder builder new SqlConnectionStringBuilder(); builder.DataSource localhost; // update me builder.UserID sa; // update me builder.Password your_password; // update me builder.InitialCatalog master;其中DataSource是服务器地址本示例为localhostUserID/Password为登录账号InitialCatalog初始指向master系统库随后示例会在此基础上创建业务库。创建数据库与示例表连接成功后程序首先执行建库语句然后切换到新库SampleDB中建表并插入三条初始数据DROP DATABASE IF EXISTS [SampleDB]; CREATE DATABASE [SampleDB]USE SampleDB; CREATE TABLE Employees ( Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, Name NVARCHAR(50), Location NVARCHAR(50) ); INSERT INTO Employees (Name, Location) VALUES (NJared, NAustralia), (NNikita, NIndia), (NTom, NGermany);注意Name、Location均使用NVARCHAR类型且中文字符串带N前缀——这是面向 SQL Server 存储 Unicode 数据的标准做法。参数化增删改查示例最值得借鉴的是全程使用参数化查询name、location等占位符配合command.Parameters.AddWithValue这既能避免 SQL 注入风险也是企业级 ADO.NET 代码的规范写法。INSERT插入sb.Append(INSERT Employees (Name, Location) ); sb.Append(VALUES (name, location);); using (SqlCommand command new SqlCommand(sql, connection)) { command.Parameters.AddWithValue(name, Jake); command.Parameters.AddWithValue(location, United States); int rowsAffected command.ExecuteNonQuery(); Console.WriteLine(rowsAffected row(s) inserted); }UPDATE更新String userToUpdate Nikita; sb.Append(UPDATE Employees SET Location NUnited States WHERE Name name); command.Parameters.AddWithValue(name, userToUpdate); int rowsAffected command.ExecuteNonQuery();DELETE删除String userToDelete Jared; sb.Append(DELETE FROM Employees WHERE Name name;); command.Parameters.AddWithValue(name, userToDelete); int rowsAffected command.ExecuteNonQuery();SELECT查询使用ExecuteReader()返回SqlDataReader通过列索引读取结果sql SELECT Id, Name, Location FROM Employees;; using (SqlCommand command new SqlCommand(sql, connection)) { using (SqlDataReader reader command.ExecuteReader()) { while (reader.Read()) { Console.WriteLine({0} {1} {2}, reader.GetInt32(0), reader.GetString(1), reader.GetString(2)); } } }整个流程被包裹在try/catch (SqlException e)中连接与命令对象均使用using确保资源及时释放——这也是编写 ADO.NET 代码必须养成的两个习惯。示例二使用 Entity Framework 完成 CRUD 与关联操作SqlServerEFSample第二个示例展示如何用 Entity Framework 摆脱手写 SQL以纯 C# 对象的方式操作数据库。源码涉及四个文件Program.cs主流程、EFSampleContext.csDbContext 上下文、User.cs与Task.cs实体类全部位于samples/tutorials/c#/Windows/SqlServerEFSample目录。定义实体与上下文User与Task是两个普通 POCO 类User包含UserId、FirstName、LastName并通过virtual IListTask Tasks声明一对多关系Task包含TaskId、Title、DueDate、IsComplete并通过virtual User AssignedTo声明外键导航属性注意virtual关键字是 EF 延迟加载Lazy Loading所必需的。EFSampleContext继承DbContext通过两个DbSet属性将实体映射到表public class EFSampleContext : DbContext { public EFSampleContext(string connectionString) { Database.SetInitializerEFSampleContext(new DropCreateDatabaseAlwaysEFSampleContext()); this.Database.Connection.ConnectionString connectionString; } public DbSetUser Users { get; set; } public DbSetTask Tasks { get; set; } }其中DropCreateDatabaseAlways初始化策略意味着每次运行时都会重建数据库结构——非常适合演示但生产环境应替换为CreateDatabaseIfNotExists或迁移Migration方案。对象化 CRUD 全流程主程序Program.cs用同一套连接字符串构造上下文然后依次演示五种操作Create创建直接new出实体对象加入DbSet后调用SaveChanges()持久化User newUser new User { FirstName Anna, LastName Shrestinian }; context.Users.Add(newUser); context.SaveChanges(); Task newTask new Task() { Title Ship Helsinki, IsComplete false, DueDate DateTime.ParseExact(04-01-2017, MM-dd-yyyy, CultureInfo.InvariantCulture) }; context.Tasks.Add(newTask); context.SaveChanges();Association关联将任务指派给用户只需设置导航属性即可EF 会自动维护外键newTask.AssignedTo newUser; context.SaveChanges();Read查询使用 LINQ 查询「分配给 Anna 的未完成任务」——这是 EF 最常用的查询姿势var query from t in context.Tasks where t.IsComplete false t.AssignedTo.FirstName.Equals(Anna) select t;Update更新取出实体、改属性、再SaveChanges()Task taskToUpdate context.Tasks.First(); taskToUpdate.DueDate DateTime.ParseExact(06-30-2016, MM-dd-yyyy, CultureInfo.InvariantCulture); context.SaveChanges();Delete删除先 LINQ 筛选出 2016 年到期的任务逐个Remove后统一提交var query from t in context.Tasks where t.DueDate dueDate2016 select t; foreach (Task t in query) { context.Tasks.Remove(t); } context.SaveChanges();对比示例一可以看出ADO.NET 需要你手写每一条 SQL 并手动管理参数而 EF 把这一切抽象为对象操作与SaveChanges()开发效率更高代价是需要理解实体映射与初始化策略等 EF 概念。示例三用列存储索引实现性能跃升SqlServerColumnstoreSample第三个示例演示 SQL Server 2016 的列存储索引Columnstore对分析型聚合查询的加速效果是学习 SQL Server 性能调优的绝佳入门材料。源码见samples/tutorials/c#/Windows/SqlServerColumnstoreSample/Program.cs。生成 500 万行测试数据程序先建库然后用一条巧妙的 CTE 交叉连接 SQLVALUES构造 10 个数字8 个自连接展开为 10⁸ 行再TOP(5000000)截取批量生成 500 万行测试数据USE SampleDB; WITH a AS (SELECT * FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) AS a(a)) SELECT TOP(5000000) ROW_NUMBER() OVER (ORDER BY a.a) AS OrderItemId, a.a b.a c.a d.a e.a f.a g.a h.a AS OrderId, a.a * 10 AS Price, CONCAT(a.a, N , b.a, N , c.a, N , d.a, N , e.a, N , f.a, N , g.a, N , h.a) AS ProductName INTO Table_with_5M_rows FROM a, a AS b, a AS c, a AS d, a AS e, a AS f, a AS g, a AS h;该语句在示例代码中被注释为「需要约 1 分钟」请耐心等待控制台提示完成。添加列存储索引前后的性能对比核心逻辑是一个SumPrice()方法对Table_with_5M_rows执行SELECT SUM(Price)用DateTime.Now.Ticks计算耗时并返回毫秒数。程序先执行一次无索引查询记录基线耗时然后添加列存储索引CREATE CLUSTERED COLUMNSTORE INDEX columnstoreindex ON Table_with_5M_rows;再执行同一条SUM(Price)查询最后打印性能提升倍数double elapsedTimeWithoutIndex SumPrice(connection); // ... CREATE CLUSTERED COLUMNSTORE INDEX ... double elapsedTimeWithIndex SumPrice(connection); Console.WriteLine(Performance improvement with columnstore index: Math.Round(elapsedTimeWithoutIndex / elapsedTimeWithIndex) x!);原理简析传统的行存储Rowstore按行组织数据聚合时需要逐行扫描而列存储将每一列的数据连续存放配合压缩与批处理执行Batch Mode对SUM、COUNT、AVG这类按列聚合的查询往往能带来数十倍甚至上百倍的加速。示例中程序会自动打印出实测的加速倍数如xxx x!这是验证列存储价值的直观证据。需要说明的是具体加速倍数取决于硬件、数据分布与查询形态示例旨在演示方法而非给出固定性能承诺。延伸示例面向云环境的瞬时故障重试SqlMIResilientCloudApp在同一目录下还附带了一个面向云场景的进阶示例SqlMIResilientCloudApp其目标是让应用在 Azure SQL Managed Instance 发生故障转移failover或瞬时错误时仍能继续运行。尽管它不在主 README 的三个示例之列但作为同一教程目录的组成部分值得一并了解。数据库侧准备在 SQL MI例如通过 SSMS上先创建测试库和表CREATE DATABASE failoverDB; USE failoverDB; CREATE TABLE timetable (datestamp datetime); INSERT INTO timetable (datestamp) VALUES (CURRENT_TIMESTAMP); SELECT * FROM timetable;连接配置连接信息通过App.config的appSettings配置程序从ConfigurationManager.AppSettings读取并拼装SqlConnectionStringBuilder见samples/tutorials/c#/Windows/SqlMIResilientCloudApp/ResilientDBApp.csappSettings add keyConnMI1.server valuemanagedinstance.public.xxxxxxxxxxx.database.windows.net,3342/ add keyConnMI1.database valuedatabasename/ add keyConnMI1.username valueusername/ add keyConnMI1.pass valuepassword/ /appSettings弹性重试逻辑程序通过bool ResilientQuery开关切换两种模式ResilientQuery false非弹性模式直接执行查询无任何重试逻辑遇到 SQL MI 故障转移会直接报错终止ResilientQuery true弹性模式采用「最多重试 4 次、初始间隔 10 秒、每次间隔放大 1.5 倍」的退避策略并且只在错误号命中瞬时错误清单时才重试static public CG.Listint TransientErrorNumbers new CG.Listint { 4060, 40197, 40501, 40613, 49918, 49919, 49920, 11001 };这组错误号如 4060 无法打开数据库、40613 服务器繁忙、40197 服务正在处理请求等正是 Azure SQL 系列服务瞬时故障的典型错误码。连接字符串中还设置了ConnectRetryCount 3、ConnectRetryInterval 10、Encrypt true、ConnectTimeout 30等面向云端连接的安全与超时参数ADO.NET 4.5.1 及以上支持。演示方法应用运行期间用SELECT * FROM timetable;观察插入的数据同时通过文章配套的 PowerShell 对 Managed Instance 发起故障转移对比ResilientQuery为true与false时应用的表现差异。该模式同样适用于其他 SQL Server 部署形态。声明与相关资源免责声明Disclaimers仓库中的脚本与本指南均作为示例提供它们不属于任何 Azure 服务不受任何 SLA 或其他 Azure 相关协议保障代码按「原样」提供不附带任何明示或默示的担保。微软不对脚本的使用或本文档的准确性承担责任请在正式使用前充分熟悉这些脚本。更多资源本教程的完整图文版可参阅官方「C# on Windows」入门教程仓库 README 中给出的外部链接更多快速上手教程与示例可浏览本仓库的教程汇总页面详见 samples/tutorials/README.md三个示例的可运行源码分别位于SqlServerSample/Program.csSqlServerEFSample/Program.csSqlServerColumnstoreSample/Program.csSqlMIResilientCloudApp/ResilientDBApp.cs建议按「ADO.NET 原生 CRUD → Entity Framework ORM → Columnstore 性能优化」的顺序逐一运行即可完整建立起 C# SQL Server 从基础数据访问到性能调优的知识链路。赞分享示例工程数据库教程后端【免费下载链接】sql-server-samplesAzure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge项目地址https://gitcode.com/gh_mirrors/sq/sql-server-samples点击查看免费下载相关推荐SQL Server columnstore 索引实战指南从非聚集列存储到 In-Memory 与排序列存储sql-server-samples 官方演示详解SQL Server columnstore 索引实战指南从非聚集列存储到 In Memory 与排序列存储sql server samples 官方演示详示例工程数据库教程后端5分钟掌握猫抓浏览器插件终极网页资源嗅探与视频下载完整方案5分钟掌握猫抓浏览器插件终极网页资源嗅探与视频下载完整方案 想要轻松捕获网页中的视频、音频等媒体资源吗猫抓浏览器插件正是你需要的智能工具这款开源扩展能够自示例工程数据库教程后端字节级革命FuJianAscend/byt5-xl模型深度解析告别分词器的NLP新范式字节级革命FuJianAscend/byt5 xl模型深度解析告别分词器的NLP新范式 在自然语言处理NLP领域传统的分词器一直是个技术债需要复示例工程数据库教程后端上一篇LPE Workshop案例研究真实世界中的权限提升攻击下一篇financial-services 完整指南SKILL.md 如何把机构级建模规范写成 Skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Swagger Codegen 生成的 Java 客户端 UserApi 实战指南:基于 okhttp4-gson-parcelableModel 的 Petstore 用户接口
Swagger Codegen 生成的 Java 客户端 UserApi 实战指南:基于 okhttp4-gson-parcelableModel 的 Petstore 用户接口

开发工具代码生成API设计 【免费下载链接】swagger-codegen swagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition. 项目地址: http… · 2026/9/25 3:32:21

全域智能管控平台权限管理:RBAC模型落地与安全管控实践
全域智能管控平台权限管理:RBAC模型落地与安全管控实践

聊到权限管理,很多人第一反应就是"给谁开通什么功能",似乎建个用户列表再打个勾就完事了。但真正做过安防平台、物联网管控平台或者企业内部中台的人都会明白,权限管理从来不是界面交互问题,而是整个系统的安全底座。尤… · 2026/9/25 3:32:21

SSM+MySQL轻型卡车零部件销售平台:从架构设计到部署避坑指南
SSM+MySQL轻型卡车零部件销售平台:从架构设计到部署避坑指南

简介:这是一份基于Java SSM框架与MySQL数据库的轻型卡车零部件销售平台项目资料包,主要面向正在完成毕业设计或课程设计的计算机专业学生,以及希望熟悉SSM单体项目完整开发流程的Java学习者。平台实现了配件分类展示、订单管理、检修信息登记… · 2026/9/25 3:32:21

深入解析 BAML compute 基准负载 divide-guard-1m:除零守卫、整数除法与 speedtest 基准框架
深入解析 BAML compute 基准负载 divide-guard-1m:除零守卫、整数除法与 speedtest 基准框架

编程语言AI Agent编译器CLI人工智能 【免费下载链接】baml The programming language for agents 项目地址: https://gitcode.com/gh_mirrors/ba/baml 点击查看 免费下载 导读 divide-guard-1m 是 BAML 开源仓库中 speedtest 基准套件(位于 baml_langu… · 2026/9/25 3:55:37

DiceBear Avataaars 预设(Presets)实战指南:11 套现成配置、代码生成与 Playground 调参
DiceBear Avataaars 预设(Presets)实战指南:11 套现成配置、代码生成与 Playground 调参

UI组件后端 【免费下载链接】dicebear DiceBear is an avatar library for designers and developers. 🌍 项目地址: https://gitcode.com/gh_mirrors/di/dicebear 点击查看 免费下载 DiceBear 官方文档为每个主流样式都准备了「预设(Preset… · 2026/9/25 3:55:37

Apereo CAS Surrogate 认证之 JSON 账户存储配置实战指南
Apereo CAS Surrogate 认证之 JSON 账户存储配置实战指南

后端认证鉴权单点登录 【免费下载链接】cas Apereo CAS - Identity & Single Sign On for all earthlings and beyond. 项目地址: https://gitcode.com/gh_mirrors/ca/cas 点击查看 免费下载 Surrogate 认证(又称模拟/代管认证,即“Web … · 2026/9/25 3:55:37

pylibcudf 的 ORC 读写 API 完全指南:从 read_orc 到分块写入
pylibcudf 的 ORC 读写 API 完全指南:从 read_orc 到分块写入

数据分析数据工程机器学习 【免费下载链接】cudf cuDF - GPU DataFrame Library 项目地址: https://gitcode.com/gh_mirrors/cu/cudf 点击查看 免费下载 本篇技术指南以 cuDF 仓库中 pylibcudf 的 ORC(Optimized Row Columnar)格式 I/O 模块… · 2026/9/25 3:55:37

学生时间管理APP全栈开发实战:课程表、番茄钟与数据闭环设计
学生时间管理APP全栈开发实战:课程表、番茄钟与数据闭环设计

带过三年毕设项目,被问得最多的一个选题就是“学生时间管理APP”。很多同学第一反应是这个题目太老——课程表、待办事项、番茄钟,网上一抓一大把模板,还能做出什么花来?这话只对了一半。时间管理工具确实不稀奇,但面向… · 2026/9/25 3:55:31

Cobalt Strike 4.0 zip解压与部署实战:从伪加密识别到teamserver启动
Cobalt Strike 4.0 zip解压与部署实战:从伪加密识别到teamserver启动

简介:面向网络安全渗透测试与红队演练场景,这是一套 Cobalt Strike 4.0 资源包,适合具备一定基础的安全测试人员、企业蓝队成员及高校安全方向学习者。Cobalt Strike 是由 Raphael Mudge 开发的商业红队平台,4.0 版本在前代基础上… · 2026/9/25 3:55:25

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

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

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

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

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码