PDA

View Full Version : مشکل در ارسال پارامترهای فارسی به SP توسط Ado.net



amin-21
سه شنبه 28 بهمن 1393, 16:58 عصر
سلام.
یه مشکلی دارم توی فراخوانی stored procedure
یه پروسیجر دارم که یه پارامتر از نوع nvarchar داره
با ado که وصل میشه به پایگاه داده، پارامتر رو که میخوام بفرستم به پروسیجرم مشکل به وجود میاد کار نمیکنه!
پروسیجر رو تو خود sql server تست کردم درست کار میکنه
مشکل رو هم میدونم چیه اما نمیدونم چجوری باید رفعش کنم!:متفکر:

مشکل از اون N که نمیدونم چجوری و کجای string یا پارامترم بذارمش!

ممنون میشم دوستان راهنماییم کنن!

SabaSabouhi
سه شنبه 28 بهمن 1393, 17:05 عصر
سلام.
یه مشکلی دارم توی فراخوانی stored procedure
یه پروسیجر دارم که یه پارامتر از نوع nvarchar داره
با ado که وصل میشه به پایگاه داده، پارامتر رو که میخوام بفرستم به پروسیجرم مشکل به وجود میاد کار نمیکنه!
پروسیجر رو تو خود sql server تست کردم درست کار میکنه
مشکل رو هم میدونم چیه اما نمیدونم چجوری باید رفعش کنم!:متفکر:

مشکل از اون N که نمیدونم چجوری و کجای string یا پارامترم بذارمش!

ممنون میشم دوستان راهنماییم کنن!

سلام
نه دوست عزیز، ربطی به اون N نداره، nvarchar یعنی یه ستون از جنس رشته‌ که unicode می‌گیره.
نیازی هم نیست کار خاصی انجام بدی براش.
مشکل از جای دیگه هست.

صبا صبوحی

hmahdavi921
سه شنبه 28 بهمن 1393, 21:30 عصر
دوستان منم همین مشکل رو دارم .یه پراسجر داینامیک نوشتم که درست کار میکنه اما وقتی بیشتر از سه کاراکتر فارسی بهش میدی دیگه کار نمیکنه

