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

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

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了。 谁有更好的办法。 请指教
...全文
200 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 11 楼 正怒月神 的回复:
[quote=引用 10 楼 好奇都是要学的 的回复:] 这2个方法 解决了他们的 调用问题。 如何能把@a+i 也自定义了那。 不是强制
你直接让他们传递SQLParameter。 可是你又会发现,sql语句里的 参数占位符,你没办法获取到。 然后又只能让程序员传递sql和sqlparam。 最后这个就回到了原来的问题,没有封装的必要性。[/quote] 就是不让他们自己写sqlparam , 有的时候 插入表 30多列, 他们要写一直重复写没有的 add添加sqlparam 。 根本就是无用功。 我们项目简单, 要的就是时间, 最好就是一条SQL语句, 参数化都不要。 但是SQL又有注入问题, 先这样吧。 以后的新项目在说吧。你现在帮助的就够他们用。
正怒月神 2019-05-27
  • 打赏
  • 举报
回复
引用 10 楼 好奇都是要学的 的回复:
这2个方法 解决了他们的 调用问题。 如何能把@a+i 也自定义了那。 不是强制
你直接让他们传递SQLParameter。 可是你又会发现,sql语句里的 参数占位符,你没办法获取到。 然后又只能让程序员传递sql和sqlparam。 最后这个就回到了原来的问题,没有封装的必要性。
  • 打赏
  • 举报
回复
引用 3 楼 正怒月神 的回复:
方法如果是这样,还不如不封装。
用你的办法 给老项目加了个 方法 确实可以 给普通开发程序猿省去时间,唯一不美丽的就是 @a0 不断累加。 不能自定义 调用方法

Public.DisplayDataBase("select * from Address where AddressNo=@a0 and Name=@a1 and Tel=@a2", "2", "过程", "13333333333");

public static DataSet  DisplayDataBase(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;
            }
}

public static string ExcuteSql(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 类型取出来
                }
                return db.ExecuteNonQuery(cmd).ToString();
            }
            catch
            {
                return null;
            }
}
这2个方法 解决了他们的 调用问题。 如何能把@a+i 也自定义了那。 不是强制
  • 打赏
  • 举报
回复
你去看下dapper的源码不就知道了…… 都是通过command来创建param
  • 打赏
  • 举报
回复
引用 7 楼 正怒月神 的回复:
[quote=引用 6 楼 好奇都是要学的 的回复:] [quote=引用 5 楼 正怒月神 的回复:] [quote=引用 4 楼 好奇都是要学的 的回复:] [quote=引用 3 楼 正怒月神 的回复:] 方法如果是这样,还不如不封装。
为什么那。 这样确实 可以给程序猿 省很多代码量 所有的东西都是ABC 类里处理了, 参数也给了默认值, 他需要用几个就传几个。 开发的程序猿 只要写 对应的SQL 语句, 然后调用下, 也不用担心注入, 就是调用个方法, 把SQL 和 参数传过去。 就算ABC里里封装了50个参数。 程序猿就用到 一个, 他就传一个 剩下49个他可以不管的[/quote] 人家传递50个参数,然后你在改成50个参数方法吗? 所以我前一篇就写了。使用 params 不用管它传递多少个过来。 不过我个人其实觉得并没有封装的意义。[/quote] 用params 没问题。 但是 走到acb类里 我不会写了。 怎么用for循环 循环出 dbase.AddInParameter(cmd, "@a", GetDbType(a), a); 这个啊。 我不会了。 数组有3个 出来3个,还有就是 @a 那怎么弄成变量啊 总不能 是 "@"+i 吧 [/quote] 写个sp中参数命名的例子 [/quote] 我去试试。谢谢
正怒月神 2019-05-24
  • 打赏
  • 举报
