نمایش نتایج 1 تا 12 از 12

نام تاپیک: یه مشکل در جست و جو در پایگاه به روش کدنویسی

  1. #1
    کاربر دائمی
    تاریخ عضویت
    خرداد 1391
    محل زندگی
    اصفهان
    سن
    33
    پست
    181

    یه مشکل در جست و جو در پایگاه به روش کدنویسی

    با سلام
    من برای insert می خوام قبلش با یک تابع بررسی کنم که آیا کد عضویتی که کاربر وارد کرده در پایگاه وجود داره یا خیر. اما با مشکل مواجه شدم.
    دو تا کلاس دارم یکی به نام dal که تنظیمات پایگاه توشه. و یکی به نام member که توابع و دستورات مربوط به فرم رو توش می نویسم و سپس توی فرمم اون رو فراخونی می کنم.
    این تابعیه که توی کلاس member نوشتم.

    دستورات و تابع زیر درسته؟ توی تابع زیر چه جوری باید بفهمم که دستور select مقداری رو برگردونده یا خیر.

    public void SearchMember(string txtbox)
    {
    DAL.DatabaseConnection dal = new DAL.DatabaseConnection();
    dal.Connect();
    string sql = "select * from members where membercode='%' + txtbox + '%' ";
    dal.Execute(sql);
    dal.DisConnect();


    }


    برای فراخونی توی فرم هم از دستور
    BLLMembers.SearchMember(txtMembercode.Text)
    استفاده کردم.
    ممنون میشم راهنمایی کنین.
    آخرین ویرایش به وسیله farzadkamali : سه شنبه 14 مرداد 1393 در 23:44 عصر

  2. #2
    کاربر دائمی
    تاریخ عضویت
    دی 1383
    محل زندگی
    اصفهان
    پست
    1,436

    نقل قول: یه مشکل در جست و جو در پایگاه به روش کدنویسی

    خوب اینجا مشخص نیست شما در dal.Execute چی نوشتین؟ ظاهرا از یکی از متدهای Execute مربوط به SqlCommand استفاده کردین. در مواقعی که فقط میخواین ببینید مقداری برگشت داده شده یا نه، میتونید از متد ExecuteNonQuery مربوط به SqlCommand استفاده کنید. خروجی این متد تعداد سطرهای تحت تاثیر اجرای Query هست که اگه 0 باشه یعنی هیچ مقداری SELECT نشده. در ضمن اگه شما میخواین فقط وجود یا عدم وجود رو بررسی کنید نیازی نیست که با * همه فیلدهای رو بی جهت SELECT کنید. میتونید فقط یک فیلد (مثلا Id) رو انتخاب کنید.
    --
    راه حل دیگه میتونه این باشه که شما بجای * SELECT از (*)SELECT COUNT در Query استفاده کنید و تعداد رکورد هایی که با شرط مورد نظر مطابقت دارن رو دریافت کنید. در این حالت مقدار خروجی (تعداد) رو میتونید با متد ExecuteScalar مربوط به SqlCommand ( با cast کردن خروجی که از نوع object هست به int) بدست بیارین و با 0 مقایسه کنید...

  3. #3
    کاربر دائمی
    تاریخ عضویت
    خرداد 1391
    محل زندگی
    اصفهان
    سن
    33
    پست
    181

    نقل قول: یه مشکل در جست و جو در پایگاه به روش کدنویسی

    نقل قول نوشته شده توسط plus مشاهده تاپیک
    خوب اینجا مشخص نیست شما در dal.Execute چی نوشتین؟ ظاهرا از یکی از متدهای Execute مربوط به SqlCommand استفاده کردین. در مواقعی که فقط میخواین ببینید مقداری برگشت داده شده یا نه، میتونید از متد ExecuteNonQuery مربوط به SqlCommand استفاده کنید. خروجی این متد تعداد سطرهای تحت تاثیر اجرای Query هست که اگه 0 باشه یعنی هیچ مقداری SELECT نشده. در ضمن اگه شما میخواین فقط وجود یا عدم وجود رو بررسی کنید نیازی نیست که با * همه فیلدهای رو بی جهت SELECT کنید. میتونید فقط یک فیلد (مثلا Id) رو انتخاب کنید.
    --
    راه حل دیگه میتونه این باشه که شما بجای * SELECT از (*)SELECT COUNT در Query استفاده کنید و تعداد رکورد هایی که با شرط مورد نظر مطابقت دارن رو دریافت کنید. در این حالت مقدار خروجی (تعداد) رو میتونید با متد ExecuteScalar مربوط به SqlCommand ( با cast کردن خروجی که از نوع object هست به int) بدست بیارین و با 0 مقایسه کنید...

    SqlConnection con;
    SqlCommand com;
    SqlDataAdapter da;

    public DatabaseConnection()
    {
    con = new SqlConnection();
    com = new SqlCommand();
    da = new SqlDataAdapter();
    com.Connection = con;
    da.SelectCommand = com;
    }

    public void Connect()
    {
    con.ConnectionString = @"Data Source=.;Initial Catalog=DB;Integrated Security=True";
    con.Open();
    }

    public void DisConnect()
    {
    con.Close();
    }

    public void Execute(string SQL)
    {
    com.CommandText = SQL;
    com.ExecuteNonQuery();
    }

    این دستورات مربوط به اتصال هست.
    درسته من از ExecuteNonQuery استفاده کردم. خروجی متد ExecuteNonQuery رو چه جوری میشه بررسی کرد.
    آخرین ویرایش به وسیله farzadkamali : سه شنبه 14 مرداد 1393 در 18:01 عصر

  4. #4
    کاربر دائمی آواتار mz6488
    تاریخ عضویت
    تیر 1391
    محل زندگی
    قشم
    پست
    429

    نقل قول: یه مشکل در جست و جو در پایگاه به روش کدنویسی

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

    public static string getItem(string sql)
    {
    object obj;
    string s="";

    connect();

    cmd.Connection = con;
    cmd.CommandText = sql;
    obj = cmd.ExecuteScalar();

    if (obj== null )
    s = "";
    else
    s =obj.ToString();

    disConnect();
    return s;
    }


    بعد میاین شرط میذارین که اگه مقدار استرینگ مخالف "" بود یعنی اینکه همچین کدی وجود داره.تابع رو خلاصه نوشتم

  5. #5
    کاربر دائمی
    تاریخ عضویت
    دی 1383
    محل زندگی
    اصفهان
    پست
    1,436

    نقل قول: یه مشکل در جست و جو در پایگاه به روش کدنویسی

    نقل قول نوشته شده توسط farzadkamali مشاهده تاپیک
    این دستورات مربوط به اتصال هست.
    درسته من از ExecuteNonQuery استفاده کردم. خروجی متد ExecuteNonQuery رو چه جوری میشه بررسی کرد.
    خروجی یک int هست که تعداد سطرهای تحت تاثیر رو برمیگردونه.در این مورد شما، 0 بودن یعنی هیچ رکوردی انتخاب نشده و بیش از 0 هم تعداد رکوردهای انتخاب شده هست.
    میتونید متدی که با نام Execute تعریف کردین رو خروجیش رو int کنید و در بدنه ش، مقدار com.ExecuteNonQuery رو برگردونید.
    بعد از اون، در متد SearchMember مقدار خروجی Execute رو بررسی کنید که اگه بزرگتر از 0 باشه یعنی حداقل یک سطر انتخاب شده (یک member وجود داره).

  6. #6
    کاربر دائمی
    تاریخ عضویت
    مهر 1389
    محل زندگی
    دزفول شهر آب های خروشان
    پست
    148

    نقل قول: یه مشکل در جست و جو در پایگاه به روش کدنویسی

    سلام
    دو روش برای این کار به شما پیشنهاد می کنم.
    روش بهتر: یکی از خصوصیات خوب Sql ایجاد فیلد یونیک می باشد.
    به طور پیش فرض کلید اصلی یونیک هستش یعنی نمیتونه تکراری باشه. ولی نکته ای وجود داره. فرض تو جدول هم ID داریم که از نوع ایدین تیتی هستش یعنی خودش مقدا میگیره بعد از درج هر کاربر و یک فیلد بنام کد ملی هم داریم که کاربر این فیلد واراد میکنه.
    بهترین کار در این موقع این است که درون SQL server بری و فیلد کد ملی رو اندیس بزاری و خاصیت یونیک اون رو فعال کنی.
    اینطوری اگه میخواست کاربر رکورد تکراری وارد کنه مثلا تو سیشارپ خطا به وجود میاد و کنترل به کچ میره و شما میتونی اونجا پیغام مربوطه رو برای کاربر نمایش بدی.
    روش دیگه وقتی به کار میره که مثلا میخوای فیلد نام و نام خانوادگی تکراری نباشه. برای این کار:
    قبل از عمل insert تو جدول میای یک شرط ساده میزاری که :
    if not exis (select * from student where name=@name and Family=@family)

    که Name@ و Family@ رو به صورت پارامتر برای sql server می فرستی:

    اگه شرط بالا بر قرار شد دستورات insert رو شروع کن.

  7. #7
    کاربر دائمی
    تاریخ عضویت
    خرداد 1391
    محل زندگی
    اصفهان
    سن
    33
    پست
    181

    نقل قول: یه مشکل در جست و جو در پایگاه به روش کدنویسی

    نقل قول نوشته شده توسط plus مشاهده تاپیک
    خروجی یک int هست که تعداد سطرهای تحت تاثیر رو برمیگردونه.در این مورد شما، 0 بودن یعنی هیچ رکوردی انتخاب نشده و بیش از 0 هم تعداد رکوردهای انتخاب شده هست.
    میتونید متدی که با نام Execute تعریف کردین رو خروجیش رو int کنید و در بدنه ش، مقدار com.ExecuteNonQuery رو برگردونید.
    بعد از اون، در متد SearchMember مقدار خروجی Execute رو بررسی کنید که اگه بزرگتر از 0 باشه یعنی حداقل یک سطر انتخاب شده (یک member وجود داره).
    به دستور sql گیر میده. به txtbox گیر میده. دستور Sql درسته؟
    از روشی که گفتید استفاده کردم. اما قبل اون به دستور گیر میده. چرا؟

    public int execute(string SQL)
    {
    com.CommandText = SQL;
    return com.ExecuteNonQuery();
    }



    public void SearchMember(string txtbox)
    {
    dal.Connect();
    string sql = "select * from members where membercode='%' + txtbox + '%'";
    if (dal.executed(sql)>0)
    FMessegeBox.FarsiMessegeBox.Show("وجود دارد");
    else
    FMessegeBox.FarsiMessegeBox.Show("وجود ندارد");

    dal.DisConnect();
    }



    private void btnOK_Click(object sender, EventArgs e)
    {
    BLLMembers.SearchMember(txtMembercode.Text);
    }


    دستوراتی که زدم درسته؟

  8. #8
    کاربر دائمی
    تاریخ عضویت
    دی 1383
    محل زندگی
    اصفهان
    پست
    1,436

    نقل قول: یه مشکل در جست و جو در پایگاه به روش کدنویسی

    string sql = "select * from members where membercode=" + txtbox;

    اگه نوع membercode رشته ای هست:
    string sql = "select * from members where membercode='" + txtbox + "'";

  9. #9
    کاربر دائمی
    تاریخ عضویت
    خرداد 1391
    محل زندگی
    اصفهان
    سن
    33
    پست
    181

    نقل قول: یه مشکل در جست و جو در پایگاه به روش کدنویسی

    خیلی ممنون عزیز. ارور رفع شد. اما ظاهراً همیشه تعداد سطر ها رو منفی برمی گردونه. چون شرط
    if (dal.executed(sql)>0)هیچ وقت برقرار نیست. و فقط شرط if (dal.executed(sql)<0) برقراره.
    آخرین ویرایش به وسیله farzadkamali : چهارشنبه 15 مرداد 1393 در 00:26 صبح

  10. #10
    کاربر دائمی
    تاریخ عضویت
    دی 1383
    محل زندگی
    اصفهان
    پست
    1,436

    نقل قول: یه مشکل در جست و جو در پایگاه به روش کدنویسی

    نقل قول نوشته شده توسط farzadkamali مشاهده تاپیک
    خیلی ممنون عزیز. ارور رفع شد. اما ظاهراً همیشه تعداد سطر ها رو منفی برمی گردونه. چون شرط
    if (dal.executed(sql)>0)هیچ وقت برقرار نیست. و فقط شرط if (dal.executed(sql)<0) برقراره.
    ظاهرا من توی اون پست اشتباهی داشتم. ExecuteNonQuery فقط برای دستورات INSERT, UPDATE و DELETE تعداد سطرهای تحت تاثیر رو برمیگردونه.برای دستورات دیگه 1- برمیگردونه.
    بنابراین شما برای اینکه تعداد رکوردهای دریافت شده با دستور SELECT رو بدست بیارین باید بجای * SELECT از (*) SELECT COUNT استفاده کنید تا تعداد رکوردها برگرونده بشه و بجای ExecuteNonQuery هم از ExecuteScalar استفاده کنید (و خروجی این متد رو به int تبدیل کنید) تا تعداد برگشت داده بشه.

  11. #11
    کاربر دائمی
    تاریخ عضویت
    خرداد 1391
    محل زندگی
    اصفهان
    سن
    33
    پست
    181

    نقل قول: یه مشکل در جست و جو در پایگاه به روش کدنویسی

    ممنون از راهنماییتون. درست شد.
    اما دستور فقط یه بار اول اجرا میشه. یعنی یه بار چک میکنه و نتیجه هم درسته. اما وقتی دوباره می خوای چک کنی هیچ جوابی نمیده. یعنی در واقع اصلا دستور اجرا نمیشه. مشکل کجاست؟
    شرمنده سوالا زیاد شد.

  12. #12
    کاربر دائمی
    تاریخ عضویت
    دی 1383
    محل زندگی
    اصفهان
    پست
    1,436

    نقل قول: یه مشکل در جست و جو در پایگاه به روش کدنویسی

    نقل قول نوشته شده توسط farzadkamali مشاهده تاپیک
    ممنون از راهنماییتون. درست شد.
    اما دستور فقط یه بار اول اجرا میشه. یعنی یه بار چک میکنه و نتیجه هم درسته. اما وقتی دوباره می خوای چک کنی هیچ جوابی نمیده. یعنی در واقع اصلا دستور اجرا نمیشه. مشکل کجاست؟
    شرمنده سوالا زیاد شد.
    شما باید از Debugging استفاده کنی، BreakPoint بگذاری و دستورات رو تک به تک اجرا کنی تا متوجه بشی مشکل از کجاست.
    در نهایت باید به دستورر ExecuteScalar برسی که همیشه جواب میده و اگه دستور SELECT COUNT باشه حتما یک int برمیگردونه

