PDA

View Full Version : CLR Stored Procedure And Dynamic SQL



hasty0087
سه شنبه 22 تیر 1389, 00:18 صبح
با عرض سلام خدمت همه دوستان برنامه نويسم.
من دارم با CLR Stored Procedure و Linq در معماري 5 لايه كار مي كنم .
يك SP دارم كه كارش يافتن بزرگترين مقدار ID در جدول هستش البته اسم جدول به صورت پارامتر به تابع ارسال مي شه و همچنين اسم فيلد مربوط به ID.(چون اسم فيلد در جذاول مختلف متفاوته) :

CREATE PROCEDURE [dbo].[FindMax]
@ID varchar(50),

@TableName varchar(50)

AS
DECLARE @TblName sysname, @SQL nvarchar(250)

DECLARE @cmd AS NVARCHAR(max)

DECLARE @max AS int
SET @TblName = @TableName;

BEGIN

SET @cmd=N'SELECT @max=Max('+ @ID + ') FROM ' + @TblName
exec sp_executesql @cmd, N'@max int output', @max output
Select @max

END

حالا نمي دونم تو لايه Business Layer چه جوري بايد فراخواني بشه.

namespace NameSpaceStudentBO
{
public class ClsFindMax

{
public static int FindMax(string TableName, string ID)
{
try

{
object[] objData = AccessData.Call.FindMax(TableName, ID).ToArray<FindMaxResult>();
return ؟؟؟؟؟؟؟؟؟؟;
}
catch (Exception)
{
throw;
}
}
}
}

به جاي علامت سوال چي بايد گذاشت؟
فكر مي كنم بايد ObjObject يك جوري به int تبديل بشه اما نمي دونم چه جوري؟

sia_2007
سه شنبه 22 تیر 1389, 00:34 صبح
این کار از پایه غلطه؛ مگه این که سیستم Single User باشه.
برای کار درست باید جدول Lock بشه.

دوما ID لزوما Int32 نیست.
ممکنه Char باشه با حروف.

یکی از مزیتهای SP؛ ساخت راحت رشته دستور هستش؛ لزومی نداره رشته رو با هم ترکیب و سر هم کنی.
با این کار Execution Plan به احتمال صدی 90 تا بد ساخته میشه؛ البته من که پشت سیستم نیستم ولی حدسم اینه.

لطف کنید کد متد AccessData.Call.FindMax رو بذارین.
البته در بلاک Code که خوانا تر باشه.

sia_2007
سه شنبه 22 تیر 1389, 00:50 صبح
کد این کلاس هم لازمه : FindMaxResult

hasty0087
دوشنبه 11 مرداد 1389, 15:28 عصر
سلام.
يك ميني پروگرام نوشتم كه براتون ارسال مي كمم ببينيد ميتونيد اشكالش رو برطرف كنيد؟