PDA

View Full Version : یک سوال در ارتباط با امکانات Tigger



mpmsoft
چهارشنبه 23 مرداد 1387, 23:16 عصر
دوستان من یک سوالی در ارتباط با تریگرها دارم که خیلی بهش نیاز دارم

فرض کنید می خوام بعد از اضافه شدن یک رکورد به بانک یک فایل Exe رو اجرا کنم و یا پیغامی رو برای یک فایل Dll یا Exe بفرستم

فرض کنید می خوام زمانی که یک رکورد به بانک اضافه می شه اطلاعات مربوطه با یک نرم افزار دیگه به مشتری SMS بشه


آیا این کار شدنی هستش ؟

mannai29
پنج شنبه 24 مرداد 1387, 10:01 صبح
فکر کنم نه 100 در 100 ولی با درصدی تواضع بتونی این کارو بکنی یعنی موقع درج ، یک flag رو 1 بکنی و توی برنامت مدام در زمانهای معین این flag رو چک بکنی و بعد کارت رو انجام بدی.

mpmsoft
پنج شنبه 24 مرداد 1387, 10:51 صبح
یعنی SQL با این عظمت فکری برای این منظور نکرده فرض کنید من بتونم در SQL یک VB Script بنویسم که یه مقداری رو روی یک IP و Port برام بفرسته.

فکر نمی کنم کار درستی باشه که بخوام مدام دستابیسمو چک کنم

Masiha1986
پنج شنبه 24 مرداد 1387, 11:29 صبح
با سلام
دوست عزیز با استفاده از کد زیر می تونی فایل اجراییت رو به صورت یک Network Service اجرا کنی. اما برای اینکه بتونی به عنوان مثال برنامه رو به صورت Windows Form و یا یک برنامه Console اجرا کنی (که به نظر من کار بی فایده ایه) می تونی از External Procedure ها استفاده کنی. اما برای کاری که شما می خواهید انجام بدید همین روش جوابگوی کارت هست.



EXECUTE sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO
EXECUTE sp_configure 'xp_cmdshell', '1'
RECONFIGURE WITH OVERRIDE
GO
EXECUTE sp_configure 'show advanced options', 0
RECONFIGURE WITH OVERRIDE
GO
xp_cmdshell 'C:\Test.exe'

البته لازم به ذکره که سه بخش اول رو فقط کافیه که یک بار اجرا کنی (یعنی بیرون Trigger ات تا Config اش انجام بشه) و هم چنین حتما برنامه ای رو که می خوای اجراش کنی حتما بعد از اتمام کارش، ببندش. چون در غیر این صورت Trigger و یا SP بسته نمی شه.

mpmsoft
پنج شنبه 24 مرداد 1387, 12:34 عصر
ممنون دوست عزیز

حالا اگر بخوایم مقداری رو به فایل Exe بفرستیم ، می تونیم از IP و یا پورت استفاده کنیم ؟

یا اینکه باید به Exe پارامتر بدیم

بعد یه چیزه دیگه فایل اجرایی من همیشه باز هستش من می خوام فقط مقادیر به این فایل فرستاده بشه

اگر لطف کنید درباره External Procedure هم یه مقداری توضیح بدید به چه صورت می شه ساختش

Masiha1986
پنج شنبه 24 مرداد 1387, 16:10 عصر
با سلام
برای ایجاد External Procedure ها در SQL Server 2005 ابتدا یک پروژه از نوع Class Library ایجاد می کنیم و درون کلاس مورد نظرمان تابعی به صورت زیر ایجاد می کنیم (ما می خواهیم تابعی ایجاد کنیم که یک عبارت را دریافت کرده و آن را به عنوان Message چاپ کند و تاریخ روز را به صورت شمسی به عنوان Result بر گرداند)



public class TestClass
{
[SqlProcedure]
public static void TestProcedure(string inStr, out string outStr)
{
PersianCalendar Calc = new PersianCalendar();
SqlContext.Pipe.Send("This is for " + inStr.ToString());
outStr = (Calc.GetYear(DateTime.Now).ToString() + "/" + Calc.GetMonth(DateTime.Now).ToString() + "/" + Calc.GetDayOfMonth(DateTime.Now).ToString());
}
}
سپس با استفاده از کد زیر این Assembly را به DB مورد نظرمان اضافه می کنیم:



sp_configure 'clr enabled', 1
GO
RECONFIGURE

CREATE ASSEMBLY TestExternalProcedure from 'C:\TestExternalProcedure.dll' WITH PERMISSION_SET = SAFE
سپس با استفاده از کد زیر Procedure مان را اضافه می کنیم:



CREATE PROCEDURE TestProcedure(@inStr nvarchar(255), @outStr nvarchar(255) output)
AS
EXTERNAL NAME [TestExternalProcedure].[TestExternalProcedure.TestClass].[TestProcedure]
در قسمت بالا، قسمت اولی که زیر آن خط کشیده شده است نام Assembly، قسمت دوم آدرس کامل کلاس (فصای نام + نام کلاس) و قسمت سوم نام متدی است که می خواهیم از آن استفاده کنیم.

برای استفاده از این Procedure می توانیم به شکل زیر عمل کنیم:



DECLARE @outStr nvarchar(255)

EXECUTE [dbo].[TestProcedure]
'Test'
,@outStr OUTPUT

SELECT @outStr AS NowPersianDate
که نتیجه به صورت زیر خواهد بود:


http://masiha1986.persiangig.com/image/Result.bmp

http://masiha1986.persiangig.com/image/Message.bmp

Masiha1986
شنبه 26 مرداد 1387, 10:02 صبح
با سلام
دوست عزیز, اما برای کاری که شما می خواهید انجام بدید، پیشنهاد می کنم که از همون راه اول استفاده کنید، با این تفاوت که بین اون برنامه ای که می گید همیشه بازه و یک برنامه که برای ارسال پارامتر ها ازش استفاده میشه به وسیله یک Remote Object ارتباط برقرار کنی.
پروژه نمونه رو از قسمت 'فایل های پیوست شده' دریافت کن.
توی این نمونه، Server همون برنامه ایه که پارامترها به اون پاس داده می شن و Client همون ارسال کننده پارامترهاست.
برای ارسال کردن پارامترها به برنامه Server باید از این کد استفاده کنی:



xp_cmdshell 'C:\Remoting\Release\Client.exe Masiha Mohammad'


یعنی بعد از نام فایل exe با یک فاصله می تونی پارامترهات رو به برنامه ات ارسال کنی.
با هر بار اجرایی این کد در صورت باز بودن برنامه Server، پارامترهای ارسالی، به ListBox برنامه Server اضافه می شن.