ورود

View Full Version : دستور like برای فیلد varbinary و sqlcommand



m110_110
یک شنبه 24 مرداد 1389, 13:38 عصر
با سلام
من یک فیلد varbinary توی table دارم که نوشته هایی رو که به بایت تبدیل می کنم درون اون ذخیره می کنم
حالا می خوام با دستور like یه نوشته رو درونش جستجو کنم اما نمیشه



cmd.Parameters.Add("data", SqlDbType.VarBinary).Value = bytes;


select text2 from TestTbl where text2 like @data

ممنون میشم کسی کمک کنه

mehdi.mousavi
یک شنبه 24 مرداد 1389, 15:38 عصر
با سلام
من یک فیلد varbinary توی table دارم که نوشته هایی رو که به بایت تبدیل می کنم درون اون ذخیره می کنم
حالا می خوام با دستور like یه نوشته رو درونش جستجو کنم اما نمیشه



cmd.Parameters.Add("data", SqlDbType.VarBinary).Value = bytes;


select text2 from TestTbl where text2 like @data

ممنون میشم کسی کمک کنه

سلام.
اطلاعاتی که در این فیلد نگهداری میکنید چی هستش؟ آیا واقعا این اطلاعات Binary هستن؟ اگر بله، باید کلیدی برای این جدول در نظر بگیرید نه اینکه دنبال Pattern ای توی داده های Binary این جدول باشید تا RDBMS رو به زانو در بیارید.

اگر جای VARBINARY از TEXT, NTEXT یا IMAGE استفاده کنید (اگر شدنی باشه براتون)، می تونید داده ها رو از طریق یه POINTER در Chunk های مورد نظر بخونید. این کارو میتونید توسط TEXTPTR و READTEXT انجام بدید.

اگر داده مورد نظر Text باشه، میتونید FTS رو روی SQL Server (اگر از این RDBMS استفاده میکنید) فعال کنید و از FREETEXT و CONTAINS و ... استفاده کنید.

اما اگر داده های مورد نظر واقعا باینری باشن، تنها روشی که در حال حاضر به ذهنم میرسه (ولی هرگز توصیه اش نمیکنم)، انجام این عمل از طریق نوشتن یک Extended Stored Proc. هستش.

موفق باشید.


