سئوالاتی درباره sql

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
و اینکه استفاده از کلمه ی LIKE چجوری هه توی sql ؟
من میخوام فیلد firstName ام هرجا 3 کامه ی اولش 'hos' بود در کد زیر رو برام پیدا کنه (شبیه بود) ولی کد زیر عمل نمیکنه با اینکه توی فیلد firstName این 3 کلمه رو در اول دارم :

کد:
"SELECT * FROM myTable WHERE(firstName LIKE 'hos')"

این طور هم مینویسم اشتباه میزنه :

کد:
"SELECT * FROM myTable WHERE(firstName LIKE '%hos%')"
 

the_king

مدیرکل انجمن
و اینکه استفاده از کلمه ی LIKE چجوری هه توی sql ؟
من میخوام فیلد firstName ام هرجا 3 کامه ی اولش 'hos' بود در کد زیر رو برام پیدا کنه (شبیه بود) ولی کد زیر عمل نمیکنه با اینکه توی فیلد firstName این 3 کلمه رو در اول دارم :

کد:
"SELECT * FROM myTable WHERE(firstName LIKE 'hos')"

این طور هم مینویسم اشتباه میزنه :

کد:
"SELECT * FROM myTable WHERE(firstName LIKE '%hos%')"

'firstName LIKE 'hos یعنی نام hos باشه.
'%firstName LIKE 'hos یعنی نام با hos شروع بشه.
'firstName LIKE '%hos یعنی نام به hos ختم بشه.
'%firstName LIKE '%hos یعنی نام شامل hos باشه.
'_firstName LIKE 'hos یعنی نام با hos شروع بشه و بعدش یک کاراکتر باشه.
'__firstName LIKE 'hos یعنی نام با hos شروع بشه و بعدش دو کاراکتر باشه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون آقا علی
سئوال پست قبلش (پست 20) چی؟
:)
 

the_king

مدیرکل انجمن
سلام
این کد من چرا اشکال داره؟ میخوام اطلاعاتش برام نمایش بده اما نمیشه :

کد:
public static bool ListRecord(string TableName)
        {
            SqlConnection sql_Connection = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=" + Application.StartupPath + @"\Database1.mdf;Integrated Security=True;Connect Timeout=30");
            try
            {
                sql_Connection.Open();
                //
                SqlCommand sql_Command = new SqlCommand("SELECT * FROM "+ TableName, sql_Connection);
                SqlDataReader ReadData = sql_Command.ExecuteReader();


                for (int i = 0; i < ReadData.FieldCount; i++)
                {
                    MessageBox.Show(ReadData[i].ToString());
                }


                //
                sql_Connection.Close();
                return true;
            }
            catch (Exception Error)
            {
                sql_Connection.Close();
                MessageBox.Show(Error.Message);
                return false;
            }
        }

پیام invalid attempt to read when no data is present رو میده ولی جدول من پره و 5 تا رکورد (سطر) داره
بیشتر مشکلم توی قسمت تیکه کد :

کد:
SqlDataReader ReadData = sql_Command.ExecuteReader();


                for (int i = 0; i < ReadData.FieldCount; i++)
                {
                    MessageBox.Show(ReadData[i].ToString());
                }

در بالاست که فک کنم اشکال ازش باشه اما نمیدونم چرا؟
توصیه می کنم که اسم متغیر ها و پارامتر ها رو با حروف بزرگ شروع نکنید، بعدا خودتون هم سردرگم خواهید شد.
شما که چیزی Read نکرده اید که فیلد اش رو بخوانید.
کد:
                while (ReadData.Read())
                {
                    for (int i = 0; i < ReadData.FieldCount; i++)
                    {
                        MessageBox.Show(ReadData[i].ToString());
                    }
                }
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
توصیه می کنم که اسم متغیر ها و پارامتر ها رو با حروف بزرگ شروع نکنید، بعدا خودتون هم سردرگم خواهید شد.
شما که چیزی Read نکرده اید که فیلد اش رو بخوانید.
کد:
                while (ReadData.Read())
                {
                    for (int i = 0; i < ReadData.FieldCount; i++)
                    {
                        MessageBox.Show(ReadData[i].ToString());
                    }
                }

