mysql数据迁移到sqlserver_一个通用数据库操作组件DBUtil(c#)、支持SqlServer、Oracle、Mysql、postgres、SQLITE...

这是一个.net下操作数据库(结构数据库)的工具类,支持sqlserver、oracle、mysql、postgres、sqlite、access等常见数据库。

注意:它并不是一个orm工具(常见的orm框架如:EF、Dapper等)。

2.1 引入DBUtil依赖

1. 首先打开vs(推荐vs2019),新建控制台应用程序(.net framework)

2. 添加依赖方法1:打开工具>NuGet包管理器>程序包管理器控制台,输入:

Install-Package DBUtil -Version 1.0.0

3. 添加依赖方法2:使用可视化的nuget管理窗口搜索“DBUtil”,选择安装即可!

2.2 准备数据库

自行准备吧。

2.3 增删改查代码

    
DBUtil.IDbAccess iDb = DBUtil.IDBFactory.CreateIDB("Data Source=.;Initial Catalog=JACKOA;User ID=sa;Password=xx;","SQLSERVER");


Console.WriteLine(iDb.GetFirstColumnString("select Name from SysUser"));


Console.WriteLine(iDb.ExecuteSql("updatetest set CaseNo=CaseNo+'e'"));


Console.WriteLine(iDb.ExecuteSql("update test set CaseNo=@case",newIDataParameter[] { iDb.CreatePara("case","123") }));


Hashtable ht = newSystem.Collections.Hashtable();
ht.Add("CaseNo", "456");
ht.Add("Name", "ji");
Console.WriteLine(iDb.AddData("test",ht));


Hashtable ht2 = newSystem.Collections.Hashtable();
ht2.Add("Name", "jiko");
Console.WriteLine(iDb.UpdateData("test",ht2," and CaseNo='123'"));


Console.WriteLine(iDb.DeleteTableRow("test"," and id=11"));


Console.WriteLine(iDb.GetDataSet("select * from sysuser").Tables[0].Rows.Count);

    在这个组件设计中,所有的数据库操作方法都被集成在了一个对象上:IDbAccess。它是一个接口,定义了公共的数据库访问方法,如:增删改查、事务控制等。具体的实现由SqlServerIDbAccess、MySqlIDbAccess、PostgreSqlIDbAccess、OracleIDbAccess、AccessIDbAccess、SQLiteIDbAccess等实现,它们分别对应着一种数据库。

    在所有的数据库操作之前,都必须先创建IDbAccess对象,创建的方法如下:

DBUtil.IDbAccess iDb = DBUtil.IDBFactory.CreateIDB("Data Source=.;Initial Catalog=JACKOA;User ID=sa;Password=xx;","SQLSERVER");

你所需的参数有两个:

1. 数据库的类型字符串

    SQLSERVER、ORACLE、MYSQL、POSTGRESQL、ACCESS、SQLITE

2. 数据库连接字符串

参考以下示例:

SQLSERVER: Data Source=.;Initial Catalog=JACKOA;User ID=sa;Password=xx;
ORACLE: Data Source=ORCLmyvm2;Password=sys123;User ID=sys;DBA Privilege=SYSDBA;
MYSQL: Data Source=localhost;Initial Catalog=test;User ID=root;Password=xxxx;
POSTGRESQL: Server=localhost;Port=5432;UserId=postgres;Password=xxxx;Database=test
ACCESS: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=G:\work\Multiplan.mdb;
ACCESS: Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Administrator\Desktop\demo.accdb;
 SQLITE: Data Source=f:\demo.db;

3. sqlite数据库

sqlite数据库存储是单个文件存储的,所以在访问之前你需要先创建它,参照如下代码:


DBUtil.IDBFactory.CreateSQLiteDB("d:\\demo.db");

string str = DBUtil.IDBFactory.GetSQLiteConnectionString("d:\\demo.db");

DBUtil.IDbAccess iDb = DBUtil.IDBFactory.CreateIDB(str, "SQLITE");

iDb.ExecuteSql(@"
create table test(
id int primary key,
name varchar(50)
);
insert into test values(1,'张三');
insert into test values(2,'李四');
");

string name = iDb.GetFirstColumnString("select name from test");
Console.WriteLine(name);

四、增删改查方法

4.1 增加数据(AddData)

DBUtil.IDbAccess iDb = DBUtil.IDBFactory.CreateIDB(@"Data Source=d:\demo.db;", "SQLITE");
iDb.ExecuteSql(@"
create table test2(
id int primary key,
name varchar(50),
createtime timestamp,
largefield blob
)");
Hashtable ht = new Hashtable();
ht.Add("id", 1);
ht.Add("name", "李四");
ht.Add("createtime", DateTime.Now);
ht.Add("largefield", System.Text.Encoding.UTF8.GetBytes("我的密码是:xxxxxx"));
iDb.AddData("test2", ht);
Console.WriteLine(iDb.GetFirstColumnString("select name from test2"));
Console.WriteLine(iDb.GetFirstColumnString("select createtime from test2")); Console.WriteLine(System.Text.Encoding.UTF8.GetString(iDb.GetFirstColumn("select largefield from test2") as byte[]));
Console.WriteLine("ok");
Console.ReadLine();

4.2 删除数据(DeleteTableRow)

iDb.DeleteTableRow("test2", "and id=1");

4.3 更新数据(UpdateData)

Hashtable ht = new Hashtable();
ht.Add("name", "王五");
iDb.UpdateData("test2", ht, "and id=1");

4.4 更新或添加数据(UpdateOrAdd)

Hashtable ht = new Hashtable();
ht.Add("id", 1);
ht.Add("name", "王五");
iDb.UpdateOrAdd("test2", ht, "and id=1");

4.5 查询数据

4.5.1 获取第一个值

string str=iDb.GetFirstColumnString("select name from test2");
object obj= iDb.GetFirstColumnString("select largefield from test2");

4.5.2 获取表


DataTable dt = iDb.GetDataTable("select * from test2");

DataSet ds = iDb.GetDataSet("select * from test2;select * from test2;");

4.6 参数化sql语句

iDbAccess的大部分方法都是直接参数化查询的,参照如下代码:

DataTable dt = iDb.GetDataTable(string.Format("select * from test2 where name like {0}", iDb.paraPrefix + "name"), new IDbDataParameter[] {
iDb.CreatePara("name","%小%")
});

每个数据库的分页方法不同,比如:

sqlserver:top分页、row_number() over()分页、fetch分页

mysql:limit分页

等等。。。

在这个组件中设计为:根据指定的查询语句和分页参数生成分页的查询语句,参照以下代码:

DBUtil.IDbAccess iDb = DBUtil.IDBFactory.CreateIDB(@"Data Source=localhost;Initial Catalog=imgserver2;User ID=root;Password=123456;", "MYSQL");
string selectSql = "select * from test2";
string orderSql = "order by id desc";
int pageSize = 10;
int pageIndex = 1;
string sqlFinal = iDb.GetSqlForPageSize(selectSql, orderSql, pageSize, pageIndex);
Console.WriteLine(sqlFinal);
iDb.BeginTrans();
IDbTransaction tran= iDb.tran;
iDb.Commit();
iDb.Rollback();
bool b = iDb.IsTran;
DBUtil.IDbAccess iDb = DBUtil.IDBFactory.CreateIDB(@"Data Source=localhost;Initial Catalog=imgserver2;User ID=root;Password=1234567;", "MYSQL");
DBUtil.Result res = iDb.OpenTest();
if (res.Success)
{
Console.WriteLine("连接成功!");
}
else
{
Console.WriteLine("连接失败:" + res.Data);
}
Console.WriteLine("ok");
Console.ReadLine();

默认情况下,每进行一次数据库的操作都会打开和关闭数据库。在密集的操作下这种方法并不推荐。

可以通过IsKeepConnect 属性使数据的链接一直保持

iDb.IsKeepConnect = true;
string filter=iDb.GetDateFilter("end", "2016-12-1", "2017-01-01", true, false);
bool b=iDb.JudgeTableOrViewExist("test");
bool b2 = iDb.JudgeColumnExist("test", "id");

11.1 说明

数据库表的ID的生成是一个常见的问题,常见的有表字段设置为自增、设为序列、程序控制ID生成。下面分别说说这三种模式:

1)  表字段自增:在sqlserver中有个致命的缺陷就是一旦遇到数据迁移,那么这些ID都将重新生成,如果其他的表引用了这个 ID,后果可想而知。在mysql中有办法解决这个问题,但是这种办法最根本的缺陷在于:“不能在数据插入到表之前获取对应的ID”,试想一下:如果你在插入数据之前还要用到这个ID做其他的工作该怎么办?

2) 序列法:在oracle中可以新建一个序列控制ID的生成(sqlserver中好像也开始支持了),这种方法其实已经解决了绝大部分问题了,但是在每次生成ID之前你还是需要访问一遍数据库,如果需要批量生成的时候性能肯定受影响(不知道序列支不支持批量生成)。

3) 程序控制ID生成法:这个组件是用的这种方法生成ID的,它可以解决上述提到的问题。它的原理是:

    你在程序中通过指定表名和字段名来获取ID,程序中进行判断当前内存中是否缓存了这个ID,如果缓存了ID的话就直接自增并返回,如果没有缓存ID的话就通过表名和字段名去数据库里面去查找最大的ID,然后自增并返回。

    优点:

        1. ID可以随时生成,不用非得向表中插入数据。

        2. 在批量生成ID时,性能很高(完全碾压从数据库生成的)

        3. 可以针对一个表的多个字段进行生成(一般用不到)

        4. 兼容各种数据库,你不用再为ID配置各种生成策略

    缺点:

        1. 因为ID的生成缓存到了程序中,所以针对一张表必须保证只有一个服务器会进行ID的生成,否则会出现重复的ID

    注意:

        有人可能已经注意到问题,分布式的ID是怎么生成(1个数据库,多个服务器)?这里我提供一个思路,但是这个组件中并没有实现:针对不同的服务器预先设置ID的前缀,比如服务器A的ID 生成从1开始,服务器B的ID 生成从100 0000开始,这样就不会重叠了。如果担心数据量太大,那么你就不能在用int类型的ID了,你应该使用字符串唯一编号。这个组件中也实现了唯一编号的生成控制,原理和ID一样的都是在程序中缓存,只不过使用的时候要配置编号生成的规则...

