hdv212
سه شنبه 29 خرداد 1386, 00:18 صبح
سلام به همه ی برو بچز خوشتیپ بخش sql server به خصوص شما آقای ثباتی عزیز.
طبق سوالات و در خواستهای قبلی من مبنی بر جستجوی متن بی اعراب در متن با اعراب عربی در دیتابیس، مجبور شدم روی Regular Expression کار کنم و الحمدلله تونستم کلاسی بنویسم که مشکلم رو حل کنه، حالا یه مشکل بزرگتر، فرض کنید اطلاعات یعنی همون متن با اعراب عربی در دیتابیس ذخیره شده و کاربر میخواد مثلا یه جستجو در دیتابیس در مورد کلمه ی 'صراط' بکنه، حالا من میخوام خود sql (و نه برنامه ی خود من) بیاد توی دیتابیس بگرده و رکورد هایی رو که این کلمه در فیلد مربوطه وجود داره رو برگردونه (با توجه به اینکه کلمه ی مورد جستجو بی اعرابه و متن ذخیره شده در دیتابیس با اعراب)، لذا باید از Regular Expression در خود دیتابیس sql استفاده بشه تا کارایی برنامه اقزایش پیدا کنه، رو همین اساس رفتم دنبال clr table-valued function ودیدم که یکی از امکاناتش همینه یعنی میشه توش مثلا از regular expression هم استفاده کرد، حالا من یه function توی vs2005 ساختم که میخوام دو تا ورودی داشته باشه و یه جدول برگردونه حالا ورودیهاش یکی کلمه ی مورد جستجوست و دیگری فیلدی که باید جستجو توی اون انجام بشه، جدولی هم که برمیگردونه، جدول حاوی رکوردهایی است که اون کلمه توی فیلد مورد نظرش وجود دارن، حالا من نمیدونم فیلدها رو کجا بهش بدم و توی کدوم تابع پردازش روش انجام بدم(چون clr table-valued function ها دو تا تابع نیاز دارن)، اینم کد تابع هام توی vs2005 به سی شارپ :
[Microsoft.SqlServer.Server.SqlFunction(DataAccess= DataAccessKind.Read,FillRowMethodName="ContainTerm",TableDefinition="titleName nvarchar(100),text nvarchar(max)")]
public static IEnumerable SearchWithDiactritics()
{
using(SqlConnection con = new SqlConnection("Context connection=true;"))
{
string strSql = "select titleName,text from t_titles";
con.Open();
SqlCommand command = new SqlCommand(strSql,con);
SqlDataAdapter adapter = new SqlDataAdapter(command);
DataSet ds = new DataSet();
adapter.Fill(ds);
return ds.Tables[0].Rows;
}
}
public static void ContainTerm(object record, out string titleName, out string text)
{
DataRow row = (DataRow)record;
//کلاس من برای جستجوی متن بی اعراب در متن با اعراب
CRegex cr = new CRegex();
titleName = string.Empty;
text = string.Empty;
if (!(row["text"] is System.DBNull))
{
if (cr.ContainSearchTerm("صراط", (string)row["text"]))
{
titleName = (string)row["titleName"];
text = (string)row["text"];
}
}
الان من اینطوری توی sql این تابع رو فراخوانی میکنم :
select * from dbo.SearchWithDiactritics()
ولی میخوام اینطوری باشه :
select * from dbo.SearchWithDiactritics(N'صراط',textField)
در حال حاضر هم که از function استفاده میکنم یه جدول با تعدادی رکورد خالی بر میگردونه ولی نتیجه من هم توش هست که درسته(یعنی کلمه ی 'صراط' توش هست)،ولی رکورد های خالی رو چکارش کنم، دیگه اینکه تکلیف پارامترهای تابع چی میشه ؟
لطفا کمک کنید، مرسی
طبق سوالات و در خواستهای قبلی من مبنی بر جستجوی متن بی اعراب در متن با اعراب عربی در دیتابیس، مجبور شدم روی Regular Expression کار کنم و الحمدلله تونستم کلاسی بنویسم که مشکلم رو حل کنه، حالا یه مشکل بزرگتر، فرض کنید اطلاعات یعنی همون متن با اعراب عربی در دیتابیس ذخیره شده و کاربر میخواد مثلا یه جستجو در دیتابیس در مورد کلمه ی 'صراط' بکنه، حالا من میخوام خود sql (و نه برنامه ی خود من) بیاد توی دیتابیس بگرده و رکورد هایی رو که این کلمه در فیلد مربوطه وجود داره رو برگردونه (با توجه به اینکه کلمه ی مورد جستجو بی اعرابه و متن ذخیره شده در دیتابیس با اعراب)، لذا باید از Regular Expression در خود دیتابیس sql استفاده بشه تا کارایی برنامه اقزایش پیدا کنه، رو همین اساس رفتم دنبال clr table-valued function ودیدم که یکی از امکاناتش همینه یعنی میشه توش مثلا از regular expression هم استفاده کرد، حالا من یه function توی vs2005 ساختم که میخوام دو تا ورودی داشته باشه و یه جدول برگردونه حالا ورودیهاش یکی کلمه ی مورد جستجوست و دیگری فیلدی که باید جستجو توی اون انجام بشه، جدولی هم که برمیگردونه، جدول حاوی رکوردهایی است که اون کلمه توی فیلد مورد نظرش وجود دارن، حالا من نمیدونم فیلدها رو کجا بهش بدم و توی کدوم تابع پردازش روش انجام بدم(چون clr table-valued function ها دو تا تابع نیاز دارن)، اینم کد تابع هام توی vs2005 به سی شارپ :
[Microsoft.SqlServer.Server.SqlFunction(DataAccess= DataAccessKind.Read,FillRowMethodName="ContainTerm",TableDefinition="titleName nvarchar(100),text nvarchar(max)")]
public static IEnumerable SearchWithDiactritics()
{
using(SqlConnection con = new SqlConnection("Context connection=true;"))
{
string strSql = "select titleName,text from t_titles";
con.Open();
SqlCommand command = new SqlCommand(strSql,con);
SqlDataAdapter adapter = new SqlDataAdapter(command);
DataSet ds = new DataSet();
adapter.Fill(ds);
return ds.Tables[0].Rows;
}
}
public static void ContainTerm(object record, out string titleName, out string text)
{
DataRow row = (DataRow)record;
//کلاس من برای جستجوی متن بی اعراب در متن با اعراب
CRegex cr = new CRegex();
titleName = string.Empty;
text = string.Empty;
if (!(row["text"] is System.DBNull))
{
if (cr.ContainSearchTerm("صراط", (string)row["text"]))
{
titleName = (string)row["titleName"];
text = (string)row["text"];
}
}
الان من اینطوری توی sql این تابع رو فراخوانی میکنم :
select * from dbo.SearchWithDiactritics()
ولی میخوام اینطوری باشه :
select * from dbo.SearchWithDiactritics(N'صراط',textField)
در حال حاضر هم که از function استفاده میکنم یه جدول با تعدادی رکورد خالی بر میگردونه ولی نتیجه من هم توش هست که درسته(یعنی کلمه ی 'صراط' توش هست)،ولی رکورد های خالی رو چکارش کنم، دیگه اینکه تکلیف پارامترهای تابع چی میشه ؟
لطفا کمک کنید، مرسی