تاپیک های مشابه

  1. مشکل با حرف ی هنگام جست و جو در پایگاه داده
    نوشته شده توسط rahime در بخش VB.NET
    پاسخ: 11
    آخرین پست: یک شنبه 09 تیر 1392, 01:22 صبح
  2. مشکل در Insert کردن داده در پایگاه داده
    نوشته شده توسط mvardin در بخش دسترسی به داده ها (ADO.Net و LINQ و ...)
    پاسخ: 8
    آخرین پست: دوشنبه 22 تیر 1388, 11:24 صبح
  3. جست و جو در پایگاه داده با دو تا فیلد
    نوشته شده توسط yaserzare در بخش VB.NET
    پاسخ: 11
    آخرین پست: یک شنبه 04 شهریور 1386, 18:52 عصر
  4. مشکل با ستاپ کردن برنامه با پایگاه داده
    نوشته شده توسط arash_a در بخش برنامه نویسی در Delphi
    پاسخ: 2
    آخرین پست: پنج شنبه 17 آذر 1384, 06:14 صبح
  5. مشکل در اجرای برنامه دلفی با پایگاه داده اکسس
    نوشته شده توسط Mr_Sabeghi در بخش بانک های اطلاعاتی در Delphi
    پاسخ: 6
    آخرین پست: جمعه 25 دی 1383, 23:36 عصر

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •