PDA

View Full Version : سوال: ایراد در فراخوانی از بانک اطلاعاتی



forodo
یک شنبه 17 شهریور 1392, 13:39 عصر
سلام وخسته نباشید.
من کد زیر رو نوشتم:

private void NoRepeat()
{
try
{
da.SelectCommand = new OleDbCommand();
da.SelectCommand.Connection = con;
da.SelectCommand.CommandType = CommandType.Text;
da.SelectCommand.CommandText = @"SELECT *
FROM tblLitner
WHERE Word = '" + txtWord.Text.ToLower() + "'";

con.Open();
da.Fill(ds, "tblLitner1");
con.Close();

MessageBox.Show(ds.Tables["tblLitner1"].Rows.Count.ToString());

}
catch (Exception)
{

}
}

تو رویداد کلیک دکمه فقط این تابع رو صدا می زنم.
کلاً قضیه این تابع اینه که یه متنی داخل تکست باکس می نویسم و دکمه رو کلیک می کنم و یه پیغام می آد که تعداد سطرهایی که با متن داخل تکست باکس یکی هست رو نشون میده.
حالا تا وقتی که متنی که با متن داخل بانک اطلاعاتی من یکی نیست رو بنویسم مشکلی نیست به من 0 رو نشون میده ولی وقتی متنی که با متن داخل بانک اطلاعاتی یکی هست رو می نویسم به من یک رو نشون میده که بازم مشکلی نیست حالا وقتی که متن رو عوض می کنم و یه چیز دیگه می نویسم با این که داخل بانک اطلاعاتی من همچین متنی اصلاً وجود نداره باز هم به من 1 رو نشون میده.
لطفاً راهنمایی کنید که کجای برنامه اشکال داره.
با تشکر

sohil_ww
یک شنبه 17 شهریور 1392, 13:41 عصر
Ds.clear()

forodo
یک شنبه 17 شهریور 1392, 13:55 عصر
به دلیل اینکه ds رو بیرون از تابع ساختم اینطوری می شد؟
چون یه برنامه دیگه هم داشتم که همینجوری نوشته بودم ولی dataset رو همون داخل تابع معرفی کرده بودم و هیچ مشکلی نداشت.
درست شد ممنون.

forodo
یک شنبه 17 شهریور 1392, 16:24 عصر
private void KamKardan3()
{
try
{
da.SelectCommand = new OleDbCommand();
da.SelectCommand.Connection = con;
da.SelectCommand.CommandType = CommandType.Text;
da.SelectCommand.CommandText = @"SELECT ID, WordLevel
FROM tblLitner
WHERE WordLevel = '5' OR WordLevel = '6' OR WordLevel = '7'";

con.Open();
da.Fill(ds, "LitnerKam3");
con.Close();

dgvShow.DataSource = ds.Tables["LitnerKam3"];
for (int i = 0; i < ds.Tables["LitnerKam3"].Rows.Count; i++)
{
int IDKam = (Convert.ToInt32(ds.Tables["LitnerKam3"].Rows[i]["ID"]));
int Kam = (Convert.ToInt32(ds.Tables["LitnerKam3"].Rows[i]["WordLevel"])) - 1;

try
{
com.Connection = con;
com.CommandType = CommandType.Text;
com.CommandText = @"UPDATE tblLitner SET
WordLevel = @WordLevel
WHERE ID = " + IDKam;
com.Parameters.AddWithValue("@WordLevel", Kam.ToString());
con.Open();
com.ExecuteNonQuery();
con.Close();
}
catch (Exception)
{

}

}
}
catch (Exception)
{

}
}

کد بالا اینو می گه.
اونایی که 5 یا 6 یا 7 هستن رو بیار.
بعد به تعداد سطرهایی که پیدا کردی از هر کدوم یکی کم کن. یعنی باید به ترتیب بشن: 4 و 5 و 6
ولی همشون 4 میشن.
لطفاً راهنمایی کنید.

مهرداد صفا
یک شنبه 17 شهریور 1392, 17:41 عصر
با سلام.

update Table set WordLevel=cast((cast(WordLevel as int)-1) as NvarChar(20)) where WordLevel='5' or wordLever='6' or wordLevel='7'

