[C#]ADO访问多数据库的C#库

C# WinForms开发组件库 开发者可根据项目规模选择:小型项目推荐ADO.NET+SqlSugar组合,大型系统建议Entity Framework Core实现领域驱动设计。用于建立与SQL Server数据库的连接,需通过连接字符串配置服务器地址、数据库名、认证信息等。提供更简洁的API,支持多数据库类型(SQL Server/MySQL/SQLite等)通过DbContext上下文管理数据库会话,使用LINQ语法实现强类型查询。通过实体类自动生成数据库结构,支持迁移脚本管理。桥接数据库与内存数据集,通过。方法将查询结果加载到。 阅读详情
[+]
  1. 一C Database 库
  2. 二使用示例
  3. 三注意事项

[C#]ADO访问多数据库的C#库

罗朝辉 (http://blog.youkuaiyun.com/kesalin/)

本文遵循“署名-非商业用途-保持一致”创作公用协议

一,C# Database 库

整了一个支持通过ADO方式访问多种数据库(OLE,MySQL,SQL Server,Oracle)的 C# 库 Database。实现相当简单,用工厂方法创建各种数据库访问的 wrapper 类即可。

源码下载:点此下载
或访问 Github:https://github.com/kesalin/CSharpSnippet/tree/master/Database

类图如下:


IDatabase 是对外公开的接口类,其中定义了一堆操作数据库的接口方法;
DatabaseFactory 是窗口数据库的工厂类;
DatabaseType 是一个数据库类型的枚举;
DatabaseHelper 封装一些和数据库相关的常用的小工具方法,如便捷地创建 connection string,从 dataset 中读取值等。

二,使用示例

示例代码如下:

  1. internal class Program  
  2. {  
  3.     private IDatabase _db;  
  4.     private const DatabaseType _dbType = DatabaseType.MySQL; 
  5.  
  6.     #region Database related   
  7.   
  8.     // You need to create a MySQL database named "sample" with columns   
  9.     // id(int), Name(varchar(45)), Address(varchar(45)), Age(int) for this test.  
  10.     //    
  11.     private void CreateDatabase()  
  12.     {  
  13.         if (_db == null)  
  14.         {  
  15.             // Setup you database information here.  
  16.             //   
  17.             var connStr = DatabaseHelper.CreateConnectionString(_dbType, "localhost", "sample", "root", "123456");  
  18.             _db = DatabaseFactory.CreateDatabase(_dbType, connStr);  
  19.   
  20.             if (_db == null)  
  21.                 Console.WriteLine(" >> Failed to create database with connection string {0}.", connStr);  
  22.             else  
  23.                 Console.WriteLine(" >> Created database.");  
  24.         }  
  25.     }  
  26.   
  27.     private void CloseDatabase()  
  28.     {  
  29.         if (_db != null)  
  30.         {  
  31.             _db.Dispose();  
  32.             _db = null;  
  33.         }      
  34.     }  
  35.   
  36.     public void TestInsert()  
  37.     {  
  38.         if (_db == null)  
  39.             return;  
  40.   
  41.         const string sqlCmd = "insert into customer (id, Name,Address,Age) values (0,'飘飘白云','上海张江高科',28)";  
  42.   
  43.         try  
  44.         {  
  45.             _db.Open();  
  46.             _db.ExcuteSql(sqlCmd);  
  47.   
  48.             Console.WriteLine(" >> Succeed. {0}", sqlCmd);  
  49.         }  
  50.         catch (Exception ex)  
  51.         {  
  52.             Console.WriteLine(" >> Failed to {0}. {1}", sqlCmd, ex.Message);  
  53.         }  
  54.         finally  
  55.         {  
  56.             _db.Close();  
  57.         }  
  58.     }  
  59.   
  60.     public void TestFind()  
  61.     {  
  62.         if (_db == null)  
  63.             return;  
  64.   
  65.         const string sqlCmd = "select Name,Address,Age from customer where Name='飘飘白云'";  
  66.   
  67.         try  
  68.         {  
  69.             _db.Open();  
  70.             var dataSet = _db.ExcuteSqlForDataSet(sqlCmd);  
  71.             var recordCount = DatabaseHelper.GetRowCount(dataSet);  
  72.   
  73.             Console.WriteLine(" >> Excuted {0}", sqlCmd);  
  74.             Console.WriteLine(" >> Found {0} record.", recordCount);  
  75.   
  76.             for (int i = 0; i < recordCount; i++)  
  77.             {  
  78.                 var name = DatabaseHelper.GetValue(dataSet, i, 0) as string;  
  79.                 var address = DatabaseHelper.GetValue(dataSet, i, 1) as string;  
  80.                 var age = DatabaseHelper.GetIntValue(dataSet, i, 2);  
  81.   
  82.                 Console.WriteLine("    >> Record {0}, Name:{1}, Address:{2}, Age:{3}", i + 1, name, address, age);  
  83.             }  
  84.         }  
  85.         catch (Exception ex)  
  86.         {  
  87.             Console.WriteLine(" >> Failed to {0}. {1}", sqlCmd, ex.Message);  
  88.         }  
  89.         finally  
  90.         {  
  91.             _db.Close();  
  92.         }  
  93.     }  
  94.   
  95.     public void TestUpdate()  
  96.     {  
  97.         if (_db == null)  
  98.             return;  
  99.   
  100.         const string sqlCmd = "update customer set Address='张江高科' where Name='飘飘白云'";  
  101.   
  102.         try  
  103.         {  
  104.             _db.Open();  
  105.             _db.ExcuteSql(sqlCmd);  
  106.   
  107.             Console.WriteLine(" >> Succeed. {0}", sqlCmd);  
  108.         }  
  109.         catch (Exception ex)  
  110.         {  
  111.             Console.WriteLine(" >> Failed to {0}. {1}", sqlCmd, ex.Message);  
  112.         }  
  113.         finally  
  114.         {  
  115.             _db.Close();  
  116.         }  
  117.     }  
  118.   
  119.     public void TestDelete()  
  120.     {  
  121.         if (_db == null)  
  122.             return;  
  123.   
  124.         const string sqlCmd = "delete from customer where Name='飘飘白云'";  
  125.   
  126.         try  
  127.         {  
  128.             _db.Open();  
  129.             _db.ExcuteSql(sqlCmd);  
  130.   
  131.             Console.WriteLine(" >> Succeed. {0}", sqlCmd);  
  132.         }  
  133.         catch (Exception ex)  
  134.         {  
  135.             Console.WriteLine(" >> Failed to {0}. {1}", sqlCmd, ex.Message);  
  136.         }  
  137.         finally  
  138.         {  
  139.             _db.Close();  
  140.         }  
  141.     }  
  142.  
  143.     #endregion   
  144.   
  145.     static void Main(string[] args)  
  146.     {  
  147.         var runner = new Program();  
  148.   
  149.         runner.CreateDatabase();  
  150.   
  151.         runner.TestInsert();  
  152.         runner.TestFind();  
  153.   
  154.         runner.TestUpdate();  
  155.         runner.TestFind();  
  156.   
  157.         runner.TestDelete();  
  158.         runner.TestFind();  
  159.   
  160.         runner.CloseDatabase();  
  161.   
  162.         Console.ReadLine();  
  163.     }  
  164. }  
    internal class Program
    {
        private IDatabase _db;
        private const DatabaseType _dbType = DatabaseType.MySQL;

        #region Database related

        // You need to create a MySQL database named "sample" with columns 
        // id(int), Name(varchar(45)), Address(varchar(45)), Age(int) for this test.
        // 
        private void CreateDatabase()
        {
            if (_db == null)
            {
                // Setup you database information here.
                //
                var connStr = DatabaseHelper.CreateConnectionString(_dbType, "localhost", "sample", "root", "123456");
                _db = DatabaseFactory.CreateDatabase(_dbType, connStr);

                if (_db == null)
                    Console.WriteLine(" >> Failed to create database with connection string {0}.", connStr);
                else
                    Console.WriteLine(" >> Created database.");
            }
        }

        private void CloseDatabase()
        {
            if (_db != null)
            {
                _db.Dispose();
                _db = null;
            }    
        }

        public void TestInsert()
        {
            if (_db == null)
                return;

            const string sqlCmd = "insert into customer (id, Name,Address,Age) values (0,'飘飘白云','上海张江高科',28)";

            try
            {
                _db.Open();
                _db.ExcuteSql(sqlCmd);

                Console.WriteLine(" >> Succeed. {0}", sqlCmd);
            }
            catch (Exception ex)
            {
                Console.WriteLine(" >> Failed to {0}. {1}", sqlCmd, ex.Message);
            }
            finally
            {
                _db.Close();
            }
        }

        public void TestFind()
        {
            if (_db == null)
                return;

            const string sqlCmd = "select Name,Address,Age from customer where Name='飘飘白云'";

            try
            {
                _db.Open();
                var dataSet = _db.ExcuteSqlForDataSet(sqlCmd);
                var recordCount = DatabaseHelper.GetRowCount(dataSet);

                Console.WriteLine(" >> Excuted {0}", sqlCmd);
                Console.WriteLine(" >> Found {0} record.", recordCount);

                for (int i = 0; i < recordCount; i++)
                {
                    var name = DatabaseHelper.GetValue(dataSet, i, 0) as string;
                    var address = DatabaseHelper.GetValue(dataSet, i, 1) as string;
                    var age = DatabaseHelper.GetIntValue(dataSet, i, 2);

                    Console.WriteLine("    >> Record {0}, Name:{1}, Address:{2}, Age:{3}", i + 1, name, address, age);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(" >> Failed to {0}. {1}", sqlCmd, ex.Message);
            }
            finally
            {
                _db.Close();
            }
        }

        public void TestUpdate()
        {
            if (_db == null)
                return;

            const string sqlCmd = "update customer set Address='张江高科' where Name='飘飘白云'";

            try
            {
                _db.Open();
                _db.ExcuteSql(sqlCmd);

                Console.WriteLine(" >> Succeed. {0}", sqlCmd);
            }
            catch (Exception ex)
            {
                Console.WriteLine(" >> Failed to {0}. {1}", sqlCmd, ex.Message);
            }
            finally
            {
                _db.Close();
            }
        }

        public void TestDelete()
        {
            if (_db == null)
                return;

            const string sqlCmd = "delete from customer where Name='飘飘白云'";

            try
            {
                _db.Open();
                _db.ExcuteSql(sqlCmd);

                Console.WriteLine(" >> Succeed. {0}", sqlCmd);
            }
            catch (Exception ex)
            {
                Console.WriteLine(" >> Failed to {0}. {1}", sqlCmd, ex.Message);
            }
            finally
            {
                _db.Close();
            }
        }

        #endregion

        static void Main(string[] args)
        {
            var runner = new Program();

            runner.CreateDatabase();

            runner.TestInsert();
            runner.TestFind();

            runner.TestUpdate();
            runner.TestFind();

            runner.TestDelete();
            runner.TestFind();

            runner.CloseDatabase();

            Console.ReadLine();
        }
    }

运行输出结果:



三,注意事项

如果你对常用的数据库命令语法还不太了解,可以参考如下链接:

// SQL syntax
//
Select : http://en.wikipedia.org/wiki/Select_(SQL)
Insert : http://en.wikipedia.org/wiki/Insert_(SQL)
Delete : http://en.wikipedia.org/wiki/Delete_(SQL)
Update : http://en.wikipedia.org/wiki/Update_(SQL)
Truncate : http://en.wikipedia.org/wiki/Truncate_(SQL)

由于各个数据库厂商有不同的数据库实现,导致数据库命令语法有一些细微的差别,因此需要特别注意。以下就列出一些常见的不同之处:

1,最大查询记录数

对于 SQL Server 使用 top 关键字。如:

select top 100 * from customer

对于 MySQL 使用 limit 关键字。如:

select * from customer limit 100

对于 Oracle 使用 rownum <=。如:

select * from customer where rownum <= 100

2,命令中出现的转义字符(详见 DatabaseHelper 类的 Validate 方法)

对于 SQL Server,单引号 ' 要用两个单引号 '' 替换;双引号 " 要用两个双引号 "" 替换;

对于 MySQL,单引号 ' 要用 \' 替换;反斜杠 \ 用于 \\ 替换。

ADO.NET扩展框架 Dapper支持多种主流的关系型数据库,如MySQL、SQL Server、SQLite、Oracle等,这使得它成为一个非常通用的数据库访问工具。这意味着你可以获得来自社区的帮助和支持,同时也可以参与到项目的开发中,为框架的发展做出贡献。PetaPoco 是一个简单快速的ORM工具,它基于Dapper,提供了额外的一些便利功能,如自动表创建、缓存和事务处理。:由于Dapper是一个轻量级的框架,它可能没有一些高级ORM框架提供的功能,如自动迁移、复杂的查询构造器、事务管理等。 阅读详情

相关推荐

C#数据库操作、加密解密与Excel处理综合类库设计

在现代企业级C#开发中,高效的数据交互、安全的信息保护与灵活的报表处理构成系统核心能力。ADO.NET作为.NET平台与数据库通信的基石,提供细粒度控制力与高性能数据访问支持;对称与非对称加密算法协同保障敏感数据在传输与存储中的机密性与完整性;而面对高频Excel导入导出场景,传统Interop已难以满足性能需求,基于Open XML的EPPlus等轻量方案成为主流选择。

weixin_42620563的博客 730

C#通用的数据库操作类(支持多种数据库)

通用的数据库操作类(支持多种数据库) 我们在软件开发过程中,数据库是一个永久不变的话题,但是根据软件架构与客户要求的不同我们会选择不同的数据库,在C#中不同数据库操作编写代码不尽相同,下面提供一种通用的数据库操作方案,只需要根据config的配置就可以动态的选择不同的数据库. using System; using System.Collections; using System...

DavidLiu的博客 1万+

ADO.NET数据库操作类库封装:高效、安全、可扩展的数据库访问

在当今的 IT 行业,数据操作是应用程序不可或缺的一部分。ADO.NET 作为一种允许.NET 应用程序与数据源交互的类库,提供了这一功能。它由多个核心组件构成,比如ConnectionCommand和DataSet。这些组件共同工作,提供了数据访问和操作的手段,支持从简单的数据查询到复杂的事务处理。在某些情况下,系统中可能需要创建自定义异常。这些异常提供了一种方式来表达特定应用程序逻辑的错误,使得异常处理代码可以针对这些自定义异常类型进行优化处理。

weixin_42230607的博客 701

C# 连接SQL Server数据库的几种方式--server+data source等方式

如何使用Connection对象连接数据库? 对于不同的.NET数据提供者,ADO.NET采用不同的Connection对象连接数据库。这些Connection对象为我们屏蔽了具体的实现细节,并提供了一种统一的实现方法。 Connection类有四种:SqlConnectio

jCuckoo的专栏 6万+

C#中的数据库访问类设计:面向对象的多态解决方案

在构建通用数据库访问类框架时,虽然我们努力抽象化了大部分通用功能,但不同数据库系统的特定需求和差异性意味着必须采用某种形式的扩展策略来处理这些特殊情况。子类化策略提供了一种灵活的方式来覆盖通用类的行为,允许为特定数据库实现特定的方法和属性,而不影响核心框架的通用性。设计模式通常分为以下三类:创建型模式:涉及到对象实例化的过程,包括单例、工厂方法、抽象工厂、建造者和原型等模式。结构型模式:关注如何组合类和对象以获得更大的结构,包括适配器、桥接、组合、装饰、外观、享元和代理模式。

weixin_29025501的博客 794

基于C#的高性能查询系统开发实战项目

在Code First模式下,每个C#类对应一个数据库表,属性对应字段,导航属性则表示外键关联。例如,以下是一个典型的订单与客户关系建模示例:set;set;set;// 导航属性:一对多关系set;set;set;set;// 外键set;// 导航属性set;上述代码中,virtual关键字用于启用延迟加载(Lazy Loading),即只有在实际访问导航属性时才会触发数据库查询。这种设计减少了不必要的数据加载,但需谨慎使用以防N+1查询问题(将在3.4节详述)。

weixin_42594419的博客 654

企业库中 DatabaseFactory.CreateDatabase 方法创建数据库实例的 逻辑过程

Enterprise Library 的 数据访问应用块中:   Microsoft.Practices.EnterpriseLibrary.Data.Database 抽象类派生出了以下三个数据库类      Microsoft.Practices.EnterpriseLibrary.Data.GenericDatabase      Microsoft.Practices.Ente

ppdtts520的专栏 2293

基于C#的数据库连接工厂DBFactory设计与实现

env];该读取器支持通过环境标识(dev/test/prod)切换不同连接配置,便于多环境部署。首先,我们需要定义一个顶层抽象接口,它将成为所有数据库适配器的契约基础。该接口应包含创建关键 ADO.NET 组件的方法,确保上层代码可以通过统一方式获取所需资源。此接口定义了四个核心方法:: 接收连接字符串,返回一个实现了的具体连接对象(如或: 创建与当前数据库兼容的命令对象。: 生成适合当前数据库参数语法的参数实例。

weixin_42186015的博客 840

General框架如何实现多数据库支持

关于用C#实现多数据库支持的方式,大家都会多少了解,本文从General框架的开发思路角度详细介绍General框架实现多数据库支持的方式,使更多的人了解General框架的底层实现并得到所需的相关知识。我在开发General框架之中,从网络中获取到了很多知识,对其他ORM框架亦有借鉴,其中借鉴最多的是NBear框架和NHibernate框架,我将从各处得到的开发思想融合进来,形成了我自己的开发方...

weixin_30721899的博客 159

C# WinForm中数据库创建与管理技术

SSMS提供了丰富的用户界面以及一系列用于管理SQL Server实例的工具。在开始使用SSMS之前,了解其界面布局和基本操作是关键。连接到服务器:启动SSMS时,首先需要连接到SQL Server实例。可以通过输入服务器名称、身份验证信息和其他连接属性来完成连接。对象资源管理器:这是SSMS的主要界面,列出了所有连接的服务器以及它们的对象,例如数据库、表、视图等。查询编辑器:这是编写和执行SQL查询的区域。您可以使用查询编辑器执行T-SQL语句、存储过程和其他脚本。

weixin_35750483的博客 663

c#实现简单工厂—数据库连接

c#实现简单工厂—数据库连接

FluentData 从入门到精通:C#.NET 数据访问最佳实践

FluentData:轻量级ORM框架简介 FluentData是一个基于Fluent API风格的微型ORM,支持SQL Server、MySQL等多种数据库,提供接近原生ADO.NET的性能。其核心特性包括:链式调用、事务管理、存储过程支持、灵活映射及批量操作。通过简单的配置即可实现CRUD操作,支持动态类型和强类型映射,无需修改现有业务实体。高级功能包括查询构建器、多结果集处理及自定义映射,并通过参数化查询防止SQL注入。此外,还提供批量操作、缓存和异步查询等性能优化方案,适合需要灵活控制SQL的开发

tangPHP的博客 843

C#工厂模式多数据库(实现SQL和MYSQL的切换)

利用C#工厂模式实现ASP>NET下的多数据库切换问题,代码的简单实现

ADO编程

在C#中,ADO.NET是微软提供的用于数据访问的核心技术,它是一组类的集合,用于与各种数据源(如SQL Server、Oracle、MySQL、Access等,在.NET Framework中负责数据访问的类库集,用于支持 数据库和XML等数据源进行访问,客户端可以连接数据源、并查询、添加、删除和更新等数据,是程序和数据源之间的桥梁,提供了面向对象的数据访问架构。

2301_76674261的博客 329

保姆级教程:在mmdetection中手动计算并可视化P、R、F1值(附完整代码)

本文提供了一份详细的mmdetection教程,指导开发者如何手动计算并可视化精确率(P)、召回率(R)和F1值。通过完整的代码示例和清晰的步骤说明,帮助用户深入理解目标检测模型的性能评估方法,特别适合需要精细分析模型表现的计算机视觉研究人员和工程师。

weixin_29038303的博客 400

【腹腔镜数据集】Cholec80+CholecSeg8k2020+Endoscapes2024

计算机辅助手术的发展旨在提高手术的正确性和安全性。然而,研究人员和工程师却面临着开发和训练更好算法所需的注释数据有限的问题。因此,同步定位与建图(SLAM)等基础算法的发展受到限制。基于Cholec80数据集,从Cholec80中的17个视频片段中提取了8,080个腹腔镜胆囊切除术图像帧,对图像进行注释并向公众发布。该数据集名为 CholecSeg8K。这些图像中的每一个都以十三个类别的像素级注释,这些类别通常在腹腔镜胆囊切除术中发现。

Toky_min的博客 2018

一篇文章带你搞懂ADO.NET和ORM框架的区别和使用

选择数据库连接技术时,没有绝对的"最佳选择",只有"最适合的选择"。在实际开发中,混合使用不同技术往往能获得最佳的效果平衡开发效率和运行性能。ADO.NET是.NET Framework提供的一组类,用于直接与数据库进行交互。它是最基础的数据库访问技术。在C#应用程序中,与数据库交互是核心功能之一。主要分为两种方式:原生数据库连接和ORM框架。核心建议: 从项目实际需求出发,不要过度设计,也不要盲目追求新技术。ORM框架将数据库表映射为C#类,让开发者可以使用面向对象的方式操作数据库。

轻风的博客 492

从 0 到 1,实战 Power BI 电商销售可视化看板全流程

本文详细介绍了从零开始使用Power BI构建电商销售可视化看板的全流程,涵盖数据准备、建模、可视化设计及高级功能应用。通过实战案例展示如何将复杂销售数据转化为直观图表,帮助电商从业者快速掌握销售趋势、热销产品和用户画像等关键信息,提升数据分析效率。

weixin_29061041的博客 485
上一篇: 关于SQL语句的自动生成
下一篇: c# 使用AForge.NET操作摄像头操作代码
cuoban
博客等级 码龄24年 239粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值