引用的Microsoft.Practices.EnterpriseLibrary.Common 连接数据库

好奇都是要学的 2019-05-23 04:21:48
引用的微软的 DLL 连接数据库
最开始公司写法 公共类,全公司写SQL语句 直接调用。 但是会被SQL注入。
/// <summary>
/// 执行一条SQL语句返回表
/// </summary>
/// <param name="strSql"></param>
/// <returns></returns>
public static DataSet ExcuteDataSet(string strSql)
{
Database db = DatabaseFactory.CreateDatabase("BusinessDb");
DbCommand cmd = db.GetSqlStringCommand(strSql);
try
{
DataSet dst = db.ExecuteDataSet(cmd);
return dst;
}
catch
{
return null;
}
}

改成 创建个公共类 里面 里面封装了好多返回 比如 dataset datatable 或者返回 执行结果 ExecuteNonQuery 参数化不会被注入,但是增加了开发工作量
public static Database dbase = DatabaseFactory.CreateDatabase("BusinessDb");
public static DataSet ExcuteDataSet(DbCommand cmd)
{
try
{
DataSet dst = db.ExecuteDataSet(cmd);
return dst;
}
catch
{
return null;
}
}

然后服务端 在设置参数传参数的时候(每个程序猿都要写的根据自己需创建AddInParameter个数)
DbCommand cmd = Business.Public.Public.dbase.GetSqlStringCommand("select * from basDept where IfReal=@a and ... and ...");
Business.Public.Public.dbase.AddInParameter(cmd, "@a", DbType.String, "1");
Business.Public.Public.dbase.AddInParameter(cmd, "@b", DbType.String, "2");
DataSet ds = Business.Public.Public.abc(cmd);


在后来 就提出来个公共类
public static DataSet abc(string strSql,string a=null,string b=null,string c=null,string d=null,string e=null,string f=null,string g=null)
{
DbCommand cmd = Public.dbase.GetSqlStringCommand(strSql);
Public.dbase.AddInParameter(cmd, "@a", DbType.String, a);
Public.dbase.AddInParameter(cmd, "@b", DbType.String, b);
Public.dbase.AddInParameter(cmd, "@c", DbType.String, c);
Public.dbase.AddInParameter(cmd, "@d", DbType.String, d);
Public.dbase.AddInParameter(cmd, "@e", DbType.String, e);
Public.dbase.AddInParameter(cmd, "@f", DbType.String, f);
Public.dbase.AddInParameter(cmd, "@g", DbType.String, g);

try
{
DataSet dst = db.ExecuteDataSet(cmd);
return dst;
}
catch
{
return null;
}
}
每个程序猿 需要写的是
DataSet ds = Business.Public.Public.abc("select * from basDept where IfReal=@a and ... and ...",传入对应的值);
但是 不可能所有的参数都是DbType.String。

有可以处理的办法吗? 写程序的 直接调用 。 还不被参数化的。
...全文
258 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 12 楼 正怒月神 的回复:
[quote=引用 5 楼 好奇都是要学的 的回复:] [quote=引用 4 楼 正怒月神 的回复:] 你是要判断类型吗?
static void Main(string[] args)
        {
            Test(1,2.12,"hello");

            Console.ReadLine();
        }

        public static void Test(params object[] a[code=csharp]
rg) { foreach (var item in arg) { if(item is Int32) Console.WriteLine("int"); else if (item is Double) Console.WriteLine("double"); else Console.WriteLine("string"); } }[/code]
判断类型我会, 我是指, 接收参数的地方 public static DataSet abc(string strSql,string a=null,string b=null,string c=null,string d=null,string e=null,string f=null,string g=null) 公共类,这个方法 供给所有人调用。 接收的时候就是字符了, 还判断类型有啥用。 除非把 string 换成OBJ, 然后在判断类型返回对应值[/quote] 这个方法封装的就不对,按照我写的应该传入一个 param ,然后才能判断参数类型,选择不同的dbtype[/quote] 你这样我想不到 怎么封装公共类 公共类
 第一个参数SQL语句, 第二个参数替换  用for 我不会写 
