AY的Dapper研究学习-基本入门-C#开发-aaronyang技术分享

简介: 原文:AY的Dapper研究学习-基本入门-C#开发-aaronyang技术分享====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。
原文: AY的Dapper研究学习-基本入门-C#开发-aaronyang技术分享

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========


本文,是AY 看github源码,和网上一些博客,文章 整理,写出来的。目前还没找到系统级别的教程


先建立.net framework4.6的控制台项目,添加nuget引用

image.png

新建了 Sqlserver的数据库TestDapper  

SQL
CREATE TABLE [dbo].[Users](  
    [UserID] [int] IDENTITY(1,1) NOT NULL,  
    [UserName] [varchar](50) NULL,  
    [Email] [varchar](100) NULL,  
    [Address] [varchar](100) NULL,  
 CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED   
(  
    [UserID] ASC  
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]  
) ON [PRIMARY]  

CREATE TABLE [dbo].[Product](  
    [ProductID] [int] IDENTITY(1,1) NOT NULL,  
    [ProductName] [varchar](220) NULL,  
    [ProductDesc] [varchar](220) NULL,  
    [UserID] [int] NULL,  
    [CreateTime] [datetime] NULL,  
 CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED   
(  
    [ProductID] ASC  
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]  
) ON [PRIMARY]

image.png

连接:

C#
      var con = new SqlConnection(ConfigurationManager.ConnectionStrings["sql"].ConnectionString);

新增后,返回新增ID-  MsSql:

C#
 var id = con.QueryFirst<int>("insert into users values('ay', 'ay2015@qq.com', '合肥市润安大厦');select  @@IDENTITY;");

新增后,返回新增ID-  MySql:

C#
var id = con.QueryFirst<int>("insert into users values(null, 'ay', 'ay2015@qq.com', '合肥市润安大厦');select last_insert_id();");

参数赋值,Query返回一个列表,这里Users这个Model是自己声明的:

C#
var u = con.Query<Users>("select * from Users where UserID = @UserID", new { UserID = 1 });
            Console.WriteLine(u.First().UserName);

image.png

使用Execute执行 更删改sql,返回int,应该是受影响的行数

image.png

通过Execute执行update

C#
            con.Execute("update users set UserName = '李四川' where UserId = @UserId", new { UserId = 3 });
            var u = con.Query<Users>("select * from Users where UserId = @UserId", new { UserId = 3});
            Console.WriteLine(u.First().UserName);


image.png

删除

C#
  con.Execute("delete from users where UserId = @UserId", new { UserId = 3 });
            var us = con.Query<Users>("select * from Users");
            foreach (var item in us)
            {
                Console.WriteLine(item.UserName);
            }

image.png

增加数据

C#
   var id = con.QueryFirst<int>("insert into users values('ay163', 'ay163@163.com', '合肥市润安大厦11');select  @@IDENTITY;");


IN操作的处理

C#
    var uss = con.Query<Users>("select * from Users where UserId in @UserIds", new { UserIds = new List<int> {1,2 } });
            foreach (var item in uss)
            {
                Console.WriteLine(item.UserName);
            }



插入一条数据

C#
 var id = con.Execute($"insert into Product values('WCF编程宝典', 'WCF基本入门的一本书籍', 1,'{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}')");

多条sql查询反馈,我感觉这个设计真的好

C#
   //多条sql执行
            var sql = "select * from Product; select * from Users";
            using (var multiReader = con.QueryMultiple(sql))
            {
                var productList = multiReader.Read<Product>();
                var userList = multiReader.Read<Users>();
                foreach (var item in productList)
                {
                    Console.WriteLine(item.ProductName);
                }

                foreach (var item in userList)
                {
                    Console.WriteLine(item.UserName);
                }
            }

image.png



关于多表查询的,假如1个表有个导航属性

Product加一个Users类型的User属性,使用 splitOn

