c#调用 数据库 底层如何封装,我这么写行吗?请指教

好奇都是要学的 2019-05-24 03:27:37
以前写法 参数化,

select * from 表 where 列=@a and 列=@b
dbase.AddInParameter(cmd, "@a", DbType.String, a);
dbase.AddInParameter(cmd, "@b", DbType.String, b);

然后调用公共类abc(SqlParameter[] sqlpam) 返回数据源
每个程序猿 都得写 dbase.AddInParameter(cmd, "@a", DbType.String, a); 如果是UPDATE 或者insert的时候 更麻烦。 有没有什么办法把
dbase.AddInParameter(cmd, "@a", DbType.String, a); 也封装到 公共类里。

比如 程序猿就写

string str=select * from 表 where 列=@a and 列=@b

调用公共类abc(str,参数A,参数B)
abc类里写

public static DataSet abc(object strSql,object a=null,object b=null,object c=null,object d=null,object e=null,object f=null,object g=null ......)
{
DbCommand cmd = Public.dbase.GetSqlStringCommand(strSql);
Public.dbase.AddInParameter(cmd, "@a", GetDbType(a), a);
Public.dbase.AddInParameter(cmd, "@b", GetDbType(b), b);
Public.dbase.AddInParameter(cmd, "@c", GetDbType(c), c);
Public.dbase.AddInParameter(cmd, "@d", GetDbType(d), d);
Public.dbase.AddInParameter(cmd, "@e", GetDbType(e),e);
Public.dbase.AddInParameter(cmd, "@f", GetDbType(f), f);
Public.dbase.AddInParameter(cmd, "@g", GetDbType(g),g);
............

try
{
DataSet dst = db.ExecuteDataSet(cmd);
return dst;
}
catch
{
return null;
}
}

private DbType GetDbType(object Type)
{
if(Type.GetType().ToString()=="string")
{
retrun DbType.String;
}
.....
}

这样程序猿 就可以调用公共的 abc了。 谁有更好的办法。 请指教
...全文
532 38 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
闭包客 2019-06-10
  • 打赏
  • 举报
回复
我写的模块调用方法如下:
sql.Exec("select * from test where c1 like '''?' and c2 = ? and c3 = ?", 1, 2);
不是拼接 SQL 的,使用的参数化查询,AddInParameter 方法已经在模块里面封装。 有时间我开源出来。
闭包客 2019-06-10
  • 打赏
  • 举报
回复
你的问题很好,同样的问题我遇到过。 我不是通过反射来做的,我是通过隐式转换来做的。
闭包客 2019-06-10
  • 打赏
  • 举报
回复
更正一下,在单引号里面,不是双引号。
闭包客 2019-06-10
  • 打赏
  • 举报
回复
引用 36 楼 好奇都是要学的 的回复:
[quote=引用 35 楼 闭包客 的回复:] 我写的模块调用方法如下:
sql.Exec("select * from test where c1 like '''?' and c2 = ? and c3 = ?", 1, 2);
不是拼接 SQL 的,使用的参数化查询,AddInParameter 方法已经在模块里面封装。 有时间我开源出来。
C3没给参数哦。 这个得看你 Exec里面怎么写的, [/quote] 你看得很细心,这个是我的一个测试用例,c1 的 ? 号是在双引号里面,不是作为参数占位符。
  • 打赏
  • 举报
回复
引用 35 楼 闭包客 的回复:
我写的模块调用方法如下:
sql.Exec("select * from test where c1 like '''?' and c2 = ? and c3 = ?", 1, 2);
不是拼接 SQL 的,使用的参数化查询,AddInParameter 方法已经在模块里面封装。 有时间我开源出来。
C3没给参数哦。 这个得看你 Exec里面怎么写的,
  • 打赏
  • 举报
回复
引用 32 楼 ZhuCheng Xie 的回复:
写几个实体类还会比去DataSet里取数据还麻烦吗? 至于sql注入,都是业务层去处理这个,因为只有字符串格式的输入数据才有可能被注入 而业务层是知道自己所需要的数据的格式,比如人的姓名,所以含有各种引号分号的可以被检查出来
没回答到正点上, 现在讨论的不是实体类 和dataset方便问题, 是如何能反射SqlParameter 集合 第二,SQL注入, 品字符才会有, 如果是参数化是不存在的。 检测字符更是错误的防注入方式
ZhuCheng Xie 2019-06-05
  • 打赏
  • 举报
回复
写几个实体类还会比去DataSet里取数据还麻烦吗? 至于sql注入,都是业务层去处理这个,因为只有字符串格式的输入数据才有可能被注入 而业务层是知道自己所需要的数据的格式,比如人的姓名,所以含有各种引号分号的可以被检查出来
SinGooCMS 2019-06-04
  • 打赏
  • 举报
