PDA

View Full Version : ساخت sp برای جستجو



smt_414
پنج شنبه 12 مهر 1386, 22:13 عصر
سلام به همه دوستان
من تو برنامم باید بر طبق 6 آیتم عمل سرچ انجام بشه
تو یه تایپیک به نقل از استاد عزیز امین خان ثباتی یک کد مشاهده کردم که عینا همون چیزی بود که من می خواستم
پروسیجور رو طبق همون نوشتم
به جای اینکه 6 پروسیجور بنویسم , یکی نوشتم و در هر بار بر طبق یه آیتم عمل سرج رو انجام می ده
اما به مشکل بر خوردم به این صورت که برای عمل سرج بر طبق هر آیتم باید 5 تا باقی رو با */ غیر فعال کنم تا تابع جواب بده
اگر 5 تا باقی رو غیر فعال نکنم , ایروری نمی ده اما چیزی رو هم پیدا نمی کنه
کد رو هم اینجا قرار می دم , تا دوستان بتونن بهتر بررسی کنن
با تشکر

ALTER PROCEDURE search_6

(
@shd_urgent nchar(10)=null,
@name_urgent nchar(20)=null,
@family nchar(30)=null,
@level_urgent nchar(20)=null,
@sex nchar(5)=null,
@telephon nchar(15)=null,
@mobile nchar(20)=null,
@email nchar(30)=null,
@web nchar(30)=null
)
AS
select * from all_table where
(shd_urgent is null or shd_urgent like @shd_urgent) and
(name_urgent is null or name_urgent like @name_urgent) and
(family is null or family like @family) and
(level_urgent is null or level_urgent like @level_urgent) and
(sex is null or sex like @sex) and
(telephon is null or telephon like @telephon) and
(mobile is null or mobile like @mobile) and
(email is null or email like @email) and
(web is null or web like @web)

/* SET NOCOUNT ON */
RETU

whitehat
پنج شنبه 12 مهر 1386, 23:19 عصر
نیازی به */ نیست ، شما نیازی به مقدار دهی اولیه ندارید و برای هر کدام که نمی خواهید در جستجو باشد null پاس کنید

smt_414
پنج شنبه 12 مهر 1386, 23:50 عصر
سلام

شما نیازی به مقدار دهی اولیه ندارید و برای هر کدام که نمی خواهید در جستجو باشد null پاس کنید

این دقیقا کاری که انجام میدم
اما به نتیجه نمی رسم


اما به مشکل بر خوردم به این صورت که برای عمل سرج بر طبق هر آیتم باید 5 تا باقی رو با */ غیر فعال کنم تا تابع جواب بده
اگر 5 تا باقی رو غیر فعال نکنم , ایروری نمی ده اما چیزی رو هم پیدا نمی کنه:ناراحت:

whitehat
پنج شنبه 12 مهر 1386, 23:59 عصر
یعنی SP زیر جواب نمی دهد؟

ALTER PROCEDURE search_6

(
@shd_urgent nchar(10),
@name_urgent nchar(20),
@family nchar(30),
@level_urgent nchar(20),
@sex nchar(5),
@telephon nchar(15),
@mobile nchar(20),
@email nchar(30),
@web nchar(30)
)
AS
select * from all_table where
((shd_urgent is null) or (shd_urgent like @shd_urgent)) and
...

