PDA

View Full Version : سوال: جستجو در پایگاه داده



f_arab
دوشنبه 26 مهر 1389, 09:49 صبح
سلام دوستان عزیز
من برای اینکه از طریق برنامه پایگاه داده رو جستجو کنم دستورات مربوط به جستجو رو باید تو برنامه و برای bottun جستجو بنویسم یا باید توی پایگاه داده با استفاده از دستورات sql جستجو را انجام بدم و از طریق برنامه فقط به دستورات نوشته شده تو پایگاه داده متصل بشم؟
ممنون میشم اگه کمک کنید:لبخندساده:

حمیدرضاصادقیان
دوشنبه 26 مهر 1389, 10:25 صبح
سلام.به هر دو روشی که گفتید میشه کار کرد.فرقشون در این هست که در روش اول هردفعه برای اجرای دستور شما اگر به صورت یک رشته sql باشه اون دستور شما باید complie بشه و براش یک Execution plan ساخته بشه ولی اگر از Sp در سمت سرور استفاده کرده و فقط بهش پارامتر پاس بدید و مقدارتون رو بگیرید دفعه اول که اون sp اجرا می شود اون plan براش ساخته میشه و دفعات بعد از همون Plan ساخته شده استفاده میکنه که همین امر موجب کاهش ترافیک شبکه شما همچنین افزایش سرعت برنامه شما خواهد شد.
موفق باشید

f_arab
دوشنبه 26 مهر 1389, 15:19 عصر
سلام
اگه بخوام از روش دوم یعنی استفاده از دستورات جستجو در sql این کارو انجام بدم باید چه کار کنم؟ میشه کمی منو راهنمایی کنید:متفکر:

حمیدرضاصادقیان
دوشنبه 26 مهر 1389, 15:56 عصر
سلام.فرض کنید یک sp دارید به نام جستجو با پارمتر مثلا نام به شکل زیر:


Create Procedure UspSearch @name nvarchar(20) As
Select name from table1 where name=@name
Go

به این صورت هم ازش استفاده میشه.



exec Uspsearch 'Hamid'

f_arab
سه شنبه 27 مهر 1389, 11:18 صبح
سلام
میشه توضیح بدین که منظورتون از sp چیه؟ راستش من مبتدی هستم و تابحال توی sql کدنویسی نکردم و حتی کاربرد کدنویسی در sql رو نمیدونم چون تمام کارهایی که من تابحال انجام دادم همه به صورت عملی قابل انجام بوده و نیازی نبوده که خودم مستقیما کد اونو بنویسم. البته دستورات select رو تقریبا میدونم و میدونم چطور باید query بگیرم ولی تابحال تابعی ایجاد نکردم و از دستوراتش در برنامه استفاده نکردم.
با عرض شرمندگی فراوان ممنون میشم منو راهنمایی کنید:خجالت:

حمیدرضاصادقیان
سه شنبه 27 مهر 1389, 11:32 صبح
سلام.منظور از sp ، Stored procedure هست. روالهایی هستند که یک سری عملیاتی که شما در آن نوشتید رو انجام میدن.میتوانن مقادیر ورودی و خروجی داشته باشند. به دلیل ساختار اجرایی آنها، سرعت آنها بالاتر از Query هایی هست که شما به صورت داینامیک می نویسید. البته بستگی به نوع کوئری که می نویسید هم داره.
میتونید برای توضیحات بیشتر به لینک زیر مراجعه کنید.
Stored procedure (http://msdn.microsoft.com/en-us/library/aa214379(v=SQL.80).aspx)

Reza_Yarahmadi
سه شنبه 27 مهر 1389, 12:13 عصر
در منطق فرقي بين اينكه دستور رو مستقيم بنويسيد و به بانك بفرستيد و نتيجه رو دريافت كنيد با اينكه دستورات رو بصورت SP بنويسيد و اونو از بيرون صدا كنيد وجود نداره. در هر صورت شما يكسري اطلاعات به بانك ارسال ميكنيد و خروجي اون رو دريافت ميكنيد پس فكر نكنيد قضيه خيلي پيچيده است!!
فقط چون نوشتن دستورات توي SQL Server امكانات بيشتري (از همه نظر) فراهم ميكنه بهتر اينه كه به اين صورت عمل كنيد.
طريقه كد نويسي هم فرق زيادي نميكنه
فرض كني SP جناب صادقيان رو ساختيد براي كد نويسي توي برنامه به صورت زير عمل ميشه عمل كرد

SqlConnection conn = new SqlConnection("Connection String");
SqlDataAdapter da = new SqlDataAdapter("UspSearch", conn);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.SelectCommand.Parameters.AddWithValue("@name", textBox1.Text);
DataSet ds = new DataSet();
da.Fill(ds);
dataGridView1.DataSource = ds.Tables[0];توي اين مثال نتيجه ابتدا توي DataSet ريخته ميشه و بعد توي گريد نمايش داده ميشه.
به همين راحتي!:چشمک:

حمیدرضاصادقیان
سه شنبه 27 مهر 1389, 12:47 عصر
در منطق فرقي بين اينكه دستور رو مستقيم بنويسيد و به بانك بفرستيد و نتيجه رو دريافت كنيد با اينكه دستورات رو بصورت SP بنويسيد و اونو از بيرون صدا كنيد وجود نداره. در هر صورت شما يكسري اطلاعات به بانك ارسال ميكنيد و خروجي اون رو دريافت ميكنيد پس فكر نكنيد قضيه خيلي پيچيده است!!

سلام.البته خیلی خیلی هم بدون تفاوت نیستن. اولین بحثش برمیگرده به بحث Performance و نوع اجرا کردن دستورات و سرعت اجرای اونها.دومین مورد برمیگرده به بحث امنیت اطلاعات ارسالی در شبکه.
سومین مورد برمیگرده به بحث Maintenance کد.
موارد اختلافی زیادی باهم دارند و گرنه مایکروسافت نمیومد یک کار بیهوده انجام بده.

Reza_Yarahmadi
سه شنبه 27 مهر 1389, 12:57 عصر
من حرفي خلاف صحبت شما نزدم

نوشتن دستورات توي SQL Server امكانات بيشتري (از همه نظر) فراهم ميكنه
اين بديهي كه 1001 اختلاف وجود داره كه خيلي هاشون به تنهايي ميتونه دليل به استفاده از نوشتن دستورات درون SQL Server و صدا زدن از بيرون باشه.
ولي منظور من از منطق از ديدگاه App بود. از ديدگاه App يكسري اطلاعات شامل نام سرور ، نام بانك ، كوئري مورد نظر و .... به بانك ارسال ميشه و نتيجه اي دريافت ميشه. حالا ممكنه كوئري اسم SP باشه ممكنه دستورات مستقيم نوشته شده باشه ، براي Appفرقي نميكنه اين براي SQL Server كه فرق داره.

حمیدرضاصادقیان
سه شنبه 27 مهر 1389, 13:48 عصر
سلام. البته بازهم مقداری تفاوت وجود داره.درسته هردو رشته ارسال میکنند. ولی باز از لحاظ امنیت روش ارسال Query به Sql خطرآفرین هست و کسی که داره packet ها رو Sniff میکنه میتونه مشکل ایجاد کنه ولی در روش دوم شما نهایتا چندتا پارامتر پاس میدید.
اولا میزان حجم داده ارسالی بسیار کمتر است دوما از لحاظ امنیتی نیز از امنیت بالاتری برخوردار است.

Reza_Yarahmadi
سه شنبه 27 مهر 1389, 14:09 عصر
قبل از ادامه دادن بگم كه قصد كلكل يا اثبات و يا هر چيز ديگه اي ندارم فقط قصدم اينه كه اطلاعات خودم رو بيشتر كنم. پس اميدوارم مثبت به اين قضيه نگاه كنيد:چشمک:

سلام. البته بازهم مقداری تفاوت وجود داره.درسته هردو رشته ارسال میکنند. ولی باز از لحاظ امنیت روش ارسال Query به Sql خطرآفرین هست و کسی که داره packet ها رو Sniff میکنه میتونه مشکل ایجاد کنه ولی در روش دوم شما نهایتا چندتا پارامتر پاس میدید.
ولي تا جايي كه من شنيدم دات نت (از 2 به بعد) اين مشكلات (مخصوصا SQL injection) رو برطرف كرده

اولا میزان حجم داده ارسالی بسیار کمتر است دوما از لحاظ امنیتی نیز از امنیت بالاتری برخوردار است.
حجم داده وابسته به پارامترهاست و چون در هر دو حالت پارامترها يكسان هستند فرقي نداره‌‌ (چند كاراكتر مربوط به كوئري چندان تاثيري در حجم داده ارسالي نداره)

حمیدرضاصادقیان
سه شنبه 27 مهر 1389, 14:41 عصر
سلام.اتفاقا این جور بحثها خیلی مناسب هست و باعث ارتقای سطح علمی کاربران میشه.
در مورد دات نت اطلاعی ندارم و نظری هم نمیدم.
ولی وقتی شما دارید query رو ارسال میکنید کافیه با profiler اون سرور رو لاگشو بگیرید اونوقت میبینید چه تفاوتی وجود داره. هم میزان حجم ارسالی رو بهتون نمایش میده هم میزان ترافیک رو بهتون نمایش میده.

Reza_Yarahmadi
سه شنبه 27 مهر 1389, 15:25 عصر
شما در مورد يك سرور با ترافيك بالا و كوئري هاي حجيم صحبت ميكنيد. ولي حرف من در مورد يك كوئري اونم از نوع معموليش هست. اختلاف اطلاعات ارسالي فقط در تعداد كاراكترهاي كوئري است و نه بيشتر.

f_arab
چهارشنبه 28 مهر 1389, 09:15 صبح
سلام
از راهنماییهای همه دوستان واقعا ممنونم:چشمک:
فقط میشه به من بگین که برای ایجاد sp باید وارد کدوم قسمت از sql بشم؟

Reza_Yarahmadi
چهارشنبه 28 مهر 1389, 09:29 صبح
فقط میشه به من بگین که برای ایجاد sp باید وارد کدوم قسمت از sql بشم؟
توي SQL Server Management Studio وارد ديتا بيس مورد نظر بشيد درون پوشه Programmability روي Stored Procedures راست كليك كنيد و New... بزنيد.
براي جزئيات بيشتر ميتونيد توي سايت جستجو كنيد. مقالات تقريبا كاملي در اين زمينه توي سايت وجود داره. با كمك اونها راحتتر به خواسته هاتون ميرسيد.

f_arab
شنبه 01 آبان 1389, 14:23 عصر
سلام
من یک sp ایجاد کردم اما هنگام اجرای برنامه وقتی به خط da.fill(ds) میرسه میگه نمیتونه sp ای با نام search پیدا کنه دلیلش چیه؟:متفکر:
ممنون

Reza_Yarahmadi
شنبه 01 آبان 1389, 14:35 عصر
احتمال داره تنظيمات اتصال به بانك(توي برنامه) مشكل داشته باشه و يا اينكه كدهايي كه براي اجرا مينويسيد مشكل داشته باشه.
لطفا كدهاي خودتون رو اينجا بذاريد تا بهتر بشه كمكتون كرد

f_arab
شنبه 01 آبان 1389, 14:43 عصر
Imports System.Data
Imports System.Data.SqlClient
Public Class Form1

Dim connectionstring As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\test.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
Dim con As New SqlConnection(connectionstring)
Dim da As New SqlDataAdapter("search", con)
Dim ds As New DataSet()

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'TODO: This line of code loads data into the 'TestDataSet.Table_1' table. You can move, or remove it, as needed.
Me.Table_1TableAdapter.Fill(Me.TestDataSet.Table_1 )
Me.Table_1TableAdapter.Update(Me.TestDataSet.Table _1)

End Sub

Private Sub btnsearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnsearch.Click

da.SelectCommand.CommandType = CommandType.StoredProcedure
da.SelectCommand.Parameters.AddWithValue("@name", TextBox1.Text)
da.Fill(ds)
dg.DataSource = ds.Tables
End Sub
End Class

Reza_Yarahmadi
شنبه 01 آبان 1389, 15:12 عصر
به نظر كد مشكلي نداره
چون كدتون نشون ميده از ويزارد استفاده كرديد حدس ميزنم مجبور شديد فايل بانك رو اضافه بر كنار فايل اجرايي توي پوشه سورس برنامه هم كپي كرده باشيد. اگر اينطوري چك كنيد كه SP مورد نظر توي بانك كنار فايل اجرايي وجود داشته باشه (ممكنه SP رو به بانك درون پوشه سورس اضافه كرده باشيد)

f_arab
شنبه 01 آبان 1389, 21:51 عصر
سلام ممنون از راهنماییتون
مشکلو پیدا کردم.وقتی دیتابیسو به برنامه اضافه میکردم فقط کنار جدول مورد نظرم علامت زده بودم و گزینه sp رو اتخاب نکرده بودم.:چشمک:
ولی الان مشکل دیگه ای پیدا شده :افسرده:برنامه بدون هیچ خطایی اجرا میشه ولی وقتی دوی دکمه جستجو کلیک میکنم به جای اینکه رکورد پیداشده رو توی دیتاگرید نشون بده کلا محتویات اونو خالی میکنه یعنی دیگه هیچ رکوردی حتی اونهایی که قبلا نشون داده می شدند توی دیتاگرید نیستند
همون کد بالا رو هم اجرا کردم
لطفا راهنمایی کنید
متشکرم:تشویق:

Reza_Yarahmadi
شنبه 01 آبان 1389, 22:15 عصر
بخش آخر کدتون رو به صورت زیر تغییر بدید

dg.DataSource = ds.Tables[0]
در صورت درست نشدن مشکل از دستور SQL شماست لطفا کد SP اینجا بذارید.

f_arab
یک شنبه 02 آبان 1389, 09:13 صبح
سلام،بخش آخر کد رو وقتی به اون شکلی که شما گفتید درست میکنم برنامه خطا میگیره.
اگه ممکنه کمی در مورد دو دستور اول هم توضیح بدین


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[search]
@name nvarchar(20)
AS
SELECT * from table_1 where fname=@name

Reza_Yarahmadi
یک شنبه 02 آبان 1389, 09:38 صبح
سلام،بخش آخر کد رو وقتی به اون شکلی که شما گفتید درست میکنم برنامه خطا میگیره.
وقتي جايي خطا ميده خطاش رو اينجا بذاريد تا بشه فهميد علتش چيه.

اگه ممکنه کمی در مورد دو دستور اول هم توضیح بدین
اون دستورات ميشه گفت تنظيمات نحوه كامپايل و اجراي كدها رو معلوم ميكنه.
براي نمونه كد set ANSI_NULLS ON تعيين ميكنه كه در جستجو فيلدهاي Null رو چطور در نظر بگيره اگر ON باشه ، اگر شرط ColumnName = Null رو بنويسيد هيچ ركوردي بر نميگردونه اگر هم ColumnName <> Null بنويسيد بازم هيچ ركوردي بر نميگردونه ولي اگر OFF باشه شرطها به همون صورتي كه هستند چك ميشه.
در حالت كلي هر جا ، هر دستوري ، ... مشكلي داشتيد با انتخاب بخشي كه مشكل داريد و زدن F1 ميتونيد از Help خود SQL Server استفاده كنيد.

f_arab
یک شنبه 02 آبان 1389, 15:15 عصر
از راهنماییتون ممنونم تو خط آخر کد به جای کروشه از پرانتز استفاده کردم درست شد
یه سؤال دیگه هم داشتم: برای اینکه وقتی دیتابیس رو آپدیت می کنیم، تغییرات اون به برنامه هم اِعمال بشه باید چه کار کنیم.
من چندتا sp جدید درست کردم ولی برنامه اونا رو نمیشناسه در واقع هر تغییری که بعد از اضافه کردن دیتا بیس به برنامه، ایجاد کردم به برنامه وارد نمیشه حتی رکوردهای جدولم رو توی sql اضافه کردم ولی تو برنامه فقط رکوردهای قدیمی دیده مشن
باید چه کار کنم؟:ناراحت:
ببخشید اگه زیاد سؤال میپرسم:خجالت:

Reza_Yarahmadi
یک شنبه 02 آبان 1389, 16:20 عصر
یه سؤال دیگه هم داشتم: برای اینکه وقتی دیتابیس رو آپدیت می کنیم، تغییرات اون به برنامه هم اِعمال بشه باید چه کار کنیم.
بعد از تغيير دوباره اطلاعات رو از بانك بخونيد.

من چندتا sp جدید درست کردم ولی برنامه اونا رو نمیشناسه در واقع هر تغییری که بعد از اضافه کردن دیتا بیس به برنامه، ایجاد کردم به برنامه وارد نمیشه حتی رکوردهای جدولم رو توی sql اضافه کردم ولی تو برنامه فقط رکوردهای قدیمی دیده مشن
در صورت نشناختن پيغام خطا ميده.
اگر دستي وارد كرديد و باز نشون نميده به اين معني كه برنامه شما از بانك ديگه اي داره ميخونه. اون كانكشني كه بالا گذاشتيد مربوط به بانك كنار فايل اجرايي (exe) برنامه است.

f_arab
یک شنبه 02 آبان 1389, 18:34 عصر
بعد از تغيير دوباره اطلاعات رو از بانك بخونيد.

منظورتون از اینکه دوباره اطلاعات رو از بانک بخونم چیه میشه بیشتر توضیح بدین:متفکر:

Reza_Yarahmadi
یک شنبه 02 آبان 1389, 19:42 عصر
منظورتون از اینکه دوباره اطلاعات رو از بانک بخونم چیه میشه بیشتر توضیح بدین:متفکر:
شما یک جستجو (Select)روی بانک انجام میدید و توی گرید نمایش میدید ، بعد از تغییرات دوباره همین جستجو رو انجام بدید.

nazanin0
سه شنبه 04 آبان 1389, 09:03 صبح
شما یک جستجو (Select)روی بانک انجام میدید و توی گرید نمایش میدید ، بعد از تغییرات دوباره همین جستجو رو انجام بدید.

سلام
من تو برنامه نویسی تازه کارم ولی فکر می کنم که بهتر از دستور update بر روی دکمه و از دستور fill در form_load استفاده بشه به نظر شما اشتباه می کنم؟