ممنون
من تازه با sql دارم کار میکنم و با دستورات و کلاس ها و ... اش آشنایی چندانی ندارن
ولی مگه وقتی دستور را با این کد اجرا میکنیم :

کد:
SqlDataReader ReadData = sql_Command.ExecuteReader();

یاهمون شی ای از کلاس SqlDataReader ایجاد میکنیم ، اطلاعات دیتابیس رو داخل شی ReadData نمیریزه؟
یعنی در ReadData.Read() متد Read هر بار یک رکورد رو میخونه و اطلاعاتش رو توی شی از کلاس ReadData میریزه؟ نمیشه موقع ایجاد شی از کلاس SqlDataReader توی همون متد سازنده اش بهش گفت که اطلاعات رو بخونه؟
درباره متغییرها هم چشم . سعی میکنم (ولی فکر نکنم گیج بشم . چرا مگه؟)

 
آخرین ویرایش:

the_king

مدیرکل انجمن
ممنون
من تازه با sql دارم کار میکنم و با دستورات و کلاس ها و ... اش آشنایی چندانی ندارن
ولی مگه وقتی دستور را با این کد اجرا میکنیم :

کد:
SqlDataReader ReadData = sql_Command.ExecuteReader();

یاهمون شی ای از کلاس SqlDataReader ایجاد میکنیم ، اطلاعات دیتابیس رو داخل شی ReadData نمیریزه؟
یعنی در ReadData.Read() متد Read هر بار یک رکورد رو میخونه و اطلاعاتش رو توی شی از کلاس ReadData میریزه؟ نمیشه موقع ایجاد شی از کلاس SqlDataReader توی همون متد سازنده اش بهش گفت که اطلاعات رو بخونه؟
درباره متغییرها هم چشم . سعی میکنم (ولی فکر نکنم گیج بشم . چرا مگه؟)

از اسم کلاسش مشخصه، Reader ئه، یعنی خواننده است، Table که نیست. کارش خوندن اطلاعات ئه، انباره نیست.فرض کنید که در متد سازنده هم بهش می گفتید بخونه، ماتریس نداره که اطلاعات همه سطر ها رو یکجا تحویل تون بده، یک سطر تحویل میده.
وقتی بزرگی و کوچکی حروف رو رعایت نکنید، وقتی می نویسید TableName = Name معلوم نمیشه این TableName و Name متغیر اند، مشخصه اند... تو اون لحظه که کد رو می نویسید مشکلی پیش نمیاد ولی بعدها که
کد رو مجددا می بینید دیگه اون حضور ذهن الان کمک تون نمی کنه. اگه کد رو نشون شخص دیگه ای بدید که دیگه بدتر.
وقتی اسم نشونه ای از وظیفه اش نداشته باشه باید بارها به تعریف شون مراجعه کنید تا مشخص بشه چه اسمی برای چه منظوری بوده. ReadData شبیه اسم متد ئه، متدی که کارش خوندن Data است، برای متغیر تون reader اسم مناسبتری ئه.

کد:
                var table = new DataTable();
                var adapter = new SqlDataAdapter(sql_Command);
                adapter.Fill(table);
                foreach (DataRow row in table.Rows)
                {
                    for (int i = 0; i < table.Columns.Count; i++)
                    {
                        MessageBox.Show(row[i].ToString());
                    }
                }
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون
ولی Table هه دیگه
پس آخرش چرا مینویسیم؟ :

کد:
ReadData[i]

فقط من تعجبم از اینه که اگه آرایه برمیگردونه پس باید توی راهنماش علامت آرایه که کلوشه هست را مینوشت یعنی باید مینوشت :

کد:
object[] SqlDataReader[int i]

ولی توی راهنماش نوشته :

کد:
object SqlDataReader[int i]



---------------------------------------------------------------


بعد اینکه من چرا توی شی dataGridView1 ام وقتی بصورت دستی (با کدنویسی نه) پروپرتی DataSource اش رو آدرس دیتابیس ام رو بهش میدم رکوردها رو بهم نشون نمیده و ارور زیر رو میده (ولی فیلدهاش رو نشون میده) :


99jrsqkw5jfq.jpg
 
آخرین ویرایش:

the_king

مدیرکل انجمن
ممنون
ولی Table هه دیگه
پس آخرش چرا مینویسیم؟ :