public static DataSet abc(string strSql,params object[] arg )
{
   DbCommand cmd = Public.dbase.GetSqlStringCommand(strSql);
    for(int i=0;i<arg.Length;i++ )
{
      这怎么写, 
   dbase.AddInParameter(cmd, "@a", Test(arg[i]), arg[i]);  这也NEW不出来啊。  如果不用for 
}
            
}
不用for写
public static DataSet abc(string strSql,params object[] arg )
{
   DbCommand cmd = Public.dbase.GetSqlStringCommand(strSql);
      
   dbase.AddInParameter(cmd, "@a", Test(arg[1]), arg[0]);   
  dbase.AddInParameter(cmd, "@b", Test(arg[2]), arg[1]);  
  。。。。
      这么写   怎么可能按照arg 长度写正好 除非 顶一个arg就是多少,不足NULL补齐。
}
你光写了个 判断 字符的方法 。 可是 所有连接一起 不行啊
正怒月神 版主 2019-05-24
  • 打赏
  • 举报
回复
引用 5 楼 好奇都是要学的 的回复:
[quote=引用 4 楼 正怒月神 的回复:] 你是要判断类型吗?
static void Main(string[] args)
        {
            Test(1,2.12,"hello");

            Console.ReadLine();
        }

        public static void Test(params object[] arg)
        {
            foreach (var item in arg)
            {
                if(item is Int32)
                    Console.WriteLine("int");
                else if (item is Double)
                    Console.WriteLine("double");
                else
                    Console.WriteLine("string");
            }
        }
判断类型我会, 我是指, 接收参数的地方 public static DataSet abc(string strSql,string a=null,string b=null,string c=null,string d=null,string e=null,string f=null,string g=null) 公共类,这个方法 供给所有人调用。 接收的时候就是字符了, 还判断类型有啥用。 除非把 string 换成OBJ, 然后在判断类型返回对应值[/quote] 这个方法封装的就不对,按照我写的应该传入一个 param ,然后才能判断参数类型,选择不同的dbtype
  • 打赏
  • 举报
回复
引用 10 楼 OrdinaryCoder 的回复:
[quote=引用 9 楼 好奇都是要学的 的回复:] [quote=引用 7 楼 OrdinaryCoder 的回复:]

{"code":"0X0B02","body":[{"name":"应答","type":"i1"},{"name":"地图名","type":"i1:s"},{"name":"X坐标","type":"i4"},{"name":"Y坐标","type":"i4"},{"name":"序号","type":"i1"},{"name":"是否到达","type":"i1"}]}
类似这样用json传递参数 name 参数名 type数据类型 可以加一个value 值 这样是不是就可以判断类型 按不同类型 进行操作
正常来说 程序猿 要写 参数的 select * from 表 where 列=@a and 列=@b dbase.AddInParameter(cmd, "@a", DbType.String, a); dbase.AddInParameter(cmd, "@b", DbType.String, b); 然后公共类 abc 接收(SqlParameter[] sqlpam) 然后执行返回 数据源。 现在就是想省去AddInParameter[/quote] 我是不是可以这么理解 只要程序员调用简单 abc方法内部可以复杂一点[/quote] 是的 abc 就是公共类, 只要能反回 执行SQL 结果,但是要参数化。 。 至于ABC怎么封装 也得方便扩充和维护吧
OrdinaryCoder 2019-05-24
  • 打赏
  • 举报
回复
引用 9 楼 好奇都是要学的 的回复:
[quote=引用 7 楼 OrdinaryCoder 的回复:]

{"code":"0X0B02","body":[{"name":"应答","type":"i1"},{"name":"地图名","type":"i1:s"},{"name":"X坐标","type":"i4"},{"name":"Y坐标","type":"i4"},{"name":"序号","type":"i1"},{"name":"是否到达","type":"i1"}]}

类似这样用json传递参数 name 参数名 type数据类型 可以加一个value 值 这样是不是就可以判断类型 按不同类型 进行操作


正常来说 程序猿 要写 参数的
select * from 表 where 列=@a and 列=@b
dbase.AddInParameter(cmd, "@a", DbType.String, a);
dbase.AddInParameter(cmd, "@b", DbType.String, b);

然后公共类 abc 接收(SqlParameter[] sqlpam)
然后执行返回 数据源。 现在就是想省去AddInParameter[/quote]
我是不是可以这么理解 只要程序员调用简单 abc方法内部可以复杂一点
  • 打赏
  • 举报
回复
引用 7 楼 OrdinaryCoder 的回复:

{"code":"0X0B02","body":[{"name":"应答","type":"i1"},{"name":"地图名","type":"i1:s"},{"name":"X坐标","type":"i4"},{"name":"Y坐标","type":"i4"},{"name":"序号","type":"i1"},{"name":"是否到达","type":"i1"}]}
类似这样用json传递参数 name 参数名 type数据类型 可以加一个value 值 这样是不是就可以判断类型 按不同类型 进行操作
正常来说 程序猿 要写 参数的 select * from 表 where 列=@a and 列=@b dbase.AddInParameter(cmd, "@a", DbType.String, a); dbase.AddInParameter(cmd, "@b", DbType.String, b); 然后公共类 abc 接收(SqlParameter[] sqlpam) 然后执行返回 数据源。 现在就是想省去AddInParameter
  • 打赏
  • 举报
