PDA

View Full Version : سوال: مشکل در کدهای جستجو در sql



reza69
یک شنبه 22 بهمن 1391, 11:29 صبح
سلام
این کدها برای جستجوی شماره موبایل در دیتابیس هست ولی بعد از اجرای کد هیچ موردی یافت نمیشه.
این کد برای شماره مشتری(primary key) و نام مشتری درست عمل میکنه ولی برای شماره موبایل نه.

try
{
string sql = string.Format("SELECT * FROM tmoshtari where mobile =" + txtmobile.Text);
SqlDataAdapter da = new SqlDataAdapter(sql, con);
DataSet ds = new DataSet();
da.Fill(ds, "tmoshtari");
DataTable db = ds.Tables["tmoshtari"];
if (db.Rows.Count == 0)
{
MessageBox.Show(".مشتری مورد نظر یافت نشد");
goto lb;
}
listBox1.DataSource = db;
listBox1.DisplayMember = "namemoshtari";
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

RED-C0DE
یک شنبه 22 بهمن 1391, 12:11 عصر
این روشی ک رفتین روش خوبی نیست
ولی احتمالا نوع فیلد شماره موبایل رو تو جدول بصورت رشته ای اگه در نظر گرفته باشید باید موقع مقایسه اون رو داخل ' بذارید . ب اینصورت عمل کنید:

string sql = string.Format("SELECT * FROM tmoshtari where mobile = '" + txtmobile.Text +"'");

reza69
یک شنبه 22 بهمن 1391, 17:33 عصر
نشد
نه نوعش تو جدول int هست
چجوری رشته texbox رو به int تبدیل کنم؟

RED-C0DE
یک شنبه 22 بهمن 1391, 17:58 عصر
برای تبدیل رشته ب عدد :

int.Parse(txtMobile.Text)

reza69
یک شنبه 22 بهمن 1391, 18:10 عصر
برای تبدیل رشته ب عدد :

int.Parse(txtMobile.Text)
بازم نشد!!!!

king_of_chaf
یک شنبه 22 بهمن 1391, 18:20 عصر
نشد
نه نوعش تو جدول int هست
چجوری رشته texbox رو به int تبدیل کنم؟

فرض کنید مقدار textbox1 رو میخواهیم به int تبدیل کنیم :


Convert.ToInt16(textBox1.Text);

RED-C0DE
یک شنبه 22 بهمن 1391, 18:22 عصر
بازم نشد!!!!

نشد یعنی چی؟ یعنی خطا خوردین؟ یا خروجی ای نگرفتین؟
شما همین کوئری ای ک بالا تولید شده رو توی بانک بزنید ببینی خروجی می گیرید

reza69
یک شنبه 22 بهمن 1391, 18:29 عصر
خروجی نگرفتم همه ی کد هایی که دوستان گذاشتن رو امتحان کردم ولی در آخر خروجی نمیده و داخل لیست باکس خالی هست.
ولی وقتی کد پست دوم رو میذارم پیام میده مشتری مورد نظر پیدا نشد در حالی که چنین مشتری با این شماره موبایل وجود داره.

reza69
یک شنبه 22 بهمن 1391, 18:35 عصر
شماره موبایل به صورت int ذخیره میشه؟ در اینصورت شماره موبایل داخل تکست باکس به چه صورت تایپ میشه؟
ببخشید اشتباه شد
به صورت nvarchar ذخیره میشه.

reza69
یک شنبه 22 بهمن 1391, 19:08 عصر
شما تو پست3 گفتی int ذخیره میشه حالا میگی nvarchar !!!!
اگر به صورت رشته ذخیره میکنی RED-C0DE (http://barnamenevis.org/member.php?17039-RED-C0DE) جوابت رو در پست2 دادند.
بله دوست من شما درست میگی خیلی خیلی ببخشید.
ولی مشکلم هنوز حل نشده.

reza69
یک شنبه 22 بهمن 1391, 20:34 عصر
کد ذخیره ، عکسی از اطلاعات ذخیره شده داخل جدول بزارید معلوم بشه شماره موبایل چجور ذخیره شده.
99878.......................

Mahmoud.Afrad
یک شنبه 22 بهمن 1391, 21:13 عصر
در دیتابیس فیلد شماره تلفن و موبایل(فیلدهای غیر فارسی) رو varchar بگیر نه nvarchar .
کد رو به اینصورت بنویس:

using (SqlCommand cmd = new SqlCommand("SELECT * FROM tmoshtari where mobile = @mob", con))
{
cmd.Parameters.AddWithValue("@mob", txtmobile.Text);
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
DataTable dt = new DataTable();
try
{
da.Fill(dt);
if (dt.Rows.Count == 0)
{
MessageBox.Show(".مشتری مورد نظر یافت نشد");
}
else
{
listBox1.DataSource = dt;
listBox1.DisplayMember = "namemoshtari";
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}

پروژه رو یکبار rebuild کن تا دیتابیس جدید هم جایگذین بشه.

reza69
یک شنبه 22 بهمن 1391, 21:25 عصر
نشد همه ی کارایی که گفتید انجام دادم پیام میده مشتری مورد نظر پیدا نشد.

Mahmoud.Afrad
یک شنبه 22 بهمن 1391, 22:44 عصر
پروژه رو قرار بده.

Amir.pc_66
دوشنبه 23 بهمن 1391, 01:53 صبح
به نظرتون نباید به جای sqlcommand اولی مینوشتین SelectCommand

OK

Mahmoud.Afrad
دوشنبه 23 بهمن 1391, 06:10 صبح
به نظرتون نباید به جای sqlcommand اولی مینوشتین SelectCommand

OK
با من هستید؟
sqlcommand رو به SqlDataAdapter پاس دادم که با اینکه به طور مستقیم SelectCommand مربوط به SqlDataAdapter رو مقداردهی کنیم فرق نمیکنه.

reza69
سه شنبه 24 بهمن 1391, 12:15 عصر
خیلی ممنون از تمام دوستانی که کمک کردند.
من جوابمو پیدا کردم.

try
{
string sql = string.Format("SELECT * FROM tmoshtari where mobile LIKE N'%{0}%'", txtmobile2.Text.Replace("'", String.Empty));
SqlDataAdapter da = new SqlDataAdapter(sql, con);
DataSet ds = new DataSet();
da.Fill(ds, "tmoshtari");
DataTable db = ds.Tables["tmoshtari"];
if (db.Rows.Count == 0)
{
MessageBox.Show(".مشتری مورد نظر یافت نشد");
goto lb;
}
dataGridView2.DataSource = db;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

FastCode
سه شنبه 24 بهمن 1391, 13:26 عصر
خیلی ممنون از تمام دوستانی که کمک کردند.
من جوابمو پیدا کردم.

try
{
string sql = string.Format("SELECT * FROM tmoshtari where mobile LIKE N'%{0}%'", txtmobile2.Text.Replace("'", String.Empty));
SqlDataAdapter da = new SqlDataAdapter(sql, con);
DataSet ds = new DataSet();
da.Fill(ds, "tmoshtari");
DataTable db = ds.Tables["tmoshtari"];
if (db.Rows.Count == 0)
{
MessageBox.Show(".مشتری مورد نظر یافت نشد");
goto lb;
}
dataGridView2.DataSource = db;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

شاید کار کنه ولی درست نیست.
پست شماره ۱۲ درسته

reza69
سه شنبه 24 بهمن 1391, 13:37 عصر
شاید کار کنه ولی درست نیست.
پست شماره ۱۲ درسته
کار میکنه.
چرا میگید درست نیست؟

FastCode
سه شنبه 24 بهمن 1391, 15:06 عصر
کار میکنه.
چرا میگید درست نیست؟
http://en.wikipedia.org/wiki/SQL_injection

reza69
سه شنبه 24 بهمن 1391, 15:25 عصر
http://en.wikipedia.org/wiki/SQL_injection
شما چجوری میتونید با sql injection با توجه به کدی که من نوشتم داده ها رو تغییر بدید؟
میشه یه مثال بزنید.

FastCode
سه شنبه 24 بهمن 1391, 16:40 عصر
شما چجوری میتونید با sql injection با توجه به کدی که من نوشتم داده ها رو تغییر بدید؟
میشه یه مثال بزنید.
الان SQL ندارم.ولی یه چیزی شبیه این:
;delete from tmoshtary;--

reza69
سه شنبه 24 بهمن 1391, 16:45 عصر
الان SQL ندارم.ولی یه چیزی شبیه این:
;delete from tmoshtary;--
یعنی اگه تو یکی از کادر های ورودی این دستورو بنویسیم کل جدول مشتری پاک میشه؟

FastCode
سه شنبه 24 بهمن 1391, 16:51 عصر
یعنی اگه تو یکی از کادر های ورودی این دستورو بنویسیم کل جدول مشتری پاک میشه؟
البته اگر میخوای کامل با جاش پاک بشه
میتونی بنویسی
;DROP TABLE tmoshtary;--

اگر اون replace رو هم ننوشته بوده که با دیتابیست باربیکیو درست میکردم

reza69
سه شنبه 24 بهمن 1391, 17:02 عصر
البته اگر میخوای کامل با جاش پاک بشه
میتونی بنویسی
;DROP TABLE tmoshtary;--

اگر اون replace رو هم ننوشته بوده که با دیتابیست باربیکیو درست میکردم
اگه با یک سری دستورات از ورود کاراکتر های انگلیسی جلوگیری کنیم دیگه هیچ راهی برای sql injection نیست.
درسته؟

FastCode
سه شنبه 24 بهمن 1391, 17:16 عصر
اگه با یک سری دستورات از ورود کاراکتر های انگلیسی جلوگیری کنیم دیگه هیچ راهی برای sql injection نیست.
درسته؟
یعنی استفاده از SqlParameter اینقدر سخته؟

باز هم راه داره.


کلا روش وصل شدن به دیتابیس بین همه ی برنامه نویس های ایران مشکل داره.(البته استثما همه جا هست)خیلی مهم نیست چکار بکنید.اگر کسی بخواد میتونه قبل از ۳۰ ثانیه کل اطلاعاتتون رو پاک کنه.