کد:
ReadData[i]
اون [ ] چه ربطی به Table بودن داره؟ اطلاعات یک سطر رو بهتون میده، برای تفکیک کردن فیلد های سطر از [ ] استفاده کرده.


فقط من تعجبم از اینه که اگه آرایه برمیگردونه پس باید توی راهنماش علامت آرایه که کلوشه هست را مینوشت یعنی باید مینوشت :

کد:
object[] SqlDataReader[int i]

ولی توی راهنماش نوشته :

کد:
object SqlDataReader[int i]





---------------------------------------------------------------

هر چیزی که [ ] داره الزاما آرایه نیست، می تونه List باشه و یا اصلا اونم نباشه، تو کلاسش فقط یک پیاده سازی برای [] this مثل [this[int index داشته باشه کافیه تا بتونه [ ] رو بکار ببره. یادمه قبلا برای [] this براتون مثال نوشته بودم.


بعد اینکه من چرا توی شی dataGridView1 ام وقتی بصورت دستی (با کدنویسی نه) پروپرتی DataSource اش رو آدرس دیتابیس ام رو بهش میدم رکوردها رو بهم نشون نمیده و ارور زیر رو میده (ولی فیلدهاش رو نشون میده) :


99jrsqkw5jfq.jpg

شما سعی کردید که یک پایگاه داده رو از طریق فایلش به عنوان یک منبع داده جدید پروژه معرفی کنید. از اونجایی که یک پایگاه داده همزمان دو بار (یا دو تا پایگاه داده با نام مشابه) نمی توانند متصل شوند بهتون پیغام خطا داده.
در نظر بگیرید که وقتی پایگاه داده به SQL Server وصل میشه مادامی که Attach شده یک فایل Readonly و Lock شده است، نه می توانید تغییر نام اش دهید و نه جابجایش کنید و یا حذف کنید. از دسترسی خارج ئه
معمولا برای ارتباط بین پایگاه داده و یک کنترل بین شون یک BindingSource قرار میگیره، نه اینکه مستقیما وصل بشه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
اون [ ] چه ربطی به Table بودن داره؟ اطلاعات یک سطر رو بهتون میده، برای تفکیک کردن فیلد های سطر از [ ] استفاده کرده.


هر چیزی که [ ] داره الزاما آرایه نیست، می تونه List باشه و یا اصلا اونم نباشه، تو کلاسش فقط یک پیاده سازی برای [] this مثل [this[int index داشته باشه کافیه تا بتونه [ ] رو بکار ببره. یادمه قبلا برای [] this براتون مثال نوشته بودم.

ممنون آقا علی
خوب این الان نه آرایه هست و نه کلاس ArrayList و از این چیزا . پس چرا شبیه ساختار آرایه هست؟
اصلا یه سئوال دیگه اینکه چرا خود همون ArrayList که اگه نگیم آرایه رو برمیگردونه ، باید بگیم آرایه رو برمیگردونه :green: (خوب عین آرایه هست دیگه) پس چرا توی راهنماش مثل همین علامت آرایه رو کنار object ای که مینویسه را نمیزاره؟ بخاطر این هست که هر عضوش را میشه یه آبجکت و از کلاس ها و نوع داده ای متفاوت داد ولی آرایه ها از یک نوع داده ای میتونن باشن؟ واسه اینه؟
کلاس SqlDataReader هم چون سطرها رو برمیگردونه و اطلاعات هر فیلدش ممکنه متفاوت باشه از نوع آبجکت برمیگردونه و چون از نوع آبجکت برمیگردونه و میشه داده هاش از انواع متفاوت باشن و از اون طرف هم آرایه ها از یک نوع داده ای هستن ، بنابراین این هم مثل ArrayList چیزی شبیه آرایه رو برمیگردونه و چون آبجکت هستن ، علامت آرایه رو ندارن (یعنی خود آرایه نیستن)؟ درسته؟
خوب با این تحلیل هم اگه پیش بریم ، باز هم سئوال پست های بالای من به جوابش نمیرسیم که گفتم چرا حتما باید متد Reader از کلاس SqlDataReader فراخونی بشه تا شی از این کلاس پر بشه؟ شما گفته بودین این کلاس Table نیست که اطلاعات رو توی خودش بریزه ولی الان شبیه آرایه عمل میکنه دیگه . من میگم چرا حتما باید متد Reader فراخونی بشه که یک سطر از دیتابیس خونده بشه و چرا همون موقعی که شی از این کلاس ایجاد میکنیم یه سطر خونده نمیشه موقع فراخونی متد سازنده اش؟ آیا بخاطر اینه که اگه این جوری بشه برای خوندن هر سطر باید یه شی ایجاد کرد و این جوری باز هر بار فقط سطر اول رو میخونه؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
فرق SQL Server و SQL Express با SQLite چیه؟
آخه اتوپلی از SQLite استفاده میکنه که دستوراتش عین اون دوتاست
SQLite رو مثل اون دو تا مایکروسافت زد؟
 

the_king

مدیرکل انجمن
سلام
فرق SQL Server و SQL Express با SQLite چیه؟
آخه اتوپلی از SQLite استفاده میکنه که دستوراتش عین اون دوتاست
SQLite رو مثل اون دو تا مایکروسافت زد؟

عینا که نه، مشابه. چون زبان هر سه شون SQL ئه که زبان متعارف مدیریت داده است ولی هر محصولی تا حدی SQL استاندارد رو پشتیبانی می کنه و معمولا هر محصولی یکسری دستورات خاص و ناسازگار با بقیه داره.
سه تا محصول متفاوته، SQL Server یک سیستم مدیریت پایگاه داده تمام عیار ئه، SQL Server Express نسخه رایگان ولی محدود و با امکانات کم اونه.
SQLite کلا در رده SQL Server و SQL Server Express نیست چون اصلا سرور نداره و فقط کتابخانه ای است که به برنامه اضافه می کنید تا با پایگاه داده ارتباط برقرار کنه، ارتباطی هم با Microsoft نداره.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون آقا علی
این درسته ؟ :
SqlDataAdapter کلاسی هست که کار کلاس SqlConnection و SqlCommand و SqlDataReader رو به تنهایی انجام میده و دیگه نیازی به استفاده از اون همه کلاس نیست و علاوه بر اون ، وقتی متد Read() از کلاس SqlDataReader فراخونی میشه ، هر بار داده ها رو سطر به سطر برمیگردونه ولی کلاس SqlDataAdapter داده های دیتابیس رو بصورت آرایه ی 2 بعدی و ... در هر چیزی مثلا در کلاس DataTable که دو بعدی هست ، ذخیره میکنه با متد Fill() اش اون هم کل اطلاعات دیتابیس رو (نه سطر به سطر در هر بار فراخونی)
یعنی علاوه بر اونایی که گفته شد ، عملکرد متد Read() از کلاس SqlDataReader برابر عملکرد متد Fill() در کلاس SqlDataAdapter هست.
درسته؟
 

vahidvm

Member
یه سئوال دوستان
توی sql server یک جدول دارم با دو ستون که اولی ID هست و دومی ستونی که اسامس هست ولی این اسامی تکراری داره مثلا 4 تا علی و 2 تا حسن و ... چجوری میشه این اسامی رو پاک کرد و فقط یکی نگه داشت؟؟؟؟؟
 

the_king

مدیرکل انجمن
ممنون آقا علی
این درسته ؟ :
SqlDataAdapter کلاسی هست که کار کلاس SqlConnection و SqlCommand و SqlDataReader رو به تنهایی انجام میده و دیگه نیازی به استفاده از اون همه کلاس نیست و علاوه بر اون ، وقتی متد Read() از کلاس SqlDataReader فراخونی میشه ، هر بار داده ها رو سطر به سطر برمیگردونه ولی کلاس SqlDataAdapter داده های دیتابیس رو بصورت آرایه ی 2 بعدی و ... در هر چیزی مثلا در کلاس DataTable که دو بعدی هست ، ذخیره میکنه با متد Fill() اش اون هم کل اطلاعات دیتابیس رو (نه سطر به سطر در هر بار فراخونی)
یعنی علاوه بر اونایی که گفته شد ، عملکرد متد Read() از کلاس SqlDataReader برابر عملکرد متد Fill() در کلاس SqlDataAdapter هست.
درسته؟
خیر، درست نیست. هیچ کدوم از این مواردی که با هم مقایسه می کنید اساسا قابل مقایسه نیستند.
 

the_king

مدیرکل انجمن
یه سئوال دوستان
توی sql server یک جدول دارم با دو ستون که اولی ID هست و دومی ستونی که اسامس هست ولی این اسامی تکراری داره مثلا 4 تا علی و 2 تا حسن و ... چجوری میشه این اسامی رو پاک کرد و فقط یکی نگه داشت؟؟؟؟؟

اگه اسم جدول MyTable و ستون دوم Name باشه، اینطوری تکراری ها رو حذف می کنیم :
کد:
DELETE FROM [B][COLOR="#0000FF"]MyTable[/COLOR][/B] WHERE [B][COLOR="#0000FF"]ID[/COLOR][/B] NOT IN (SELECT MIN([B][COLOR="#0000FF"]ID[/COLOR][/B]) FROM [B][COLOR="#0000FF"]MyTable[/COLOR][/B] GROUP BY [B][COLOR="#0000FF"]Name[/COLOR][/B])
 

vahidvm

Member
یه سوال دیگه دوستان
یه جدول رو پاک کردم و بک آپ هم تزش ندارم حدود 20 هزار خط اطلاعات داشت چوری میشه برگردونمش؟؟؟
با سپاس
 

the_king

مدیرکل انجمن
یه سوال دیگه دوستان
یه جدول رو پاک کردم و بک آپ هم تزش ندارم حدود 20 هزار خط اطلاعات داشت چوری میشه برگردونمش؟؟؟
با سپاس
وقتی از اطلاعات بک آپ نمی گیرید یعنی اون اطلاعات براتون اهمیت آنچنانی نداره. توی گوگل عبارت دانلود ApexSQL Recover رو جستجو کنید. یک ابزار بازیابی اطلاعات SQL Server ئه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
یه منبع کاملی درباره ی join کردن جدول های مختلف در یک دیتابیس میدین؟
و اینکه اساسا جوین کردن زمانی بکار میره که مقداری مربوط به یک داده در چند جدول باشه که بخوایم همه شونو select کنیم؟ درسته؟
و اگه نخوایم از طریق جوین کردن بریم ، باید به همون تعداد جدول ها ، دستور select رو نوشت که این باعث اجرای بیشتر و کندشدن برنامه میشه؟ درسته؟
 

the_king

مدیرکل انجمن
سلام
یه منبع کاملی درباره ی join کردن جدول های مختلف در یک دیتابیس میدین؟
و اینکه اساسا جوین کردن زمانی بکار میره که مقداری مربوط به یک داده در چند جدول باشه که بخوایم همه شونو select کنیم؟ درسته؟
و اگه نخوایم از طریق جوین کردن بریم ، باید به همون تعداد جدول ها ، دستور select رو نوشت که این باعث اجرای بیشتر و کندشدن برنامه میشه؟ درسته؟
www.w3schools.com - SQL Tutorial
تعداد دستورات خیلی محدود ئه، اما مسائل ای که پیش میاد که لازمه با ترکیبات مختلف SELECT کنید خیلی زیاده.
کوئری های SQL مثل ریاضیات ئه، باید درک کنید و اصولش رو یاد بگیرید، حفظ کردنی نیست. بعضی مسائل اش چندین راه حل مختلف داره که در شرایط مختلف
کارایی های متفاوتی دارند، یعنی نمیشه گفت الزاما فلان روش همیشه بالاترین کارایی رو داره.
و اینکه اساسا جوین کردن زمانی بکار میره که مقداری مربوط به یک داده در چند جدول باشه که بخوایم همه شونو select کنیم؟ درسته؟
بله، وقتی بخواهید سطر های چند جدول رو با هم ترکیب کنید از JOIN استفاده میشه.
و اگه نخوایم از طریق جوین کردن بریم ، باید به همون تعداد جدول ها ، دستور select رو نوشت که این باعث اجرای بیشتر و کندشدن برنامه میشه؟ درسته؟
معمولا JOIN ها سریعتر اند، اما الزاما همیشه اینطور نیست، در ضمن تعداد SELECT ها هم الزاما به تعداد جداول نیست.
 

جدیدترین ارسال ها

بالا