原文链接:X-Mod by: lobster
有时候会遇到一些不需要使用实体模型的场景,譬如单纯的读取某些第三方提供的数据表,不可能每次都要生成相应的实体对数据库进行操作,所以为了适应此场景,无实体操作数据库使用XCode组件也一样便捷。
核心点,为了强调能适配所有数据库,一般情况下不推荐直接编写SQL语句,不然到时候切换数据库的时候,底层逻辑又得适配一遍。那废话不多说,直接上代码
目录
- 1.App.config和appsetting.json方式
- 2.代码注入
- 3.进阶技巧
- 1.查询
- 2.新增与修改
- 3.删除
数据库连接方式
1. App.config和appsetting.json方式
这个看官方文档 https://newlifex.com/xcode/setting 就好,写得非常详细,所以不细写了,主要代码如下:
<connectionStrings>
<add name="SQLite" connectionString="Data Source=test.db;" providerName="Sqlite" />
<add name="MySql" connectionString="Server=.;Port=3306;Database=mysql;Uid=root;Pwd=;NameFormat=Upper" providerName="MySql.Data.MySqlClient" />
</connectionStrings>
"ConnectionStrings": {
"SQLite": {
"connectionString": "Data Source=test.db;",
"providerNamee": "Sqlite"
},
"MySql": {
"connectionString": "Server=.;Port=3306;Database=mysql;Uid=root;Pwd=;",
"providerName": "MySql.Data.MySqlClient"
}
}
2. 代码注入
DAL.AddConnStr("SQLite", "Data Source=test.db;provider=sqlite", null, null);
SQLite是ConnName,可以是任意名称,后面会用到
Data Source=test.db;provider=sqlite 这个字符串指定了sqlite的连接和数据库类型,这么写,你的变量是多种数据库连接都行,譬如我想连接SQLServer,就改成:
DAL.AddConnStr("SQLite", "Data Source=.;Initial Catalog=userDB;Trusted_Connection=yes;provider=mssql", null, null);
这样就可以通杀所有数据库了,provider类型主要有以下几种:
Sqlserver(注意要小写)
- mssql
- sqlserver
- sqlclient
- system.data.sqlclient
SQLite
- sqlite
MySql
- mysql
- mysql.data.mysqlclient
Oracle
- oracle
- oracleclient
PostgreSQL
- postgresql
- npgsql
其他不常用的就不举例了
已经注入数据库连接就可以创建了
var dal = DAL.Create("SQLite"); //SQLite是可以任意的名字,当然要跟前面一致
有了这个dal就可以各种操作数据库了
3. 进阶技巧
譬如我想获取某个表结构
var dal = DAL.Create("SQLite");
var tables = dal.Tables;//获取所有表
var createTableSql = dal.GetCreateTableSql(tables.ToArray());//如果表太多慎用
var table = tables.Find(x => x.Name == "user");//获取user表
var userTableSql = dal.GetCreateTableSql(table);//获取user表的创建语句
查询表数据
var sb = new SelectBuilder { Table = "User", Where = "UserId=1" };
var dt = dal.Query(sb);
//等同于,但是推荐前者,因为对所有数据库是适配的
dt = dal.Query("Select * From User Where UserId=1");
拿到dt之后就可以编写各种导入导出,保存或者其他的逻辑处理了
有些经典的使用案例是,譬如我拿了A库往B库导数据,这样可以使用以下操作:
DAL.AddConnStr("BakDB", "Data Source=User.db;provider=sqlite", null, null);
DAL.AddConnStr("ToBakDB", "Data Source=.;Initial Catalog=userDB;Trusted_Connection=yes;provider=mssql", null, null);
var dal = DAL.Create("BakDB");
var toDal = DAL.Create("ToBakDB");
var table = dal.Tables.Find(x => x.Name == "User");
//把自增键去掉,不然会影响效率,作为备份库,自增键也不是很重要
var col = table.Columns.FirstOrDefault(e => e.Identity);
if (col != null)
{
col.Identity = false;
}
var sb = new SelectBuilder { Table = table.Name, Where = "Age>18" };
var dt = dal.Query(sb);
toDal.SetTables(table);//先确保导入库有没有创建User表
//批量导入到Sqlserver数据库
toDal.Session.Insert(table, table.Columns.ToArray(), dt.Cast<IModel>());
简单查询
1. 查询
//重点推荐SelectBuilder类,第一兼容性好,第二可以避免打错
var sb = new SelectBuilder { Table = table.Name, Where = "Age>18" };
var dt = dal.Query(sb);
//支持参数化查询
sb = new SelectBuilder { Table = table.Name, Where = "Age>@age" };
sb.Parameters = new List<IDataParameter> { dal.Db.CreateParameter("@age", 18) };//这里多多少少有点不太优雅,可以升级一下
dt = dal.Query(sb);
//只取五条,记得排序,聪明的小伙伴应该都能不看我的写案例,SelectBuilder已经提供
sb.OrderBy = " id asc ";
dt = dal.Query(sb, 0, 5);
//这里为了省事,都是来源于官方的测试案例,请忽略使用了实体,把语句都按上面的逻辑改一样可以
//支持分页
var list = dal.Query<User>("select * from user where name=@name", new { Name = "admin" }, new PageParameter { PageIndex = 1, PageSize = 20 }).ToList();
2. 新增与修改
//这个有点不符合标题,但是实体的结构是比较清晰的
var user = new User { Id = Rand.Next(), Name = Rand.NextString(8) };
dal.Insert(user, "user");
//这是无实体的操作,其实都是一样的原理
dal.Insert(new { Id = Rand.Next(), Name = Rand.NextString(8) }, "user");
//修改
dal.Update(new { enable = true }, new { id = user.Id }, "user");
3. 删除
//就是这么简单
dal.Delete("user", new { id = user.Id });
Enjoy~ _