转:C#制作ORM映射学习笔记二 配置类及Sql语句生成类
在正式开始实现ORM之前还有一点准备工作需要完成,第一是实现一个配置类,这个很简单的就是通过静态变量来保存数据库的一些连接信息,等同于.net项目中的web.config的功能;第二需要设计实现一个sql语句的生成类来帮助生成sql语句,当前如果不实现这个类也不会影响orm的制作,之所以要做这么一个类主要有几个目的,1.减少sql语句中拼写错误的发生。2.统一解决防sql注入的问题。
下面分别说明一下这两个类的实现方式:
1.配置类DbConfig
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ORM
{
public class DbConfig
{ /// <summary>
/// 数据库连接信息
/// </summary>
public static string Host = "D:/C#/ORM/test.db"; /// <summary>
/// 数据库类型
/// </summary>
public static DbType Type = DbType.Sqlite; } public enum DbType
{
Sqlite,
Mysql,
SqlServer,
Oracle
}
}
2.sql语句的生成类Sql
using System;
using System.Collections;
using System.Text.RegularExpressions; namespace ORM
{
public class Sql
{
/// <summary>
/// sql语句
/// </summary>
private string sql; /// <summary>
/// 是否有where关键字
/// </summary>
private bool hasWhere; /// <summary>
/// 是否有order关键字
/// </summary>
private bool hasOrder; /// <summary>
/// 防sql注入
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static bool InjectionDefend(string value)
{
//网上随便找的,不确定是否有效
string SqlStr = @"and|or|exec|execute|insert|select|delete|update|alter|create|drop|count|\/\*|\*\/|chr|char|asc|mid|substring|master|truncate|declare|xp_cmdshell|restore|backup|net +user|net +localgroup +administrators";
try
{
if ((value != null) && (value != String.Empty))
{
//string str_Regex = @"\b(" + SqlStr + @")\b";
Regex Regex = new Regex(SqlStr, RegexOptions.IgnoreCase);
if (true == Regex.IsMatch(value))
{
return false;
}
}
}
catch
{
return false;
}
return true;
} /// <summary>
/// 构造函数
/// </summary>
public Sql()
{
sql = string.Empty;
hasWhere = false;
hasOrder = false;
} /// <summary>
/// 添加select
/// </summary>
/// <param name="column"></param>
/// <returns></returns>
public Sql Select(string column)
{
sql += ("SELECT " + column + " ");
return this;
} /// <summary>
/// 添加from
/// </summary>
/// <param name="Table"></param>
/// <returns></returns>
public Sql From(string Table)
{
sql += ("FROM " + Table + " ");
return this;
} /// <summary>
/// 添加where
/// </summary>
/// <param name="query"></param>
/// <param name="values"></param>
/// <returns></returns>
public Sql Where(string query, params object[] values)
{
if (!hasWhere)
{
sql += "WHERE ";
hasWhere = true;
}
else
{
sql += " AND ";
}
for (int i = ; i < values.Length; i++)
{
Regex r = new Regex(@"@\d+");
//bool类型需要特殊处理,不能直接用tostring转换,因为直接转换的结果为"True"或"False",而不是1和0
if (values[i] is bool)
{
bool value = bool.Parse(values[i].ToString());
query = r.Replace(query, (value ? "" : ""), );
continue;
}
else if (values[i].GetType().IsPrimitive)
{
query = r.Replace(query, values[i].ToString(), );
continue;
}
else if (values[i].GetType().IsEnum)
{
int intValue = (int)values[i];
query = r.Replace(query, intValue.ToString(), );
continue;
}
else
{
if (InjectionDefend(values[i].ToString()))
{
query = r.Replace(query, "\"" + values[i].ToString() + "\"", );
}
}
}
sql += query;
return this;
} /// <summary>
/// 在sql尾部插入任意sql语句
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public Sql Append(string sql, params object[] values)
{
for (int i = ; i < values.Length; i++)
{
Regex r = new Regex(@"@\d+");
if (values[i] is bool)
{
bool value = bool.Parse(values[i].ToString());
sql = r.Replace(sql, (value ? "" : ""), );
continue;
}
else if (values[i].GetType().IsPrimitive)
{
sql = r.Replace(sql, values[i].ToString(), );
continue;
}
else if (values[i].GetType().IsEnum)
{
int intValue = (int)values[i];
sql = r.Replace(sql, intValue.ToString(), );
continue;
}
else
{
if (InjectionDefend(values[i].ToString()))
{
sql = r.Replace(sql, "\"" + values[i].ToString() + "\"", );
}
}
}
this.sql += (" " + sql + " ");
return this;
} /// <summary>
/// 添加order
/// </summary>
/// <param name="column"></param>
/// <returns></returns>
public Sql OrderBy(string column)
{
if (!sql.EndsWith(" "))
{
sql += " ";
}
if (hasOrder)
{
sql += (", " + column);
}
else
{
sql += ("ORDER BY " + column);
}
return this;
} /// <summary>
/// 获取当前完整的sql语句
/// </summary>
/// <returns></returns>
public string GetSql()
{
return sql;
}
}
}
到这里ORM的前期准备工作就完成了,当然Sql实现的非常简单,像inner join、left join等sql语句的帮助生成函数都没有做,但是实现原理时相同的,如果需要可以自己仿照实现,当然也可以直接用Append函数添加sql语句,下篇开始正式介绍ORM的核心内容。
转:C#制作ORM映射学习笔记二 配置类及Sql语句生成类的更多相关文章
- 转:C#制作ORM映射学习笔记三 ORM映射实现
现在开始实现ORM的主体模块,首先需要在项目中新建一个类,命名为DbAccess,然后在项目的引用中添加两个dll,分别是MySql.Data.dll和System.Data.SQLite.dll,这 ...
- 转:C#制作ORM映射学习笔记一 自定义Attribute类
之前在做unity项目时发现只能用odbc连接数据库,感觉非常的麻烦,因为之前做web开发的时候用惯了ORM映射,所以我想在unity中也用一下ORM(虽然我知道出于性能的考虑这样做事不好的,不过自己 ...
- Java学习笔记二十四:Java中的Object类
Java中的Object类 一:什么是Object类: Object类是所有类的父类,相当于所有类的老祖宗,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object ...
- SQLServer 学习笔记之超详细基础SQL语句 Part 8
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 7------------------- --触发器str_trigge ...
- SQLServer 学习笔记之超详细基础SQL语句 Part 6
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 5------------------- 28 聚合函数 --求平均分 ...
- SQLServer 学习笔记之超详细基础SQL语句 Part 12(The End)
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 11------------------- 现在,我们希望从 " ...
- SQLServer 学习笔记之超详细基础SQL语句 Part 11
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 10------------------- DECLARE @myavg ...
- SQLServer 学习笔记之超详细基础SQL语句 Part 10
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 9------------------- 删除约束的语法 ALTER T ...
- SQLServer 学习笔记之超详细基础SQL语句 Part 9
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 8------------------- 3 范式的概念 第一范式的目标 ...
随机推荐
- Django runserver支持https
创建自签名ssl证书 1.下载软件openssl-0.9.8k_WIN32 2.解压后进入bin目录,双击打开openssl.exe,依次运行如下命令 genrsa -des3 -out server ...
- A * B Problem Plus HDU - 1402 (FFT)
A * B Problem Plus HDU - 1402 (FFT) Calculate A * B. InputEach line will contain two integers A and ...
- B1019 数字黑洞 (20分)
B1019 数字黑洞 (20分) 给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字.一直重复 ...
- A1009 Product of Polynomials (25)(25 分)
A1009 Product of Polynomials (25)(25 分) This time, you are supposed to find A*B where A and B are tw ...
- IOS开发学习笔记011-xcode使用技巧
xcode使用技巧 1.自动生成类 2.断点调试 3.代码段保存 4.注释标记 1.新建类,自动生成两个文件和基本结构 第一步 第二步,选择新建一个类,而不是一个源文件 第三步,书写类名一级自己要 ...
- phpmyadmin4.8.1后台getshell
phpmyadmin4.8.1后台getshell 包含文件进行getshell 姿势: ① 建立数据库的,新建表,字段名为一句话木马. 会生成对应的数据库文件,相应文件的路径查看 select @@ ...
- Django中从本地上传excel文件并将数据存储到数据库
Django中从本地上传excel文件并将数据存储到数据库 一.前端界面 <div class="page-container"> <form action=&q ...
- linux系统带宽监测脚本
服务器可能经常遇到服务器出带宽跑满,不知如何查询被哪个进程占用的情况,有一款开源的英文软件iftop功能比较强大可以查询相关信息,可能刚接触linux系统的朋友不太会使用,在此写了一个功能比较简单无需 ...
- CSA Round 84 Mahattan Center
题目 题目大意 给定平面上的 $n$ 个点和常数 $k$,求 $x$ 轴上的点 $p$ 到 $n$ 个点中距其最近的 $k$ 个点的距离之和的最小值.两点之间的距离定义为曼哈顿距离. 数据范围 $1\ ...
- Cmake——CMake+SVN或Hg生成版本号
CMake+SVN或Hg生成版本号 原来的CMake需要用shell脚本生成SVN版本号,再作为cmake参数传入.CMake调用脚本示例: #!/bin/sh # cmake.sh ServerCo ...