11.2 扩展说明

    这个组件默认使用的生成控制器是SimpleIDSNOManager,如果需要扩展(比如使用redis控制生成等)可以自定义实现IDSNOManager,并在应用程序启动时书写:IDBFactory. IDSNOManage= new 自定义实现();

11.3 使用方法

  11.3.1 ID操作

     
int id = iDb.IDSNOManager.NewID(iDb, "test", "id");

int id2 = iDb.IDSNOManager.NewIDForce(iDb, "test", "id");

iDb.IDSNOManager.ResetID("test", "id", 1);

iDb.IDSNOManager.ShowCurrentIDs(null,null);

  11.3.2 自动编号操作

   
      iDb.IDSNOManager.NewSNO(iDb, "test", "caseno", new List(){new SerialChunk("prefix_GWFW","Text[GWFW][4]"),new SerialChunk("RiQiCtr","DateTime[yyyyMMdd][8][incycle]"),new SerialChunk("SerialNo","SerialNo[1,1,5,,day]")
      });
    List<string[]> li = iDb.IDSNOManager.ShowCurrentSNOs(null, null, null);
    List li = new List();
    li.Add(new SerialChunk(“prefix_GWFW”,null));
    li.Add(new SerialChunk(“RiQiCtr”,null));
    li.Add(new SerialChunk(“SerialNo”,null));
    iDb.IDSNOManager.ResetSNO(tableName, colName, li, null);
    iDb.IDSNOManager.NewSNO(iDb, "test", "caseno", new List(){new SerialChunk("prefix_GWFW","Text[GWFW][4]"),new SerialChunk("RiQiCtr","DateTime[yyyyMMdd][8][incycle]"),new SerialChunk("SerialNo","SerialNo[1,1,5,,day]")
    });
    List<string[]> li = iDb.IDSNOManager.ShowCurrentSNOs(null, null, null);
    List li = new List();
    li.Add(new SerialChunk(“prefix_GWFW”,null));
    li.Add(new SerialChunk(“RiQiCtr”,null));
    li.Add(new SerialChunk(“SerialNo”,null));
    iDb.IDSNOManager.ResetSNO(tableName, colName, li, null);

