سلام
اولاً بسیار بسیار شرمنده از بابت تاخیر پیش آمده، کمی کار و مشکلات زیر و درشت داشتم که نشد زودتر خدمت برسم و حالا میبینم که کاربر saeed_rezaei هم لطف کرده اند و توضیحی دادند، من هم متنی را که حاضر کرده ام پست میکنم شاید بیشتر کمکتان کند و امیدوارم زیاد دیر نشده باشد.
--------------------------------------------------------------------
مثلاً شما میخواهید یک فیلتر سازی معمولی را با حالت پارامتری انجام دهید.
در داخل String دستور SQL خود پارامتر را یا با علامت سوال یا با یک نام که قبلاً استفاده نشده مشخص میکنید (مثلاً برای تضمین اینکه نام شما منحصر باشد و با نام یک جدول یا فیلد برخورد پیدا نکند طبق یک عرف قدیمی یک علامت @ اولش اضافه کنید بد نیست.)
SELECT * FROM tablename WHERE fieldname=@FieldName
یا
SELECT * FROM tablename WHERE fieldname=?
در حالتی که از علامت سوال استفاده میکنید، ترتیب علامت سوالها و ترتیب اضافه شدن پارامترها به Command ملاک جایگذاری میشود و وقتی از نام استفاده میکنید همان نام (FieldName@) ملاک است (ولی بهتر است ترتیب را رعایت کنید، چون بعضی از موتورهای دیتابیسها مثل موتور JET که فایلهای mdb را مدیریت میکند نام را قبول ندارد! ایراد و خطا نمیگیرد ولی با نام هم مثل علامت سوال رفتار میکند و فقط ترتیب پارامتر ها در String دستور SQL و ترتیب ارسال مقادیر در Command برایش مهم است.)
خوب پس دستور SQL را نوشتیم، طریقه مقدار دهی اش به وسیله خصوصیت Parameters شی Command است.
دستور Add یک نمونه کلاسس پارامتری اضافه میکند
دستور AddWithValue (برای SQL SERVER) یک پارامتر را با صرف داشتن نام و مقدار اضافه میکند (گرچه خودش به صورت داخلی دستور Add قبلی را اجرا میکند)
دستور AddRange یک دسته آرایه ای از پارامترها را اضافه میکند که خیلی بهتر از Add کردن تک تکی پارامترها است.
Insert هم پارامتر را در محل خاصی از نظر ترتیبی اضافه میکند.
در آخر هم که Command را با یکی از دستورات سری ExecuteXXXXXX اجرا میکنید. (که احتمالاً تفاوت سری دستورات فوق را میدانید.)
در دستورات زیر فرض شده نوع فیلد FieldName@ عددی و Int32 است.
Dim iValue As Integer
dbCommand.Parameters.Add("@FieldName", SqlDbType.Int)
یا
dbCommand.Parameters.Add("@FieldName", SqlDbType.Int, 4)
یا
dbCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@FieldName", SqlDbType.Int))
یا
dbCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@FieldName", SqlDbType.Int, 4))
dbCommand.Parameters.Item(0).Value = iValue
dbCommand.Parameters.Item("@Fieldname").Value = iValue
و یا اینکه کاملترین است و مقدار را هم در زمان Add میدهد
dbCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@FieldName", SqlDbType.Int, 4, ParameterDirection.Input, False, 0, 0, Nothing, DataRowVersion.Default, iValue))
روش پارامتری برای همه فیلدها ثابت است و نمیخواهید به چیزهای دیگر فکر کنید فقط نوع فیلد و اگر هم خواستید سایز را دستکاری کنید، مثال فوق برای رد کردن یک پارامتری Integer بود و مثال زیر برای رد کردن یک آرایه بایتی، میبینید که چندان تفاوتی نکرده!
Dim arrValue() As Byte
dbCommand.Parameters.Add("@FieldName", SqlDbType.VarBinary)
یا
dbCommand.Parameters.Add("@FieldName", SqlDbType.VarBinary, 1024)
یا
dbCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@FieldName", SqlDbType.VarBinary))
یا
dbCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@FieldName", SqlDbType.VarBinary, 1024))
dbCommand.Parameters.Item(0).Value = arrValue
dbCommand.Parameters.Item("@Fieldname").Value = arrValue
و یا اینکه کاملترین است و مقدار را هم در زمان Add میدهد
dbCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@FieldName", SqlDbType.VarBinary, 1024, ParameterDirection.Input, True, 0, 0, Nothing, DataRowVersion.Default, arrValue))
توضیح هر پارامتر هم در زمان تایپ در محیط VS.Net نشان داده میشود، مثلاً پارامتر پنجم آخرین دستور نشان میدهد که مقدار میتواند در بانک NULL هم باشد یا نه!
موفق باشید و مجدداً از بابت تاخیر عضرخواهی میکنم.