View Full Version : Ping با استفاده از Assembly دات نت با #C
Sal_64
یک شنبه 26 شهریور 1391, 16:11 عصر
سلام - نحوه ایجاد و استفاده از Assembly جهت ping کلاینت ها توسط sqlserver ? تشکر
ASKaffash
دوشنبه 27 شهریور 1391, 08:07 صبح
سلام
سعی می کنم نحوه استفاده از یک Assembly را در SQL2005 به بالا با ارائه سورس کامل Ping کامپیوترها از درون SQLServer بصورت مفصل ارائه دهم :
تعریف Assembly در دات نت :
به کلاس ها و ساختارها و ... که در قالب یک پروژه دات نت یک Assembly گفته می شود که میتواند یک EXE یا DLL دات نتی باشد.
مرحله اول :
طراحی یک کلاس و یک متد Static درون کلاس که قابل استفاده درون SQLServer باشد در این حالت نیاز به فضای نامی Microsoft.SqlServer.Server می باشد تا بتوان از attribute بنام SqlFunction استفاده نمود چون در این مثال هدف طراحی Ping است سورس برنامه به #C به شکل ذیل خواهد بود :
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.NetworkInformation;
using Microsoft.SqlServer.Server;
namespace MyPing
{
public class Pinger
{
[SqlFunction(DataAccess = DataAccessKind.Read)]
public static byte PingIP(string IP)
{
Ping pingSender = new Ping();
PingOptions options = new PingOptions();
options.DontFragment = true;
string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
byte[] buffer = Encoding.ASCII.GetBytes(data);
int timeout = 120;
PingReply reply = pingSender.Send(IP, timeout, buffer, options);
return (byte)(reply.Status == IPStatus.Success ? 1 : 0);
}
}
}
همانطور که مشاهده میگردد متد PingIP درون کلاس Pinger این وظیفه را بعهده خواهد داشت
مرحله دوم:
باید برای دیتابیس مورد نظر سطوح امنیت برای معرفی اسمبلی را فعال کرد که این عمل با دستور ذیل در اس کیو ال سرور محقق میگردد
ALTER DATABASE DBName SET TRUSTWORTHY ON
مرحله سوم:
معرفی اسمبلی برای SQLServer :
دستور ذیل Dll ایجاد شده در مرحله اول را برای SQLServer با دستور ذیل ایجاد میکند
Create Assembly MyPing
From 'MyPath\MyPing.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS
مرحله چهارم:
معرفی تابعی که به متد مورد نظر دسترسی داشته باشد این مرحله با دستور ذیل در SQLServer محقق میگردد :
Create Function dbo.Ping(@IP nVarChar(15))
Returns Tinyint
As
External Name MyPing.[MyPing.Pinger].PingIP
در اینجا متد Ping درون SQLServer متد PingIP درون دات نت را اجرا خواهد کرد
مرحله پنجم :
در حالت عادی CLR دات نت برای SQLServer غیرفعال است بدین منظور از دستورات ذیل در SQLServer استفاده می کنیم:
EXEC sp_configure 'clr enabled', 1
RECONFIGURE WITH OVERRIDE
مرحله ششم:
نحوه استفاده مثلا به شکل ذیل خواهد بود :
Select A='127.0.0.1',B=dbo.Ping('127.0.0.1')
Union All
Select A='172.23.29.135',B=dbo.Ping('172.23.29.135')
Union All
Select A='172.23.29.136',B=dbo.Ping('172.23.29.136')
نتیجه به شکل ذیل خواهد بود:
A B
-------------------------------
127.0.0.1 1
172.23.29.135 1
172.23.29.136 0
از این روش برای تبدیل تاریخ میلادی به شمسی و ... نیز می توان استفاده کرد
امیدوارم مفید واقع گردد
Sal_64
دوشنبه 27 شهریور 1391, 12:52 عصر
سلام - ----بازم یه دنیا تشکر ------ کلی سوال دارم - که اولیش اینه : در مرحله چهارم به این خطا بر می خورم---------- Could not find Type 'MyPing.Pinger' in assembly 'MyPing'.
ASKaffash
سه شنبه 28 شهریور 1391, 06:43 صبح
سلام
در عبارت MyPing.Pinger :
MyPing نام namespace و Pinger نام کلاس است که متد Static بنام PingIP در آن قرار دارد اگر تغییری دارید اعمال کنید در غیر اینصورت بخش سورس نوشته شده را اینجا قرار دهید تا بررسی شود
Sal_64
سه شنبه 28 شهریور 1391, 12:13 عصر
سلام
در عبارت MyPing.Pinger :
MyPing نام namespace و Pinger نام کلاس است که متد Static بنام PingIP در آن قرار دارد اگر تغییری دارید اعمال کنید در غیر اینصورت بخش سورس نوشته شده را اینجا قرار دهید تا بررسی شود
سلام- بله متوجه شدم- من قدم به قدم با مثال شما پیش رفتم - و تغییری اعمال نکردم - اما در مرحله چهار به اون مورد برخوردم-تشکر
ASKaffash
چهارشنبه 29 شهریور 1391, 06:46 صبح
سلام
آیا مرحله سوم کامل انجام شده ؟ باید مطابق شکل نمونه مشاهده گردد در ضمن حروف کوچک و بزرگ و مسیر کامل DLL یعنی MyPath خیلی مهم است (روی کامپیوتر من همه چیز کامل است)
Sal_64
چهارشنبه 29 شهریور 1391, 17:43 عصر
سلام - بله دقیقا همین مراحل انجام دادم - یه سوال آیا ورژن فریم ورک که dll باهاش ساخته شده هم مهمه ؟
Felony
پنج شنبه 30 شهریور 1391, 08:38 صبح
یه سوال آیا ورژن فریم ورک که dll باهاش ساخته شده هم مهمه ؟
بله ؛ با ورژن 3.5 پروژه رو بسازید .
Sal_64
پنج شنبه 30 شهریور 1391, 11:23 صبح
بله ؛ با ورژن 3.5 پروژه رو بسازید .
بله با همین ورژن ساختم
ASKaffash
شنبه 01 مهر 1391, 06:35 صبح
سلام
در شکل ارسالی شما چرا مسیر فایل Dll شما به صورت Hex است ؟
Sal_64
شنبه 01 مهر 1391, 12:45 عصر
سلام
در شکل ارسالی شما چرا مسیر فایل Dll شما به صورت Hex است ؟
سلام - من چیزی تغییر ندادم - میشه بگید چه شکلی باید باشه که من بصورت دستی تصحیحش کنم؟ تشکر
ASKaffash
دوشنبه 03 مهر 1391, 07:03 صبح
سلام
اسمبلی قبلی را پاک کنید و مانند مثال در مرحله 4 بجای رشته 'MyPath\MyPing.dll' مسیر کامل فایل مثلا C:\X\Y\MyPing.dll را قرار دهید
Sal_64
دوشنبه 03 مهر 1391, 08:13 صبح
سلام
اسمبلی قبلی را پاک کنید و مانند مثال در مرحله 4 بجای رشته 'MyPath\MyPing.dll' مسیر کامل فایل مثلا C:\X\Y\MyPing.dll را قرار دهید
سلام - از ابتدا هم بنده مسیر کامل وارد کردم - اما دلیل تبدیل شدنش به هگز نمیدونم-ممکن برای نمونه شما سورس اسمبلی خودتون اینجا قرار بدین -تشکر
ASKaffash
سه شنبه 04 مهر 1391, 09:32 صبح
سلام
اینهم سورس نوشته شده :
Sal_64
سه شنبه 04 مهر 1391, 11:40 صبح
سلام
اینهم سورس نوشته شده :
سلام - تشکر- منظورم سورس اسمبلی نوشته شده در sql بود
ASKaffash
چهارشنبه 05 مهر 1391, 07:04 صبح
سلام
سورسی در سمت SQLServer وجود ندارد همان مراحل را fi ترتیب در SQLServer اجرا کنید اسمبلی مورد نظر ایجاد می شود و نیازی به استفاده از ویزارد هم ندارد
Sal_64
چهارشنبه 05 مهر 1391, 12:40 عصر
سلام
سورسی در سمت SQLServer وجود ندارد همان مراحل را fi ترتیب در SQLServer اجرا کنید اسمبلی مورد نظر ایجاد می شود و نیازی به استفاده از ویزارد هم ندارد
سلام بنده مراحل به ترتیب انجام دادم - اما داخل اسمبلی آدرس مسیر dll بصورت هگز زده بود که برای شما هم جای سوال داشت - بگید چجوری دستی آدرس داخل اسمبلی درستش کنم - تشکر
ASKaffash
شنبه 08 مهر 1391, 06:35 صبح
سلام
اگر Dll شما در مسیر مثلا C:\MyDLL\MyPing.dll قرار دارد تنها راه این است :
Create Assembly MyPing From 'C:\MyDLL\MyPing.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS
Sal_64
شنبه 08 مهر 1391, 15:04 عصر
سلام
اگر Dll شما در مسیر مثلا C:\MyDLL\MyPing.dll قرار دارد تنها راه این است :
Create Assembly MyPing From 'C:\MyDLL\MyPing.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS
سلام - تشکر - بصورت دستی اصلاح شد اما دو مرتبه بصورت هگز ذخیره شده و همون خطای سابق پابرجاست :-(
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.