回复
去下载个开源的ORM,拿来用就好了
tone1128 2019-06-03
  • 打赏
  • 举报
回复
网上直接百度下 数据库公共类
mk_lucifer 2019-06-03
  • 打赏
  • 举报
回复
linq 目的是数据访问层几乎不用修改直接移植到其他数据库上, 本质上只是 linq 在执行过程中翻译成SQL语句执行,包括Update Insert,delete都是如此, 我没说这东西有多好,但是没用过请别吓BB。。。 linq只是代替SQL语句,而且是所有操作都是面向实体类的,不是System.Data.DataSet,数据访问层一样需要写。。。 实体模型很多,这东西20年前都有了C#没出生都存在,像这种实体模型, Entity[] result=EntityQuery.Select(string where)早都玩烂的东西,你还在纠结不觉得可笑么???
mk_lucifer 2019-06-03
  • 打赏
  • 举报
回复
说了半天不就想写个数据访问层,BB一大堆,不知道你在BB啥。。。11年还在纠结这些玩意,也是服了。。
  • 打赏
  • 举报
回复
引用 11 楼 mk_lucifer 的回复:
实体模型,最直接的 linq to sql, linq to Entity 如果你对微软信不过,可以自己写实体模型框架,其实道理很简单,这东西现在都这么标准了,还有啥可纠结的。。。。 如果你是SQL SERVER 数据库,直接研究下linq to sql ,用多了你就知道他的好了。。如果不是sql server可以安装插件,常见的数据库都支持。。 如果你都不信任,linq也不过是个表达式的语法糖,微软也提供了linq的相关接口,自己实现实体和linq表达式,到 SQL 语句的转换,反正你是要封装的,一封到底起不更好。。。
MVVM很适合你,加油。 LINQ 也可以做各种财务报表。
  • 打赏
  • 举报
回复
引用 18 楼 好奇都是要学的 的回复:
[quote=引用 17 楼 mk_lucifer 的回复:] [quote=引用 12 楼 好奇都是要学的 的回复:] [quote=引用 11 楼 mk_lucifer 的回复:] 实体模型,最直接的 linq to sql, linq to Entity 如果你对微软信不过,可以自己写实体模型框架,其实道理很简单,这东西现在都这么标准了,还有啥可纠结的。。。。 如果你是SQL SERVER 数据库,直接研究下linq to sql ,用多了你就知道他的好了。。如果不是sql server可以安装插件,常见的数据库都支持。。 如果你都不信任,linq也不过是个表达式的语法糖,微软也提供了linq的相关接口,自己实现实体和linq表达式,到 SQL 语句的转换,反正你是要封装的,一封到底起不更好。。。
你回答的 和我问的是一个事吗? 解决办法N多种, 我只是说了其中一种,并且说如何优化的更好 , 而你却告诉我换轮子。 这就跟我说我想吃饭, 你告诉我饭不好吃, 吃馒头吧,一样能吃饱。 还省钱一样。 linq to sql 在查询报表的时候能用上? 简单查询 可以。 来个10万条的统计查询 能行? 还有就是反序列化 list<T> 也可以were 来查询。 我现在不是想换主食, 我是想问米饭如何做更好吃[/quote] 在你看来存储过程,创建视图肯定都是拿来吃的,数据表往那一摆,数据库就创建完毕了,其他都是查询者的事情了。。。[/quote] 我们说不到一起去,就别来留言了。 你认识查询者要干什么就干什么吧。 你认为存储过程和视图是什么就是什么。[/quote] 我最佩服的就是用LINQ TO 查询各种报表的。 加油。 MVVM 很符合你。
  • 打赏
  • 举报
回复
引用 17 楼 mk_lucifer 的回复:
[quote=引用 12 楼 好奇都是要学的 的回复:] [quote=引用 11 楼 mk_lucifer 的回复:] 实体模型,最直接的 linq to sql, linq to Entity 如果你对微软信不过,可以自己写实体模型框架,其实道理很简单,这东西现在都这么标准了,还有啥可纠结的。。。。 如果你是SQL SERVER 数据库,直接研究下linq to sql ,用多了你就知道他的好了。。如果不是sql server可以安装插件,常见的数据库都支持。。 如果你都不信任,linq也不过是个表达式的语法糖,微软也提供了linq的相关接口,自己实现实体和linq表达式,到 SQL 语句的转换,反正你是要封装的,一封到底起不更好。。。
你回答的 和我问的是一个事吗? 解决办法N多种, 我只是说了其中一种,并且说如何优化的更好 , 而你却告诉我换轮子。 这就跟我说我想吃饭, 你告诉我饭不好吃, 吃馒头吧,一样能吃饱。 还省钱一样。 linq to sql 在查询报表的时候能用上? 简单查询 可以。 来个10万条的统计查询 能行? 还有就是反序列化 list<T> 也可以were 来查询。 我现在不是想换主食, 我是想问米饭如何做更好吃[/quote] 在你看来存储过程,创建视图肯定都是拿来吃的,数据表往那一摆,数据库就创建完毕了,其他都是查询者的事情了。。。[/quote] 我们说不到一起去,就别来留言了。 你认识查询者要干什么就干什么吧。 你认为存储过程和视图是什么就是什么。
  • 打赏
  • 举报
