0

我有一个用于从多个表中搜索的存储过程

`ALTER PROCEDURE [dbo].[rdsp_Srchfld]
(
@strFldlst as nvarchar(max),
@strTblnm as nvarchar(max),
@intSrchStyle as int,
@strcond1 as nvarchar(250),
@strCond2 as nvarchar(250)=null,
@strCond3 as nvarchar(300)
)
AS
BEGIN 
declare @strSql as varchar(7000)


--Process
set @strSql = 'select Distinct ' + @strFldlst  + ' from ' + @strTblnm 
IF @intSrchStyle = 0
BEGIN
    SET @strSql = @strSql + ' where ' + @strcond1  + ' = ' + '''' + @strCond2 + '''' + ' order by ' + '' + @strcond3 + ''
END
ELSE IF @intSrchStyle = 1
BEGIN
    SET @strSql = @strSql + ' where ' + @strcond1 + ' like ' + '''' + @strCond2 + '%' + '''' + ' order by ' + '' + @strcond3 + ''
END



ELSE IF @intSrchStyle = 2 
BEGIN
    SET @strSql = @strSql + ' where ' + @strcond1  + ' like ' + '''' + '%' + @strCond2 + '%' + '''' + ' order by ' + '' + @strcond3 + ''
END

EXEC (@strSql)
END`

并将参数从 LINQ 传递到 Sql 作为

var rslt = from srch in custDC.rdsp_Srchfld(fldName, tblName, srchType, cond1, cond2, cond3) select srch;

现在我尝试构建我的程序,我收到错误

Error   1   Could not find an implementation of the query pattern for source type 'int'.  'Select' not found.

为什么我收到错误以及如何实现它。

4

1 回答 1

2

不要这样做。现在放弃你的方法。

首先阅读这篇文章,http://www.sommarskog.se/dynamic_sql.html

想想为什么要创建 Linq-to-SQL。看看它的继任者EF。

然后从已建立的支持ORM的 SQL Server 为您的数据库制作模型。然后使用该模型为您提供漂亮的类型检查代码。让模型为您执行动态 SQL。如果您有 ORM 无法处理的特殊要求或情况。然后考虑写一个专门的SP来处理。


如果您要坚持使用您的方法,至少要了解什么是SQL 注入攻击。了解sp_executesql并使用它。


如果 Linq-to-SQL 无法正确获取您的动态 SQL,无论出于何种原因,在客户端/应用程序层而不是在 SP 中构建语句更有意义。查看DataContext的ExecuteQueryExecuteCommand方法。如果一个 ORM 太多,使用 vanilla ADO.Net 和一个有优点的。SqlCommand

于 2013-02-01T09:21:57.330 回答