bd3f153d4fa237e262541af50a3c5408.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【H.264/AVC视频编解码技术】第二章【H264码流分析】

H264码流分层 NAL层,视频数据网络抽象层,作用是控制二进制数据的传输,主要用于网络传输。 VCL层,视频数据编码层。 VCL结构关系 NALU NAL Header (1B)+ RBSP H264码流中NALU sps pps IDR帧的理解 概念 什么是NALU? H264码流可以分为两层,VCL层和NAL层,NAL的全称…

android相册管理,Piktures - 最优雅的相册管理 - Android 应用 - 【最美应用】

多维度管理&#xff0c;美到每一个细节Piktures 的优雅&#xff0c;首先在于其浏览、管理的维度设计上。Android 原生相册最为人所诟病的就是其乱糟糟的浏览体验&#xff0c;所有带图片的文件夹都毫无章法地直接呈现。而 Piktures 则做了全面的改进。左滑即开打开文件夹管理模式…

【H264码流分析】 SPS/PPS/Slice Header

SPS中相关 H264 Profile 对视频压缩特性的描述&#xff0c;Profile越高&#xff0c;就说明采用了越高级的压缩特性 H264 Level Level是对视频的描述,Levrl越高&#xff0c;视频的码率&#xff0c;分辨率&#xff0c;fps越高 分辨率 帧相关 帧率计算 PPS Slice Header