forodo
یک شنبه 17 شهریور 1392, 18:20 عصر
با سلام.

update Table set WordLevel=cast((cast(WordLevel as int)-1) as NvarChar(20)) where WordLevel='5' or wordLever='6' or wordLevel='7'

اینا رو کجا باید بنویسم؟ جایی که کدای بانک اطلاعاتی رو باید بنویسم نوشتم ارور سینتکس داد و گفت نوشتن آپدیتت غلط.

مهرداد صفا
یک شنبه 17 شهریور 1392, 18:58 عصر
h
اینا رو کجا باید بنویسم؟ جایی که کدای بانک اطلاعاتی رو باید بنویسم نوشتم ارور سینتکس داد و گفت نوشتن آپدیتت غلط.

بله می بخشید. دقت نکردم، شما از SqlServer استفاده نمی کنید:اشتبا:، مورد قبلی مربوط به SqlServer می شد.
در access از int برای تبدیل رشته به عدد و از str برای عدد به رشته استفاده کنید.
این دستور رکوردهایی را که مقادیر WordLevel آنها برابر با 5،6،7 باشد یک واحد کاهش می دهد:


update tblLitner set WordLevel=str(int(WordLevel)-1) where WordLevel='5' or WordLevel='6' or WordLevel='7'

forodo
یک شنبه 17 شهریور 1392, 19:24 عصر
درست شد ولی یه مشکل داره. وقتی که داخل بانک اطلاعاتی می افته با یه فاصله در بانک اطلاعاتی ذخیره می شه. یعنی به جای اینکه '7' باشه '7 ' ذخیره می شه که تو فراخوانیه بعدی دیگه اونو پیدا نمی کنه جون اولاً یه فاصله داره. من تست کردم 2تا 7 گذاشتم یکی با فاصله و دیگری بدون فاصله اونی که بدون فاصله بود رو درست کرد. چیکارش کنم؟ البته می دونم که تابعی به نام Trim هست ولی خوب نمی دونم اونو کجا باید استفاده کنم.

مهرداد صفا
یک شنبه 17 شهریور 1392, 19:30 عصر
درست شد ولی یه مشکل داره. وقتی که داخل بانک اطلاعاتی می افته با یه فاصله در بانک اطلاعاتی ذخیره می شه. یعنی به جای اینکه '7' باشه '7 ' ذخیره می شه که تو فراخوانیه بعدی دیگه اونو پیدا نمی کنه جون اولاً یه فاصله داره. من تست کردم 2تا 7 گذاشتم یکی با فاصله و دیگری بدون فاصله اونی که بدون فاصله بود رو درست کرد. چیکارش کنم؟ البته می دونم که تابعی به نام Trim هست ولی خوب نمی دونم اونو کجا باید استفاده کنم.

باید خروجی تابع str درون trim قرار داشته باشد:


update tblLitner set WordLevel=trim(str(int(WordLevel)-1)) where WordLevel='5' or WordLevel='6' or

forodo
یک شنبه 17 شهریور 1392, 19:37 عصر
خیلی ممنون درست شد. من اصلاً فکرشو نمی کردم که بشه از این تابع داخل کدهای بانک اطلاعاتی استفاده کرد. باز هم زبان #C من رو شگفت زده کرد. بازم ممنون از راهنماییتون.

forodo
یک شنبه 17 شهریور 1392, 23:44 عصر
private void btnAdd_Click(object sender, EventArgs e)
{
ds.Clear(); // پاک کردن دیتاست
if (NoRepeat()) // بررسی تکراری نبودن کلمه
{
try
{
com.Connection = con;
com.CommandType = CommandType.Text;
com.CommandText = @"INSERT INTO tblLitner
(Word, WordMean, WordLevel)
VALUES
(@Word, @WordMean, @WordLevel)";

com.Parameters.AddWithValue("@Word", txtWord.Text.ToLower());
com.Parameters.AddWithValue("@WordMean", rtxt.Text);
com.Parameters.AddWithValue("@WordLevel", "1");

con.Open();
com.ExecuteNonQuery();
con.Close();

MessageBox.Show("اطلاعات با موفقیت ثبت شد");
}
catch (Exception)
{

}
}
else
{
MessageBox.Show("این کلمه تکراری است", "کلمه تکراری");
return;
}
txtWord.Text = rtxt.Text = "";
Form1_Load(null, null);
}