回复
引用 7 楼 OrdinaryCoder 的回复:

{"code":"0X0B02","body":[{"name":"应答","type":"i1"},{"name":"地图名","type":"i1:s"},{"name":"X坐标","type":"i4"},{"name":"Y坐标","type":"i4"},{"name":"序号","type":"i1"},{"name":"是否到达","type":"i1"}]}
类似这样用json传递参数 name 参数名 type数据类型 可以加一个value 值 这样是不是就可以判断类型 按不同类型 进行操作
那公共类 怎么封装。 开发人员写起来更麻烦。 我是想 开发人员 在写SQL的时候 写 select * from 表 where 列=@a and 列=@b 然后调用公众方法 public static DataSet abc(Sql,参数1值,参数2值) 其他的东西 根本不用程序猿管。 但是这个ABC公共类要怎么封装 才能符合所有程序猿调用那
OrdinaryCoder 2019-05-24
  • 打赏
  • 举报
回复

{"code":"0X0B02","body":[{"name":"应答","type":"i1"},{"name":"地图名","type":"i1:s"},{"name":"X坐标","type":"i4"},{"name":"Y坐标","type":"i4"},{"name":"序号","type":"i1"},{"name":"是否到达","type":"i1"}]}

类似这样用json传递参数 name 参数名 type数据类型 可以加一个value 值 这样是不是就可以判断类型 按不同类型 进行操作
  • 打赏
  • 举报
回复
怎么没什么人回答我的问题啊, 大神都去哪里了
  • 打赏
  • 举报
回复
引用 4 楼 正怒月神 的回复:
你是要判断类型吗?
static void Main(string[] args)
        {
            Test(1,2.12,"hello");

            Console.ReadLine();
        }

        public static void Test(params object[] arg)
        {
            foreach (var item in arg)
            {
                if(item is Int32)
                    Console.WriteLine("int");
                else if (item is Double)
                    Console.WriteLine("double");
                else
                    Console.WriteLine("string");
            }
        }
判断类型我会, 我是指, 接收参数的地方 public static DataSet abc(string strSql,string a=null,string b=null,string c=null,string d=null,string e=null,string f=null,string g=null) 公共类,这个方法 供给所有人调用。 接收的时候就是字符了, 还判断类型有啥用。 除非把 string 换成OBJ, 然后在判断类型返回对应值
正怒月神 版主 2019-05-23
  • 打赏
  • 举报
回复
你是要判断类型吗?
static void Main(string[] args)
        {
            Test(1,2.12,"hello");

            Console.ReadLine();
        }

        public static void Test(params object[] arg)
        {
            foreach (var item in arg)
            {
                if(item is Int32)
                    Console.WriteLine("int");
                else if (item is Double)
                    Console.WriteLine("double");
                else
                    Console.WriteLine("string");
            }
        }
  • 打赏
  • 举报
回复
引用 2 楼 a410787073 的回复:
最好是用orm,,比如 ef 之类的框架,省事太多,另外你这个 我的想法是 Public.dbase.AddInParameter(cmd, "@a", changeType(a), a); public DbType changeType(obj type) { //判断传入的参数类型,转换成对应的DbType类型 返回,大概思路是这样 }
你说的ORM 和 EF 没办法用啊, 公司项目一直在进行, 只能在现在的基础上优化。 还有changeType(a) 类型不用判断了, 上面接收的都是string 类型, 判断也都是字符型, 除非 public static DataSet abc(string strSql,string a=null,string b=null,string c=null,string d=null,string e=null,string f=null,string g=null) 这不用指定类型,然后跟着 传过来的类型判断 比如 a 我不指定是字符型, 通过 调用方传过来类型。 但是这能不起类型吗?
a410787073 2019-05-23
  • 打赏
  • 举报
回复
最好是用orm,,比如 ef 之类的框架,省事太多,另外你这个 我的想法是 Public.dbase.AddInParameter(cmd, "@a", changeType(a), a); public DbType changeType(obj type) { //判断传入的参数类型,转换成对应的DbType类型 返回,大概思路是这样 }
  • 打赏
  • 举报
回复
求大神给思路,好继续玩耍下去

62,244

社区成员

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

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

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

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