SQL语句能这样写?——拆分SQL语句

在写DAL层的时候,对数据库的操作仅用到增删改查,却要写那么多方法来应对功能上的需求,为了图个方便,我进行了一次大胆的尝试:将查询内容全部参数化,提高SQL语句的功能。代码思路如下:

 //根据需要更新商品某字段
        public int UpdateGoods(GoodsInfo goods, string field,object value)
        {
            string sql = "update T_GoodsInfo set @field  =@value  where goodsname=@goodsname";
            SqlParameter[] sp =
            {
                new SqlParameter("@goodsname",goods.goodsname),
                new SqlParameter("@value",value),
                new SqlParameter("@field",field)
            };
            return SQLHelper.ExcuteNonQuery(sql, sp);
        }

刚开始代码大概就是这样吧,我想通过传参把要查的字段写活,应该能用,实际测试中出错了。究其原因,问题出在了SQL语句上:字段(field)是字符串的格式,调用方法时传进去的值是带引号的,在SQLserver中处理(有去引号的步骤)这条语句时将本想写的字段看成了字符串处理,没有可识别的字段,所以就出现了有参数值没有对应字段的尴尬。

把原因定位到了引号上,就要从引号出入手,想了想之前VB里用加号连接SQL语句,就试了试,代码就成了这样:

//根据需要更新商品某字段
        public int UpdateGoods(GoodsInfo goods, string field,object value)
        {
            string sql = "update T_GoodsInfo set " + field + " =@value  where goodsname=@goodsname";
            SqlParameter[] sp =
            {
                new SqlParameter("@goodsname",goods.goodsname),
                new SqlParameter("@value",value),
                new SqlParameter("@field",field)
            };
            return SQLHelper.ExcuteNonQuery(sql, sp);
        }

这时候传进来的field没有引号了,就成了要查的字段名。这个方法的功能也就更强大了。一个引号就能决定语句的可用性,由此可见拼接的重要性。还可以把表名也参数化,在这个方法的功能扩大的同时,需要的参数个数也变多了。有兴趣的话可以尝试一下。

至于它在数据库中的执行状况、会带来什么不好的影响,我还不清楚。欢迎留言一起探讨。

发布了233 篇原创文章 · 获赞 22 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41026669/article/details/98986736