access update语句执行_SQL Server与Access数据库sql语法十大差异

本文总结了SQL Server与Access数据库sql语法的十大差异。ACCESS结构简单容易处理&#xff0c;而且也能满足多数的应用程序要求&#xff0c;也是初学者的试牛刀。随着时间的推移&#xff0c;大多数数据库应用程序都会发展&#xff0c;变得更复杂&#xff0c;并且需要支持更多用户…

junit测试起名字规则_如何在JUnit 5中替换规则

junit测试起名字规则最近发布的JUnit 5&#xff08;又名JUnit Lambda&#xff09; alpha发行版引起了我的兴趣&#xff0c;在浏览文档时&#xff0c;我注意到规则以及运行程序和类规则都消失了。 根据文档&#xff0c;这些部分竞争的概念已被单个一致的扩展模型取代。 多年来&…

android照片编辑软件,照片编辑免费软件下载-照片编辑软件app下载 v7.45最新版_5577安卓网...

照片编辑免费软件app下载&#xff0c;提供给你全新的图片处理工具&#xff0c;这是软件包含了丰富的功能内容&#xff0c;软件一键即可轻松对各种照片組合、编辑和拼貼&#xff0c;那么有需要图片处理的用户下载该app使用吧&#xff01;【软件特色】【 拼图编辑&#xff1a;强大…

扩展 junit 框架_JUnit 5 –扩展模型

扩展 junit 框架我们已经对Java最普遍的测试框架的下一个版本了解很多。 现在&#xff0c;让我们看一下JUnit 5扩展模型&#xff0c;该模型将允许库和框架将自己的实现添加到JUnit中。 总览 建立 基本 建筑 扩展模型 条件 注射 … 在新兴的《 JUnit 5用户指南》中可以找…

【WebRTC---入门篇】(十二)WebRTC传输协议

浏览器协议栈(左图传统HTTP 右图WebRTC) RTP/SRTP RTP是未加密的数据,SRTP是加密后的数据。 RTP协议

