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のExecuteQueryおよびExecuteCommandメソッドを見てください。ORM が多すぎる場合は、vanilla ADO.Net と an を使用するとメリットがあります。SqlCommand

于 2013-02-01T09:21:57.330 に答える