USE [haftehbazardb]
GO
/****** Object: StoredProcedure [dbo].[pooshak_A] Script Date: 02/17/2015 22:11:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[pooshak_A]
@name_product nvarchar(50),
@first_price int,
@final_price int,
@collection_1 nvarchar(30),
@id_state tinyint
AS
BEGIN
DECLARE @SQLstring nvarchar(1000)
DECLARE @PARAMS nvarchar(1000)
set @SQLstring = 'SELECT IDproduct,name_product,first_price,final_price,max _registered_price,
final_date_view_shamsi,
count_views,image_1 from dbo.Table_pooshak where active= 0 '
if(@name_product != 'no name')
set @SQLstring = @SQLstring + ' AND name_product LIKE ''%' + @name_product + '%'''
if (@final_price != 0)
set @SQLstring = @SQLstring + ' AND first_price between '+CAST(@first_price as nvarchar(8))+' AND
'+CAST(@final_price as nvarchar(8))+''
if (@collection_1 != 'انتخاب کنید')
set @SQLstring = @SQLstring + ' AND collection_1 = @collection_1'
if (@id_state != 0)
set @SQLstring = @SQLstring + ' AND id_state ='+CAST(@id_state as nvarchar(10))
set @PARAMS='@name_product nvarchar(50),
@first_price int,
@final_price int,
@collection_1 nvarchar(30),
@id_state tinyint'
print @SQLstring
EXECUTE sp_executesql @SQLstring,
@PARAMS,
@name_product,
@first_price,
@final_price,
@collection_1,
@id_state
END

hmahdavi921
چهارشنبه 29 بهمن 1393, 06:24 صبح
هیچ کس با دستور like کار نکرده؟؟؟؟؟؟؟؟؟

SabaSabouhi
چهارشنبه 29 بهمن 1393, 09:13 صبح
هیچ کس با دستور like کار نکرده؟؟؟؟؟؟؟؟؟

سلام
دوست من، چطور می‌شه کسی با like کار نکرده باشه، شما مشکلت رو درست توضیح ندادی.
در ضمن من یه سوال برام پیش اومد. این پیچیدگی برای چیه؟
من خودم بارها از SP پویا استفاده کردم، اما تا حد ممکن سراغش نمی‌رم.

صبا صبوحی

hmahdavi921
چهارشنبه 29 بهمن 1393, 11:45 صبح
ممنون که وارد بحث شدید
ببینید با اظافه شدن این سطر یک شرط بررسی میشه که آیا محصولی وجود دارد که محتوای product_name در نام آن وجود داشته باشد؟

set @SQLstring = @SQLstring + ' AND name_product LIKE ''%' + @name_product + '%'''


حالا من این پراسیجر رو استفاده میکنم درست کار میکنه اما یه مشکل وجود داره .برای مقادیر انگلیسی(ASCII) درست کار میکنه اما برای کاراکتر های unicode مثلا کلمات فارسی تنها برای 3 کاراکتر درست جواب میده یعنی اگر برای product_name مقدار( ماش) رو بدیم درست جواب میده اما برای کلمه (ماشین) اصلا هیچ رکوردی رو برنمیگردونه.در صورتی که مقادیر متناسب با این کوئری در دیتابیس موجود هست و در این مورد هیچ شکی وجود نداره !
ضمنا تو نت خوندم به collation مربوطه که collation اس کیو ال من persian_100_CI_AS هستش.و فیلدproduct_name نوعش nvarchar(50) هستش.

ham3d1988
پنج شنبه 30 بهمن 1393, 07:47 صبح
سلام مشکل شما مربوط هست به Collation و معمولا حرف ک و ی مشکل دارن و اینطور نیست که پراسیجر شما با سه حرف کار کنه
چون ما دو حرف ی (ی و ي ) و دو نوع حرف ک (ک, ک) (عربی و فارسی) داریم
این مقاله مشکلتونو حل میکنه :
http://www.dotnettips.info/post/90/%D9%85%D8%B4%DA%A9%D9%84-%DB%8C-%D9%88-%DA%A9-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D9%88-%D8%B9%D8%B1%D8%A8%DB%8C-%D8%AF%D8%B1-%DB%8C%DA%A9-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%A7%D8%B3-%DA%A9%DB%8C%D9%88%D8%A7%D9%84-%D8%B3%D8%B1%D9%88%D8%B1

SabaSabouhi
پنج شنبه 30 بهمن 1393, 09:05 صبح
ممنون که وارد بحث شدید
ببینید با اظافه شدن این سطر یک شرط بررسی میشه که آیا محصولی وجود دارد که محتوای product_name در نام آن وجود داشته باشد؟

set @SQLstring = @SQLstring + ' AND name_product LIKE ''%' + @name_product + '%'''


حالا من این پراسیجر رو استفاده میکنم درست کار میکنه اما یه مشکل وجود داره .برای مقادیر انگلیسی(ASCII) درست کار میکنه اما برای کاراکتر های unicode مثلا کلمات فارسی تنها برای 3 کاراکتر درست جواب میده یعنی اگر برای product_name مقدار( ماش) رو بدیم درست جواب میده اما برای کلمه (ماشین) اصلا هیچ رکوردی رو برنمیگردونه.در صورتی که مقادیر متناسب با این کوئری در دیتابیس موجود هست و در این مورد هیچ شکی وجود نداره !
ضمنا تو نت خوندم به collation مربوطه که collation اس کیو ال من persian_100_CI_AS هستش.و فیلدproduct_name نوعش nvarchar(50) هستش.

سلام
دوست من، شاید من اشتباه کنم. اما گمان می‌کنم مشکل اصلی رو پیدا کردم.
مشکل شما تعداد حروف نیست، بلکه این «ی» پر دردسر هست.
متاسفانه مایکروسافت تو ویندوزش دو تا «ی» و تا «ک» داره. بسته به این که روی صفحه کلید من
کدومشون تنظیم شده باشه، تو دیتابیس یکی از این دو تا ثبت می‌شه.
به همین دلیل «ماشین» که من ثبت کردم با «ی» عربی هست، و «ماشین» که شما جستجو
می‌کنی با «ی» فارسی.
تو همون برنامه دوباره «ماشین» رو تست کن و بجای این که کلید «ی» رو با دکمه D بزنی با Shift-X
بزن و نتیجه رو بررسی کن، احتمالاً این‌بار درست کار می‌کنه.

صبا صبوحی

sajadsobh
پنج شنبه 30 بهمن 1393, 14:28 عصر
منم مثل SabaSabouhi (http://barnamenevis.org/member.php?17257-SabaSabouhi) احتمال میدم مشکل از "ک" و "ی" باشه. اگه این بود باید موقع ذخیره توی جداول، اونا رو به عربی برگردونی بعد ذخیره کنی. موقع سرچ هم به همین صورت :چشمک:

hmahdavi921
جمعه 01 اسفند 1393, 10:16 صبح
متاسفانه با حروف دیگه هم همین مشکل وجود دارد.
من کوئریمو به این صورت تغییر دادم و مقادیر دیتابیس رو هم تغییر ندادم .الان کاملا درست کار میکنه.حتی اگر حروف فارسی و انگلیسی رو با هم داشته باشیم

SELECT IDproduct,name_product,first_price,final_price,max _registered_price,final_date_view_shamsi,
count_views,image_1,ROW_NUMBER() OVER (order by first_price) AS RowNumber from
dbo.Table_asbabbazi where active= 0 and (name_product like '%' + isnull ( @name_product , name_product ) + '%' )
AND (first_price BETWEEN @first_price AND ISNULL(@final_price, final_price))
and (collection_1 like isnull ( @collection_1 , collection_1 ) )
and id_state = isnull ( @id_state , id_state )