springcloud官方文档_通俗易懂!Spring Cloud简介:官方文档翻译版

什么是微服务&#xff1f;"微服务架构是一种架构模式&#xff0c;它提倡将单一应用程序划分成一组小的服务&#xff0c;服务之间相互协调、互相配合&#xff0c;为用户提供最终价值。每个服务运行在其独立的进程中&#xff0c;服务和服务之间采用轻量级的通信机制相互沟通…

【RTMP协议分析与抓包实测】

传输协议 RTMP基本通讯 RTMP基于TCP之上传输 TCP三次握手,相关文章链接&#xff0c;TCP三次握手流程 进行握手 c- --> s 发送c0c1 c ---> s 发送c2 s ---> c 发送s0s1s2 建立RTMP连接 真实建立连接的场景 c- --> s RTMP发送connect建立连接 s ---> c 协商(滑动…

【WebRTC---入门篇】(十三)WebRTC音视频数据采集

音视频采集API false表示不采集,true表示采集 WebRTC API适配 获取音视频设备的访问权限 通过 return navigator.mediaDevices.enumerateDevices();/*返回一个promise,为了获取音视频的权限*/ 视频约束

app登录界面背景 css_计算机毕业设计中Java web实现简登录页面(MyBatis+jsp+servlet+html+css+javascript)...

点击上方“蓝字”&#xff0c;关注我们.本文利用MyBatisjspservlethtmlcssjavascript实现了一个简单的登录页面。对用户输入的用户名和密码就行校验&#xff0c;校验通过则登录成功&#xff0c;密码和用户信息保存在mysql表中&#xff0c;通过MyBatis访问(MyBatis相关知识可参考…

android strm,Android 关于so文件的随记

1.背景&#xff1a;项目中要集成商汤的活体检测sdk&#xff0c;2.遇到的问题&#xff1a;商汤提供的demo 可以正常运行&#xff0c;但是将sdk集成至项目中时一直报错&#xff0c;但是商汤侧却没办法提供具体的报错原因3.解决问题&#xff1a;反编译商汤的源码发现&#xff0c;报…

【WebRTC---入门篇】(十五)WebRTC信令服务器实现

如何使用socket.io发送消息 io代表整个节点

activiti高亮显示图片_如今透明LED显示屏成为广告橱窗,它们之间有什么关联?...

如今我们在街道行走时&#xff0c;我们就会看到各种玻璃橱窗&#xff0c;这是商家想利用橱窗进行不同产品宣传角度。其实无论是海报、灯箱或是实物展示&#xff0c;这些都是商家通过橱窗广告进行来吸引消费者&#xff0c;而现在是5G时代到来使橱窗数字化营销成为了一种新的趋势…

theme editor android,谷歌宣布将于下月停用 Material Theme Editor

使用 Material Theme Editor&#xff0c;开发人员可创建和自定义 Material 主题&#xff0c;包括颜色、形状、版式等等。在 Material Theme Editor 中&#xff0c;可根据不同部分依次选择颜色&#xff0c;并应用于所有组件&#xff0c;还可调整对比度&#xff0c;根据单一颜色自…

【WebRTC---入门篇】(十六)端对端1V1传输基本流程

RTCPeerConnection 媒体协商 setLocalDescription方法 ,收集所有候选者。 setRemoteDescription方法, 放到远端的描述槽中。 协商状态变化

pytorch dataset_【小白学PyTorch】16.TF2读取图片的方法

<>扩展之tensorflow2.0 | 15 TF2实现一个简单的服装分类任务小白学PyTorch | 14 tensorboardX可视化教程小白学PyTorch | 13 EfficientNet详解及PyTorch实现小白学PyTorch | 12 SENet详解及PyTorch实现小白学PyTorch | 11 MobileNet详解及PyTorch实现小白学PyTorch | 10 …

【WebRTC---入门篇】(十七)实现1V1音视频实时互动直播系统

STUN/TURN服务器搭建 详细搭建过程 RTCPeerConnection