PDA

View Full Version : به جای متد find در dataview چه راهکاری پیشنهاد می شه



ایمان اختیاری
پنج شنبه 05 فروردین 1389, 07:05 صبح
سلام عیدتون مبارک
یه مشکلی برام پیش اومد
توی یه بانک اطلاعاتی یه فیلد به صورت متن با طول 50 کاراکتر تعریف شده
اطلاعاتی که توی این فیلد ذخیره می شن طولشون متغییره ..
حالا توی یه برنامه وقتی یه dataview تعریف کردم و خواستم از متد find اون استفاده کنم به مشکل خوردم .. چون تا اونجایی که فهمیدم متنی که باید جستجو بشه دقیقا باید توی دیتابیس هم تکرار شده باشه یعنی به این صورت نیست که شبیه متن مورد نظر رو از دیتاست بیرون بکشه

خب دوستان عزیز .. به جای find متد دیگه ای رو می شناسین یا می شه کاریش کرد که فضای خالی فیلد رو در نظر نگیره ؟
(اینم بگم که با یه کوئری اطلاعات لازم رو توی دیتاست ریختم و می خوام توی اونا جستجو داشته باشم)
متشکراتم

mohammad diba
پنج شنبه 05 فروردین 1389, 08:20 صبح
سلام دوست عزیز عید شما هم مبارک
برای متن بهتره از عملگر Like استفاده کنی تا شبیه اون متن رو پیدا کنی

Himalaya
پنج شنبه 05 فروردین 1389, 12:26 عصر
nvarchar نوع ستون توی دیتابیس sql

sds1920
پنج شنبه 05 فروردین 1389, 13:38 عصر
من فکر نمی کنم دستور Like برای DataGrid وجود داشته باشه.اگه هست نمونه کدش رو بنویسید تا من و بقیه دوستان هم که بلد نیستند یاد بگیرند.تا اونجایی که می دونم Like مربوط به Query می شه.

ولی یه پیشنهاد برای این مسئله دارم.
دوست عزیز اول جدول خودت رو توی دیتاست براساس اون فیلدی که می خوای جستجو کنی مرتب کن و سپس از کد زیر برای پیدا کردن زیر رشته در یک ستون جدول دیتاست استفاده کن.باید براساس ستونی که می خوای جستجو کنی مرتب باشه چون این یک جستجوی باینری با کمی تغییرات هستش که خودم نوشتم و اگه مرتب نباشه جواب نمی ده.


public int BinarySearch_SubString(ref System.Data.DataSet DS, string TableName, string ColumnSortedName, string item)
{
int ColumnIndex = DS.Tables[TableName].Columns[ColumnSortedName].Ordinal;
int low = 0;
int high = DS.Tables[TableName].Rows.Count - 1;
int mid = -1;
while (low <= high)
{
mid = (low + high) / 2;
string Element = (string)DS.Tables[TableName].Rows[mid].ItemArray[ColumnIndex];
if (Element.Length > item.Length)
Element= Element.Substring(0, item.Length);
if (Element== item)
return mid;
if (Element.CompareTo(item) > 0)
high = mid - 1;
else
low = mid + 1;
}
return -1;
}



امیدوارم کارت رو راه بندازه.

hakelberfin
پنج شنبه 05 فروردین 1389, 14:22 عصر
سلام
در روش های بالا که مبنای جستجو بر اساس مقایسه بین موجودیت رشته است . فاصله یا space هم جزئی از رشته محسوب میشه. مثلا دو رشته ی Ali B و Ali B مساوی در نظر گرفته نمیشن. باید خودتون تابع یا دستوراتی بنویسید که Space ها رو در رشته حذف کنه مثلا Trim()


من فکر نمی کنم دستور Like برای DataGrid وجود داشته باشه.اگه هست نمونه کدش رو بنویسید تا من و بقیه دوستان هم که بلد نیستند یاد بگیرند.تا اونجایی که می دونم Like مربوط به Query می شه.

بله این گفته تقریبا درسته .
BinarySearch شاید برای جستجوی رشته ها شاید خیلی خوب نباشه . بعضی از توابع درونی .Net که از index گذاری استفاده میکنن سریعتر جواب میدن
مثلا میتونیم از خاصیت DataTable ، RowFilter ی که میخوایم جدول رو پر کنیم نیز استفاده کنیم



dataTable.DefaultView.Sort = "LastName";
dataTable.DefaultView.RowFilter = "LastName LIKE ('" + this.TextBox_LastName.Text.Trim() + "%') ";