回复
引用 26 楼 娃都会打酱油了 的回复:
其实楼主要的就是传进来的数据,比如实体对象,如何转化成SqlParameter集合,就是按type反射对应的DBType
哥们 就你懂我啊。 问个 要点 真的好难, 能看明白你要问的也好难 他们看了我的问题 关注的都是怎么把数据取出来。 而我想知道的是怎么把SqlParameter 集合了。 取数据我有N种办法。 现成的架构有的事。 但是最低端 不都是打开 SQL 关闭 SQL, 至于数据存dataset datatable 或者 LIST<T> 里 那重要吗? 我还可以放在session里。也可以放在缓存里。 我还可以取出在 写入记事本那。
  • 打赏
  • 举报
回复
引用 27 楼 wanghui0380 的回复:
还真是BB了半天,我18年。我咋不纠结呢。该用啥用啥,二八原则,8成的事用2成精力,剩下2成的事用8成精力。别因噎废食,别为了个别特例,再哪里纠结。 EF足够你完成快速完成8成的事情,剩下的两成单独去搞就是。别说我这里费个老劲搞个啥封装,你封装有啥用啊。就说报表。 我用水晶报表,我用fastreport都直接独立在系统外面写模板,独立在里面写sql。甚至我用excel+webserice+vba弄,你觉着你封个这个有啥用,我在fastreport里面用你这个dbhelper??
大哥,我俩说的 是 SQL 和LINQ。 你怎么又来个 webserice 或者 水晶报表了。 无论用什么传给前端, 不也得先出去来吗? 我的意思是 在报表方面 7 8 个表关联的情况, SQL要不LINQ更灵活。 其实你不应该看看我具体想了解什么吗? @娃都会打酱油了 说的很对。 我就是想反射SqlParameter集合而已,结果没有给解答的,都是跟我说 这个没用了, 用EF 用LINQ吧, 别用SQLHELP了 我问SqlParameter 是代表 我不用EF 和 LINQ 还是代表 我不会水晶报表和webserice
  • 打赏
  • 举报
回复
引用 25 楼 娃都会打酱油了 的回复:
你这问题看下dapper的源码不就知道了?具体在SqlMapper部分
恩。是的, 我已经搞定了, 封装了个简单的 给前端用, 这个要感谢 @正怒月神 。 同事用这还行

  public static DataSet abc(string strSql, params object[] arg)
        {
            Database db = DatabaseFactory.CreateDatabase("BusinessDb");
            DbCommand cmd = db.GetSqlStringCommand(strSql);
            try
            {
                for (int i = 0; i < arg.Length; i++)
                {
                    db.AddInParameter(cmd, "@a" + i, DbType.String, arg[i]); //在写个方法 DbType 类型取出来
                }
                DataSet dst = db.ExecuteDataSet(cmd);
                return dst;
            }
            catch
            {
                return null;
            }
        }
wanghui0380 2019-06-03
  • 打赏
  • 举报
回复
还真是BB了半天,我18年。我咋不纠结呢。该用啥用啥,二八原则,8成的事用2成精力,剩下2成的事用8成精力。别因噎废食,别为了个别特例,再哪里纠结。 EF足够你完成快速完成8成的事情,剩下的两成单独去搞就是。别说我这里费个老劲搞个啥封装,你封装有啥用啊。就说报表。 我用水晶报表,我用fastreport都直接独立在系统外面写模板,独立在里面写sql。甚至我用excel+webserice+vba弄,你觉着你封个这个有啥用,我在fastreport里面用你这个dbhelper??
  • 打赏
  • 举报
回复
其实楼主要的就是传进来的数据,比如实体对象,如何转化成SqlParameter集合,就是按type反射对应的DBType
  • 打赏
  • 举报
回复
你这问题看下dapper的源码不就知道了?具体在SqlMapper部分
加载更多回复(18)

62,244

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