mhadvi_mahmaood
جمعه 13 مهر 1386, 00:05 صبح
اینجا هم یه چیزایی هست.
ایجاد یک SP کارآمد جهت جستجو با چند پارامتر (http://www.dotnetsource.com/fa/Forum/default.aspx?g=posts&t=1863)
جستجو در برنامه (http://www.dotnetsource.com/fa/Forum/default.aspx?g=posts&t=1857)

smt_414
جمعه 13 مهر 1386, 00:15 صبح
سلام whitehat عزیز از توجهتون ممنونم ام این کد هم جواب نداد:ناراحت:

whitehat
جمعه 13 مهر 1386, 00:26 صبح
سلام whitehat عزیز از توجهتون ممنونم ام این کد هم جواب نداد:ناراحت:
چگونه SP را فراخوانی می کنید ؟ (از تابع isnull هم می توانید کمک بگیرید)

smt_414
جمعه 13 مهر 1386, 00:38 صبح
سلام

چگونه SP را فراخوانی می کنید ؟

اینجوری

private void search_6(string s_shd, string s_name, string s_family, string s_level, string s_sex, string s_telephon, string s_mobile, string s_email, string s_web)
{

// getdata.search1.create_view();
SqlConnection objConnection = new SqlConnection("Data Source=taba;Initial Catalog=anjoman;Integrated Security=True");
DataSet objDataSet = new DataSet();
SqlDataAdapter objDataAdapter = new SqlDataAdapter();
objDataAdapter.SelectCommand = new SqlCommand();
objDataAdapter.SelectCommand.CommandText = "search_6";
objDataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
objDataAdapter.SelectCommand.Parameters.Add("@shd_urgent", s_shd);
objDataAdapter.SelectCommand.Parameters.Add("@name_urgent", s_name);
objDataAdapter.SelectCommand.Parameters.Add("@family", s_family);
objDataAdapter.SelectCommand.Parameters.Add("@level_urgent", s_level);
objDataAdapter.SelectCommand.Parameters.Add("@sex", s_sex);
objDataAdapter.SelectCommand.Parameters.Add("@telephon", s_telephon);
objDataAdapter.SelectCommand.Parameters.Add("@mobile", s_mobile);
objDataAdapter.SelectCommand.Parameters.Add("@email", s_email);
objDataAdapter.SelectCommand.Parameters.Add("@web", s_web);
objDataAdapter.SelectCommand.Connection = objConnection;
objDataAdapter.Fill(objDataSet,"all_table");
dgv_search.DataSource = objDataSet.Tables[0];
}

البته میدونم اینطور صحیح نیست منظورم کد زیره

objDataAdapter.SelectCommand.Parameters.Add("@x", x);

ولی با این وجود ایرور نمیده ام وارنینگ داره
نحوه استفاده درستش چیه؟
و همچنین مشکل اول پا بر جاست:ناراحت:

smt_414
جمعه 13 مهر 1386, 00:42 صبح
سلام mhadvi_mahmaood جان لینکی که شما معرفی کردید
من کاملتر از اون رو تو همین سایت دیدم
و باز هم از امین خان ثباتی دیدم

کد ایشون

create proc sp1
@country varchar(20)=null,
@city varchar(20)=null
as

declare @sql nvarchar(max)
DECLARE @Param nvarchar(500)
set @sql='select * from customers where 1=1'
set @param=N'@xcity varchar(20), @xcountry varchar(20)'

if @country is not null
set @sql=@sql+' and country=@xcountry'

if @city is not null
set @sql=@sql+' and city=@xcity'

print @sql
exec sp_executesql @sql,@param,@xcity=@city,@xcountry=@country
go


exec sp1 @country='uk',@city='london'
exec sp1 @city='spain'
exec sp1 @country='uk'
exec sp1

whitehat
جمعه 13 مهر 1386, 00:45 صبح
قبل از این تابع تمامی پارامتر های خود را که در جستجو شرکت ندارند برابر String.Empty یا nullقرار دهید

البته میدونم اینطور صحیح نیست منظورم کد زیرهباید ابتدا نوع را مشخص کنید و بعد Value پارامتر ها را مقدار دهید کنیدمثلا


SelectCommand.Parameters["@Web"].Value=S_web

smt_414
جمعه 13 مهر 1386, 00:54 صبح
سلام

قبل از این تابع تمامی پارامتر های خود را که در جستجو شرکت ندارند برابر String.Empty یا nullقرار دهید
اینکار رو انجام دادم

whitehat
جمعه 13 مهر 1386, 01:07 صبح
مشکی شما در سمت برنامه است ، یک بار برنامه را Trace کنید و ببینید مقادیر (Value) های هر یک از پارامتر ها به درستی null شده باشد، در ضمن روش شما برای ارسال پارامتر صحیح نیست

smt_414
جمعه 13 مهر 1386, 01:22 صبح
سلام
من کدها رو تصحیح کردم
اما زمان فراخوانی تابع, بالاترین خط حاوی پارامتر x این ایرور رو می ده

objDataAdapter.SelectCommand.Parameters["@x"].Value= x;
ایرور
An SqlParameter with ParameterName '@x is not contained by this SqlParameterCollection

در برنامه بررسی کردم در زمان فراخوانی تابع تمام مقادیر به جز موردی که باید فراخوانی شه برابر تهی بودن

mhadvi_mahmaood
جمعه 13 مهر 1386, 01:38 صبح
یکی از اون دو لینک در مورد نحوه برنامه نویسیش تو #C بود. چیزی که الان مشکل دارید. فکر میکردم که مشکلتون رو حل کنه. در هر حال متاسفم که لینکها کمکی نکرد.

whitehat
جمعه 13 مهر 1386, 14:21 عصر
ایرور
An SqlParameter with ParameterName '@x is not contained by this SqlParameterCollection
قبل از انجام این کار باید پارامتر ها را Add کنید

smt_414
جمعه 13 مهر 1386, 15:03 عصر
سلاو
تشکر مشکل رو اینطور حل کردم


objDataAdapter.SelectCommand.Parameters.Add("@web", SqlDbType.NChar, 30).Value = s_web;

اما مشکل اصلی همچنان باقیست:گریه:

برای حل اون چه کنم؟؟

whitehat
جمعه 13 مهر 1386, 16:15 عصر
شما با یک شرط ساده تست کنید (از like استفاده نکنید و از مساوی استفاده کنید) در هنگام Trace مطمئن شوید مقادیر درست ارسال می شوند، پارامتر ها را در SP مقداردهی اولیه نکنید، در صورتی که باز مشکل داشتید SP ، کد تابع اصلاح شده و تابعی که آنرا فراخوانی می کند درج کنید
موفق باشید

smt_414
جمعه 13 مهر 1386, 22:27 عصر
سلام
همونطور که گفته بودین sp رو تغیر دادم
اما.......

کدها رو اینجا میذارم
شاید دوستان بتونن با بررسی اونها مشکل رو حل کنن



ALTER PROCEDURE search_6

(
@shd_urgent nchar(10),
@name_urgent nchar(20),
@family nchar(30),
@level_urgent nchar(20),
@sex nchar(5),
@telephon nchar(15),
@mobile nchar(20),
@email nchar(30),
@web nchar(30)
)
AS
select * from all_table where
((shd_urgent is null) or (shd_urgent = @shd_urgent)) and
((name_urgent is null) or( name_urgent = @name_urgent)) and
((family is null) or (family = @family)) and
((level_urgent is null )or( level_urgent = @level_urgent)) and
((sex is null )or (sex = @sex)) and
((telephon is null) or( telephon = @telephon)) and
((mobile is null) or(mobile l= @mobile)) and
((email is null) or (email = @email)) and
((web is null )or( web = @web))
Return





private void search_6(string s_shd, string s_name, string s_family, string s_level, string s_sex, string s_telephon, string s_mobile, string s_email, string s_web)
{
SqlConnection objConnection = new SqlConnection("Data Source=taba;Initial Catalog=anjoman;Integrated Security=True");
DataSet objDataSet = new DataSet();
SqlDataAdapter objDataAdapter = new SqlDataAdapter();
objDataAdapter.SelectCommand = new SqlCommand();
objDataAdapter.SelectCommand.CommandText = "search_6";
objDataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
objDataAdapter.SelectCommand.Parameters.Add("@shd_urgent", SqlDbType.NChar, 10).Value = s_shd;
objDataAdapter.SelectCommand.Parameters.Add("@name_urgent", SqlDbType.NChar, 20).Value = s_name;
objDataAdapter.SelectCommand.Parameters.Add("@family", SqlDbType.NChar, 30).Value = s_family;
objDataAdapter.SelectCommand.Parameters.Add("@level_urgent", SqlDbType.NChar, 20).Value = s_level;
objDataAdapter.SelectCommand.Parameters.Add("@sex", SqlDbType.NChar, 5).Value = s_sex;
objDataAdapter.SelectCommand.Parameters.Add("@telephon", SqlDbType.NChar, 15).Value = s_telephon;
objDataAdapter.SelectCommand.Parameters.Add("@mobile", SqlDbType.NChar, 20).Value = s_mobile;
objDataAdapter.SelectCommand.Parameters.Add("@email", SqlDbType.NChar, 30).Value = s_email;
objDataAdapter.SelectCommand.Parameters.Add("@web", SqlDbType.NChar, 30).Value = s_web;
objDataAdapter.SelectCommand.Connection = objConnection;
objDataAdapter.Fill(objDataSet,"all_table");
dgv_search.DataSource = objDataSet.Tables[0];



با تشکر

smt_414
شنبه 14 مهر 1386, 12:50 عصر
سلام
به دوستان
sp فوق با شرط or درست کار می کنه اما با and .......
کسی می تونه راهنمایی کنه؟؟؟:قلب:

AminSobati
شنبه 14 مهر 1386, 23:03 عصر
دوست عزیزم اگر از روش OR کردن بین شرطها استفاده میکنید همین روزهاست که با افزایش حجم اطلاعات، Performance از دیتابیس شما رخت برببنده!!

whitehat
یک شنبه 15 مهر 1386, 01:24 صبح
sp فوق با شرط or درست کار می کنه اما با and .......
من فکر می کنم شرط اشتباه میشه ...آیا جواب در همه موارد صحیح است؟
در کل من مشکلی در کد شما ندیدم :( یک بار هم از تابع isnull استفاده کنید

(Isnull(shd_urgent,0)=0) or (shd_urgent = @shd_urgent)
بهتره سعی کنید با Trace کردن مشکل را حل کنید،شاید پارامترهای ورودی درست پاس داده نمی شوند

دوست عزیزم اگر از روش OR کردن بین شرطها استفاده میکنید همین روزهاست که با افزایش حجم اطلاعات، Performance از دیتابیس شما رخت برببنده!!
دقیقا با این جمله موافقم، در بسیاری از موارد این مسئله پیش می آید (به خاطر Table Scan) پس همیشه برای مسائلی از این قبیل از کوئری های داینامیک استفاده کنید(بر اساس ورودی ها کوئری را بسازید)
موفق باشید

smt_414
یک شنبه 15 مهر 1386, 23:20 عصر
سلام whitehat جان تشکر
ممنون از توجهت
از is null هم استفاده کردم
روی
این کد

objDataAdapter.Fill(objDataSet,"all_table");

این ایرور رو میده
Conversion failed when converting the nvarchar value 'x' to data type int


مثلا زمانی که با shd جستجو انجام میده روی محتوای name این ایرور رو میده
و وقتی که با name جستجو می کنه روی محتوای family .
البته توی تیبل 15 رکور کاملا شبیه به هم هست(فکر نکنم به موضوع مرتبط باشه)

whitehat
دوشنبه 16 مهر 1386, 00:29 صبح
با سلام و عرض پوزش!
من کمی در خواندن کد های شما بی دقتی کردم الان که یک بار دیگه آنها را خواندم متوجه شدم شما هم کمی بی دقتی کردید :)
شما شرط پارامتر را درست چک نمی کنید ، شرطها را بصورت زیر اصلاح کنید(نیازی به IsNull ندارید)

((@shd_urgent is null) or (shd_urgent = @shd_urgent))
موفق باشید

smt_414
دوشنبه 16 مهر 1386, 13:50 عصر
سلام
خیلی دوست داشتم بگه مشکل حل شده اما...
کد رو اونجور که گفته بودین تغییر دادم
اما باز هم فقط زمانی عمل می کنه که تنها بر اساس یکی از آیتم ها جستجو انجام شه و باقی رو با */ ببندم

در صفحه اول همین تایپیک کد دیگه ای هم از جناب ثباتی بود نظرتون چیه بر طبق اون عمل کنیم
اگه بر طبق اون بخوام کد برنامم رو تصحیح کنم
چه طور باید عمل کنم
تشکر

AminSobati
سه شنبه 17 مهر 1386, 15:18 عصر
http://www.sommarskog.se/dyn-search.html

smt_414
چهارشنبه 18 مهر 1386, 22:12 عصر
سلام
جناب ثباتی از لطفتون ممنون
بر طبق مطالب لینک فوق هم عمل کرده
اما نتیجه نگرفتم:کف:
احتمالا ایراد از برنامه است

از خیر نوشتن سرچ دینامیک گذشتم
برا هر کدوم یه sp می نویسم