FastCode
جمعه 06 فروردین 1389, 00:49 صبح
private void LoadData()
{
if (!this.m_Dis)
{
Tafsily[] t = Tafsily.GetSharedData().FindAll(new Predicate<Tafsily>(this.Match_Tafsily));
if (t.Length != 0)
{
this._MainDataGridView.DataSource = t;
}
else
{
this._MainDataGridView.DataSource = null;
}
}
}
private bool Match_Tafsily(Tafsily C)
{
if ((C.Moin ?? -1) != Condition_Moin) return false;
if (!C._Hidden || this.checkBox1.Checked)
{
if (this.Condition_T != 0)
{
long num = C._Bedehi;
if (((((num < 10L) || (this.Condition_T != 1)) && ((num > -10L) || (this.Condition_T != 2))) && (((num <= C._Etebar) || (this.Condition_T != 3)) && (((num <= 10L) && (num >= -10L)) || (this.Condition_T != 4)))) && (((num >= 10L) || (num <= -10L)) || (this.Condition_T != 5))) return false;
}
if (!((((C._Code >= this.Condition_Code_From) || (this.Condition_Code_From == 0M)) && ((C._Code <= this.Condition_Code_To) || (this.Condition_Code_To == 0M))))) { return false; }
if ((Condition_Sefaresh) && (!C._HasSefaresh())) return false;
if ((Condition_Beinerah) && (!C._HasBeinerah())) return false;
if (!((C._Faaliat == this.Condition_Faaliat) || (this.Condition_Faaliat == -1L))) { return false; }
long num2;
long? visitor = C._Visitor; num2 = this.Condition_Visitor; if (!((visitor.HasValue && (visitor.Value == num2)) || (num2 == -1L))) return false;
long? faaliat = C._Faaliat; num2 = this.Condition_Faaliat; if (!((faaliat.HasValue && (faaliat.Value == num2)) || (num2 == -1L))) return false;
long? malekiat = C._Malekiat; num2 = this.Condition_Malekiat; if (!((malekiat.HasValue && (malekiat.Value == num2)) || (num2 == -1L))) return false;
long? mantaghe = C._Mantaghe; num2 = this.Condition_Mantaghe; if (!((mantaghe.HasValue && (mantaghe.Value == num2)) || (num2 == -1L))) return false;
long? masir = C._Masir; num2 = this.Condition_Masir; if (!((masir.HasValue && (masir.Value == num2)) || (num2 == -1L))) return false;
if (TextSearchCriteria_Name != null)
{
if (!C._Name.Contains(TextSearchCriteria_Name)) return false;
}
if (TextSearchCriteria_Address != null)
{
if (!C._Address.Contains(TextSearchCriteria_Address)) return false;
}
if (TextSearchCriteria_Froshgah != null)
{
if (C._Froshgah == null) return false;
if (!C._Froshgah.Contains(TextSearchCriteria_Froshgah )) return false;
}
if (TextSearchCriteria_Tel != null)
{
if (C._Tel == null) return false;
if (!C._Tel.Contains(TextSearchCriteria_Tel)) return false;
}
if (TextSearchCriteria_Mobile != null)
{
if (C._Mobile == null) return false;
if (!C._Mobile.Contains(TextSearchCriteria_Mobile)) return false;
}
return true;
}
return false;
}
نظرتون راجع به روش من چیه؟


(3 سال تجربه + 1 سال طراحی)

ایمان اختیاری
یک شنبه 08 فروردین 1389, 04:41 صبح
از همتون متشکرم ..
راهکارهای ارائه شده خیلی خوب و جذاب بودن

مشکل منم با این چند خط کد حل شد

dv.RowFilter = "id like '859*'";
dataGridView1.DataBindings.Clear();
dataGridView1.DataSource = dv;

که dv اینجا یک dataview هستش که اطلاعات رو از یک dataset گرفته

متشکرم

سال خوبی داشته باشد

teardrop
یک شنبه 08 فروردین 1389, 09:30 صبح
con.Open();
strSql = "SELECT * FROM Contacts WHERE TellHome Like '%" + txtFind.Text + "%' OR " +
"TellMobile1 like '%" + txtFind.Text + "%' OR " + "TellMobile2 like '%" + txtFind.Text + "%' OR " +
"TellJob like '%" + txtFind.Text + "%'";
da.SelectCommand.CommandText = strSql;
da.SelectCommand.ExecuteNonQuery();
ds.Clear();
da.Fill(ds, "Contacts");
con.Close();


con-->connection
da-->DataAdaptor
ds-->Dataset

FastCode
دوشنبه 09 فروردین 1389, 00:45 صبح
con.Open();
strSql = "SELECT * FROM Contacts WHERE TellHome Like '%" + txtFind.Text + "%' OR " +
"TellMobile1 like '%" + txtFind.Text + "%' OR " + "TellMobile2 like '%" + txtFind.Text + "%' OR " +
"TellJob like '%" + txtFind.Text + "%'";
da.SelectCommand.CommandText = strSql;
da.SelectCommand.ExecuteNonQuery();
ds.Clear();
da.Fill(ds, "Contacts");
con.Close();


SqlInjectionUnhandledException up = new SqlInjectionUnhandledException();
throw up;