日期:2014-05-18  浏览次数:21074 次

如何解决拼接“SQL字符串”的烦恼
在查询的时候,发现很多现在的项目的框架都存在“拼接SQL字符串”的现象。最常见的就是生成“报表和图表”的时候,根据不同的条件“拼接Sql语句”,能拼接到几张A4纸那么长。

个人认为,如此“拼接Sql”字符串,不好调试,而且费时费力。有没有什么好的方法,可以避免拼接“Sql字符串”,解决这个烦恼???

比如使用:“Linq to Sql”可以吗???
主要是因为涉及到“Silverlight”在“Asp.net”项目中的使用,要用到“RIA WCF Service”。

------解决方案--------------------
都LINQ时代了,别再拼接SQL了。LINQ to SQL和LINQ to EF都行,根据需要选择吧。
------解决方案--------------------
LINQ to SQL只能连接SQLSERVER数据库,如果使用ORACLE数据库的话就不行了。建议使用NHibernate或EntityFramework。
------解决方案--------------------
用存储过程参数化也不需要拼接。

用LINQ to SQL也是可以的,还是很多框架都可以避免SQL拼接。
------解决方案--------------------
存储过程?
------解决方案--------------------
拼sql不好调试?有吗?
拼再多,再复杂,你可以直接把断点打在最终拼接好的语句上,然后监视一下就可以看到结果了,何来不好调试?相反,写在存储过程里才是真正的不好调试,在项目里拼sql的一个重要的好处恰恰就是方便调试
------解决方案--------------------
我是很反感拼接sql,一两个字段我可以忍受,
可以用参数化,存储过程等
------解决方案--------------------
存储过程和Linq吧
------解决方案--------------------
不知道为什么你喜欢给一些名词打引号,但是既然你自己标出来了,就把打引号的名词搞明白。

你的问题,如同问如何解决空调费电,用手电筒是否可以?但是手电筒不支持播放MP4怎么办。
------解决方案--------------------
应该是这样吧。
------解决方案--------------------
探讨
引用:

不知道为什么你喜欢给一些名词打引号,但是既然你自己标出来了,就把打引号的名词搞明白。

你的问题,如同问如何解决空调费电,用手电筒是否可以?但是手电筒不支持播放MP4怎么办。




麻烦大家了。不好意思,自己不太确定,好像觉得“Access 不支持 EF”。

不支持要用“Access”怎么办???

------解决方案--------------------
ADO.NET支持你可以传递参数对象给SQL(也就是所谓参数化SQL)来代替拼接SQL这种不安全的做法。这是最最基本和基础的知识,如果你系统学习下都应该知道。你不踏踏实实学习,整天在论坛道听途说一些新名词,只是让问题更复杂。
------解决方案--------------------
使用Condition类
Condition c = null;
if(1) c &= (Condition)"a = "+a;
if(2) c &= "ID".Like(txtBox1);
------解决方案--------------------
其实我一直觉得用ado.net访问数据库效率能更高一些
用ef也好 Linq也好 只不过把拼接的代码放到框架中使用 而且生成的代码不一定很好
其实我觉得linq这东西也是在内部实现了拼接代码罢了
------解决方案--------------------

用存储过程吧,你想怎么整就怎么整。

我的项目从来不在程序里面写SQL语句,都是在服务器上面写存储过程,要是有什么问题需要修改的话直接修改存储过程就好了,
客户端完全不需要考虑更新程序那些事儿。
------解决方案--------------------

举个例子,下面的代码就是在拼接不同的表,最后合在一起显示出来。
Declare @Command2 Varchar(2000) 
Declare @Command3 Varchar(2000) 
Declare @Command4 Varchar(2000) 
SET @PN80=''''+@PN80+''''
SET @PN80=replace(@PN80,',',''',''')


--定义一个结构相同的空表
SELECT Customer,PN INTO #1 FROM HOURSCJL WHERE 1=0

SELECT Customer,PN INTO #2 FROM HOURSMIPK WHERE 1=0

SELECT Customer,PN INTO #3 FROM HOURSTEST WHERE 1=0


SET @Command2='INSERT INTO #1 SELECT Customer,PN FROM HOURS1 WHERE PN80 IN ('+@PN80+')'
EXEC(@Command2)

SET @Command3='INSERT INTO #2 SELECT Customer,PN FROM HOURS2 WHERE PN80 IN ('+@PN80+')'
EXEC(@Command3)

SET @Command4='INSERT INTO #3 SELECT Customer,PN FROM HOURS3 WHERE PN80 IN ('+@PN80+')'
EXEC(@Command4)


SELECT FORDER=CASE WHEN LEFT(SortPN,2)='80' THEN '1' ELSE '4' END, * FROM #1
UNION
SELECT FORDER=CASE WHEN LEFT(SortPN,2)='50' THEN '2' ELSE '4' END, * FROM #2
UNION