تابعی که در بالا برای تکراری نبودن کلمه هستش اینه:

private bool NoRepeat()
{
try
{
da.SelectCommand = new OleDbCommand();
da.SelectCommand.Connection = con;
da.SelectCommand.CommandType = CommandType.Text;
da.SelectCommand.CommandText = @"SELECT *
FROM tblLitner
WHERE Word = '" + txtWord.Text.ToLower() + "'";
con.Open();
da.Fill(ds, "tblLitner");
con.Close();
if (ds.Tables["tblLitner"].Rows.Count != 0)
{
return false;
}
return true;
}
catch (Exception)
{
return false;
}
}

حالا مشکل:
من هرچی که بار اول در تکست باکس و ریچ تکست باکس می نویسم تا آخرش همونارو برام میاره. یعنی اگر بار دوم و سوم و ... کلمات دیگری بنویسم باز همون کلمات اول رو میاره.
عجیبتر اینجاست که اصلاً انگار نه انگار که یه تابع نوشتم تا تکراری ذخیره نکنه.

sohil_ww
دوشنبه 18 شهریور 1392, 00:06 صبح
از unique استفاده کن خودتو تو دردسر ننداز

درضمن برای هر سئوال یه تایپیک جدید بزن

forodo
دوشنبه 18 شهریور 1392, 09:47 صبح
یعنی چی از یونیک استفاده کنم؟

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

sohil_ww
دوشنبه 18 شهریور 1392, 10:53 صبح
یه سر به این لینک بزن

کامل توضیح دادم اینجا (http://barnamenevis.org/showthread.php?409575-%D9%86%D8%AD%D9%88%D9%87-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D8%AC%D8%AF%D9%88%D9%84-%D9%88-Unique-%DA%A9%D8%B1%D8%AF%D9%86-%D9%81%DB%8C%D9%84%D8%AF%D9%87%D8%A7&p=1825506&viewfull=1#post1825506)

forodo
دوشنبه 18 شهریور 1392, 11:13 صبح
چه جوری می تونم تو access یونیک تعریف کنم.
راست کلیک کردم روی اون سطری که میخوام و properties رو زدم ولی گزینه ای به نام یونیک ندیدم.
پایین صفحه هم پیدا نکردم.
ولی از اون تاپیک فهمیدم مثل اینکه این کار باعث کند شدن برنامه می شه.


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

forodo
دوشنبه 18 شهریور 1392, 11:58 صبح
من چکّار کنم؟
تا این مشکلم حل نشه نمی تونم داخل بانک اطلاعاتی دیتا وارد کنم واگه نتونم دیتا وارد کنم برنامه اصلاً انگار وجود تداره.

sohil_ww
دوشنبه 18 شهریور 1392, 13:39 عصر
اینو ببین (http://www.techonthenet.com/access/queries/unique_values2007.php)

forodo
دوشنبه 18 شهریور 1392, 13:51 عصر
چیزی متوجه نشدم.
یعنی وقتی query رو باز کردم جدول رو بندازم داخلش بعد سطری رو که می خوام یونیک باشه رو کلیک کنم بعد Unique Value رو yes کنم بعد کویری رو ذخیره کنم. همینطوریه؟
اگه همینه بعدش نمی دونم باید چیکار کنم و چطوری از اون کویری و کجا استفاده کنم.

مهرداد صفا
دوشنبه 18 شهریور 1392, 14:15 عصر
یعنی چی از یونیک استفاده کنم؟

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

سلام دوست عزیز.
موضوع تاپیک "ایراد در فراخوانی از بانک اطلاعاتی" است در حالیکه شما در مورد "نحوه ساخت unique column در access" سوال دارید. لطفا سوالتون رو در یک تاپیک جدا مطرح کنید تا دوستانی که چنین مشکلی داشتند از طریق عنوان تاپیک و یا جستجو و ... به اینجا هدایت شوند.

pardeew
دوشنبه 18 شهریور 1392, 14:26 عصر
قبل از دستور
com.Parameters.AddWithValue("@Word", txtWord.Text.ToLower());
دستور زیر رو اضافه کن
com.Parameters.Clear();
ببین درست میشه؟