UPDATE: اطلاعاتی که دادم قدیمی شده. الان جستجو کردم، دیدم دیگه نباید از IMAGE، TEXT یا NTEXT استفاده کرد و VARCHAR(MAX)، NVARCHAR(MAX) و VARBINARY(MAX) جایگزین اونها شده. ضمن اینکه روش دیگه ای به ذهنم رسید. اونم اینکه میتونید از FILESTREAM (http://technet.microsoft.com/en-us/library/bb933993.aspx) ها استفاده کنید. اینطوری با اون داده Binary در واقع بصورت یک فایل برخورد میشه و چیزی که دنبالش بودید میسر میشه. اما حقیقتش یادم نمیاد FileStream ها از کدوم نسخه SQL Server به بعد معرفی شدن، بنابراین توی گوگل ابتدا جستجو کنید تا ببینید آیا این قابلیت روی نسخه مورد نظر از SQL Server شما پشتیبانی میشه یا خیر.

m110_110
یک شنبه 24 مرداد 1389, 16:40 عصر
با سلام
میشه در مورد FILESTREAM (http://technet.microsoft.com/en-us/library/bb933993.aspx) ها که گفتید کمی راهنمایی کنید

mehdi.mousavi
دوشنبه 25 مرداد 1389, 21:38 عصر
با سلام میشه در مورد FILESTREAM (http://technet.microsoft.com/en-us/library/bb933993.aspx) ها که گفتید کمی راهنمایی کنید

سلام.
هنگامیکه از FILESTREAM ها استفاده کنید، SQL Server میتونه داده های VARBINARY رو جای اینکه در Page های متفاوت نگهداره (مثل هنگامیکه از FILESTREAM استفاده نمیکنید) میتونه داده های مزبور رو روی NTFS بصورت فایل نگهداره. این به این معنا هستش که دیگه ذخیره و بازیابی داده ها از طریق Engine بصورت گذشته انجام نمیشه و در حقیقت Pointer به یک فایل توسط Engine مدیریت میشه. به بیان دیگه، با استفاده از FILESTREAM ها شما بصورت مستقیم با File در ارتباط خواهید بود (یعنی سرعت بالای دسترسی به فایلها روی سیستم رو خواهید داشت) و از طرف دیگه، دیگه لازم نیست مثل اون موقعی که نام فایل رو در بانگ ذخیره می کردید و جداگانه باید خودتون فایل رو مدیریت میکردید، نگران یکپارچگی داده ها باشید.

این اطلاعات BLOB رو به دو طریق میتونید استفاده کنید:


از طریق T-SQL و دستوراتی که برای اینکار در نظر گرفته شده.
از طریق Win32 API ها.

کی باید از FILESTREAM ها استفاده کرد؟ هنگامیکه

داده VARBINARY شما بطور متوسط بیش از 1 مگابایت باشه.
دسترسی سریع به این داده Binary مد نظر باشه.
از لایه ای میانی برای اعمال منطق نرم افزار استفاده کنید.

اما این کار چه خوبی ای برای شما داره؟ تصور کنید که بتونید داده Binary مزبور رو بصورت File باز کنید (با Win32 API ها) و مستقیما با اونها مانند یه Stream عادی برخورد کنید. حالا میتونید جستجوی خودتون رو در این فایلها بر اساس منطق مورد نظر انجام بدید.

اما بازهم برای بار دوم توصیه میکنم که مجدد روی طراحی سیستم خودتون تامل کنید. این که بخواهید در یک BLOB دنبال یه Pattern خاصی بگردید (تو N تا رکورد) حقیقتا نیاز عجیبی هستش و بر این گمانم که میشه راه حل بهتری برای حل مساله ارائه داد.

موفق باشید.

m110_110
سه شنبه 26 مرداد 1389, 09:03 صبح
با سلام
ممنون از جوابتون

حقیقتا نیاز عجیبی هستش و بر این گمانم که میشه راه حل بهتری برای حل مساله ارائه داد
به امید یک راه حل
راستش قضیه از این قراره که ما یک اطلاعتی را باید به صورت کد شده درون دیتابیس ذخیره کنیم که حتی کسانی که به دیتابیس دسترسی دارند این اطلاعات قابل خواندن نباشد.یکی از راه حل ها این بود که این اطلاعات به byte تبدیل و آن ها نیز کمی تغییر یابند و در دیتابیس ذخیره گردند
همون طور که می دونید اگر نوشته ای به صورت باینری در دیتابیس ذخیره گردد می توان با یک دستور ساده مثلا در یک view آن اطلاعات را نمایش داد ولی اگر byte ها قبل از ذخیره سازی دستکاری شده باشد دیگر نمی توان بعد از convert آن را خواند . به همین دلیل ما byte ها را قبل از ذخیره سازی دستکاری می کنیم
حال خیلی راحت اطلاعات را ذخیره می کنیم و می توانیم بازیابی کنیم و دیگر در صورتی که کسی به دیتابیس دسترسی داشته باشد نیز نمی تواند اطلاعات را بازیابی کند
اما مشکلی که پیش آمده در جستجو می باشد که با انواع کار ها نیز نتوانستیم آن را انجام بدهیم
در واقع به دلیل اینکه like را قبول نمی کند
البته باید این را هم بگویم که وقتی می خواهیم یک string را درون این دیتا جستجو بکنیم به همان صورت بایت هایش را تغییر می دهیم که در این صورت مجبورا باید به صورت پارامتر از سمت کد به دیتابیس ارسال کنیم چون وقتی که بایت های نوشته مورد نظر را تغییر می دهیم به احتمال زیاد کارکتر های نامعتبری نیز به وجود می آید و فقط می توان به صورت byte به عنوان پارامتر ارسال نمود
تا حالا هم خیلی جستجو کردیم اما به نتیجه ای نرسیده ایم
راستی این را هم بگویم که ما در حال حاضر از یک نوع کدینگی استفاده می کنیم که خیلی هم عالی است اما مشکلی که دارد این است که قابل جستجو نیست
منظور اینکه مثلا اگر 11 کد شود می شود fd3 ولی اگر 1 کد شود می شود t4 و نمی توان برای 1 در این فیلد like زد