C#
          var sql = @"select  p.ProductName,p.CreateTime,u.UserName
                        from Product as p  
                        join Users as u  
                        on p.UserID = u.UserID  
                        where p.CreateTime > '2015-12-12'; ";

            var productList = con.Query<Product, Users, Product>(sql,
                                    (product, users) =>
                                    {
                                        product.User = users; return product;
                                    }, splitOn: "UserName");
            foreach (var item in productList)
            {
                Console.WriteLine(item.ProductName+" "+item.User.UserName);
            }

image.png

我把sql语句的createtime和u.username位置换了下

image.png

效果,日期没了,

image.png

如果位置换回来,又有了,说明是从右往左  分割复制的,只要列 不要是由2张表以上的列成员组成的就

image.png


如果你觉得很难理解,你可以新建一个类,把你的要返回的列,写成对应属性,效果一样的。

C#
  var sql = @"select  p.ProductName,p.CreateTime,u.UserName
                        from Product as p  
                        join Users as u  
                        on p.UserID = u.UserID  
                        where p.CreateTime > '2015-12-12'; ";

            var productList = con.Query<TAY>(sql);
            foreach (var item in productList)
            {
                Console.WriteLine(item.ProductName + " " + item.CreateTime + " " + item.UserName);
            }


C#
  public class TAY
    {
        public string ProductName { get; set; }
        public DateTime CreateTime { get; set; }

        public string UserName { get; set; }
    }



执行存储过程,根据ID查询用户

SQL
USE TestDapper  
GO  
SET ANSI_NULLS ON  
GO  
SET QUOTED_IDENTIFIER ON  
GO  
Create proc [dbo].[sp_GetUsers]    
 @id int     
as    
begin     
select * from Users where UserID = @id ;     
end

image.png

代码简单,没的讲

C#
  var userList = con.Query<Users>("sp_GetUsers", new { id = 1 },
                            commandType: CommandType.StoredProcedure);

            foreach (var item in userList)
            {
                Console.WriteLine(item.UserName);
            }



批量插入怎么写?

C#
  List<Users> user = new List<Users>();
            for (int i = 1; i <= 1000; i++)
            {
                Users u = new Users();
                u.UserName = "AY " + i;
                u.Email = "EM " + i;
                u.Address = "AD " + i;
                user.Add(u);
            }
            con.Execute("insert users(UserName,Email,Address) values(@UserName,@Email,@Address)", user);
            var userList = con.Query<Users>("select * from users");
            foreach (var item in userList)
            {
                Console.WriteLine(item.UserName);
            }

我个人觉得不太喜欢,查询如下

C#
  var userList = con.Query<Users>("select * from users where UserName like  '%测试%'");
            foreach (var item in userList)
            {
                Console.WriteLine(item.UserName);
            }
C#
  System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();
            StringBuilder sb = new StringBuilder("insert users(UserName,Email,Address) ");
            for (int i = 1; i <= 1000; i++)
            {
                if (i == 1000)
                    sb.Append(string.Format("select '{0}','{1}','{2}' ", "用户" + i, "邮箱" + i, "地址" + i));
                else
                {
                    sb.Append(string.Format("select '{0}','{1}','{2}' UNION ", "用户" + i, "邮箱" + i, "地址" + i));
                }
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds.ToString());
            sw.Start();
            var _resultCount = con.Execute(sb.ToString());
            Console.WriteLine(_resultCount);
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds.ToString());

当然肯定是不推荐以上两种,推荐SqlServer的BulkCopy