回复
引用 6 楼 好奇都是要学的 的回复:
[quote=引用 5 楼 正怒月神 的回复:] [quote=引用 4 楼 好奇都是要学的 的回复:] [quote=引用 3 楼 正怒月神 的回复:] 方法如果是这样,还不如不封装。
为什么那。 这样确实 可以给程序猿 省很多代码量 所有的东西都是ABC 类里处理了, 参数也给了默认值, 他需要用几个就传几个。 开发的程序猿 只要写 对应的SQL 语句, 然后调用下, 也不用担心注入, 就是调用个方法, 把SQL 和 参数传过去。 就算ABC里里封装了50个参数。 程序猿就用到 一个, 他就传一个 剩下49个他可以不管的[/quote] 人家传递50个参数,然后你在改成50个参数方法吗? 所以我前一篇就写了。使用 params 不用管它传递多少个过来。 不过我个人其实觉得并没有封装的意义。[/quote] 用params 没问题。 但是 走到acb类里 我不会写了。 怎么用for循环 循环出 dbase.AddInParameter(cmd, "@a", GetDbType(a), a); 这个啊。 我不会了。 数组有3个 出来3个,还有就是 @a 那怎么弄成变量啊 总不能 是 "@"+i 吧 [/quote] 写个sp中参数命名的例子
  • 打赏
  • 举报
回复
引用 5 楼 正怒月神 的回复:
[quote=引用 4 楼 好奇都是要学的 的回复:] [quote=引用 3 楼 正怒月神 的回复:] 方法如果是这样,还不如不封装。
为什么那。 这样确实 可以给程序猿 省很多代码量 所有的东西都是ABC 类里处理了, 参数也给了默认值, 他需要用几个就传几个。 开发的程序猿 只要写 对应的SQL 语句, 然后调用下, 也不用担心注入, 就是调用个方法, 把SQL 和 参数传过去。 就算ABC里里封装了50个参数。 程序猿就用到 一个, 他就传一个 剩下49个他可以不管的[/quote] 人家传递50个参数,然后你在改成50个参数方法吗? 所以我前一篇就写了。使用 params 不用管它传递多少个过来。 不过我个人其实觉得并没有封装的意义。[/quote] 用params 没问题。 但是 走到acb类里 我不会写了。 怎么用for循环 循环出 dbase.AddInParameter(cmd, "@a", GetDbType(a), a); 这个啊。 我不会了。 数组有3个 出来3个,还有就是 @a 那怎么弄成变量啊 总不能 是 "@"+i 吧
正怒月神 2019-05-24
  • 打赏
  • 举报
回复
引用 4 楼 好奇都是要学的 的回复:
[quote=引用 3 楼 正怒月神 的回复:] 方法如果是这样,还不如不封装。
为什么那。 这样确实 可以给程序猿 省很多代码量 所有的东西都是ABC 类里处理了, 参数也给了默认值, 他需要用几个就传几个。 开发的程序猿 只要写 对应的SQL 语句, 然后调用下, 也不用担心注入, 就是调用个方法, 把SQL 和 参数传过去。 就算ABC里里封装了50个参数。 程序猿就用到 一个, 他就传一个 剩下49个他可以不管的[/quote] 人家传递50个参数,然后你在改成50个参数方法吗? 所以我前一篇就写了。使用 params 不用管它传递多少个过来。 不过我个人其实觉得并没有封装的意义。
  • 打赏
  • 举报
回复
引用 3 楼 正怒月神 的回复:
方法如果是这样,还不如不封装。
为什么那。 这样确实 可以给程序猿 省很多代码量 所有的东西都是ABC 类里处理了, 参数也给了默认值, 他需要用几个就传几个。 开发的程序猿 只要写 对应的SQL 语句, 然后调用下, 也不用担心注入, 就是调用个方法, 把SQL 和 参数传过去。 就算ABC里里封装了50个参数。 程序猿就用到 一个, 他就传一个 剩下49个他可以不管的
正怒月神 2019-05-24
  • 打赏
  • 举报
回复
方法如果是这样,还不如不封装。
eaqpi 2019-05-24
  • 打赏
  • 举报
回复
只要对row赋值,无需参数化,最后交给ds update一下就行了。

eaqpi 2019-05-24
  • 打赏
  • 举报
回复
DATATABLE,DATAROW,

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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