C#
    public bool SqlServerBulkInsert(DataTable table, string connectionString)
        {
            try
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    SqlTransaction trans = conn.BeginTransaction();

                    SqlBulkCopy sqlbulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, trans);
                    // 设置源表名称
                    sqlbulkCopy.DestinationTableName = table.TableName;
                    //分几次拷贝
                    //sqlbulkCopy.BatchSize = 10;
                    // 设置超时限制
                    sqlbulkCopy.BulkCopyTimeout = CommandTimeOut;
                    foreach (DataColumn dtColumn in table.Columns)
                    {
                        sqlbulkCopy.ColumnMappings.Add(dtColumn.ColumnName, dtColumn.ColumnName);
                    }
                    try
                    {
                        // 写入
                        sqlbulkCopy.WriteToServer(table);
                        // 提交事务
                        trans.Commit();
                        return true;
                    }
                    catch(Exception ex)
                    {
                        trans.Rollback();
                        sqlbulkCopy.Close();
                        return false;
                    }
                    finally
                    {
                        conn.Close();
                        conn.Dispose();
                        sqlbulkCopy.Close();
                    }
                }
            }
            catch (Exception e)
            {

                return false;
            }
        }


====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========


我先写这么多吧,下篇博客继续



推荐您阅读更多有关于“C#,”的文章

目录
相关文章
|
5天前
|
Linux C# 开发者
Uno Platform 驱动的跨平台应用开发:从零开始的全方位资源指南与定制化学习路径规划,助您轻松上手并精通 C# 与 XAML 编程技巧,打造高效多端一致用户体验的移动与桌面应用程序
【9月更文挑战第8天】Uno Platform 的社区资源与学习路径推荐旨在为初学者和开发者提供全面指南,涵盖官方文档、GitHub 仓库及社区支持,助您掌握使用 C# 和 XAML 创建跨平台原生 UI 的技能。从官网入门教程到进阶技巧,再到活跃社区如 Discord,本指南带领您逐步深入了解 Uno Platform,并提供实用示例代码,帮助您在 Windows、iOS、Android、macOS、Linux 和 WebAssembly 等平台上高效开发。建议先熟悉 C# 和 XAML 基础,然后实践官方教程,研究 GitHub 示例项目,并积极参与社区讨论,不断提升技能。
21 2
|
6天前
|
设计模式 C# 开发者
C#设计模式入门实战教程
C#设计模式入门实战教程
|
16天前
|
JSON C# 开发者
💡探索C#语言进化论:揭秘.NET开发效率飙升的秘密武器💼
【8月更文挑战第28天】C#语言凭借其强大的功能与易用性深受开发者喜爱。伴随.NET平台演进,C#持续引入新特性,如C# 7.0的模式匹配,让处理复杂数据结构更直观简洁;C# 8.0的异步流则使异步编程更灵活高效,无需一次性加载全部数据至内存。通过示例展示了模式匹配简化JSON解析及异步流实现文件逐行读取的应用。此外,C# 8.0还提供了默认接口成员和可空引用类型等特性,进一步提高.NET开发效率与代码可维护性。随着C#的发展,未来的.NET开发将更加高效便捷。
33 1
|
6天前
|
开发框架 .NET Java
C#/.NET/.NET Core自学入门指南
C#/.NET/.NET Core自学入门指南
|
12天前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
29 0
|
12天前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
30 0
|
12天前
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
21 0
|
12天前
|
前端开发 开发者 Apache
揭秘Apache Wicket项目结构:如何打造Web应用的钢铁长城,告别混乱代码!
【8月更文挑战第31天】Apache Wicket凭借其组件化设计深受Java Web开发者青睐。本文详细解析了Wicket项目结构,帮助你构建可维护的大型Web应用。通过示例展示了如何使用Maven管理依赖,并组织页面、组件及业务逻辑,确保代码清晰易懂。Wicket提供的页面继承、组件重用等功能进一步增强了项目的可维护性和扩展性。掌握这些技巧,能够显著提升开发效率,构建更稳定的Web应用。
35 0
|
1月前
|
开发框架 人工智能 自然语言处理
基于ChatGPT的API的C#接入研究
基于ChatGPT的API的C#接入研究
|
1月前
|
开发框架 .NET API
C#/.NET/.NET Core推荐学习书籍(24年8月更新)
C#/.NET/.NET Core推荐学习书籍(24年8月更新)