PDA

View Full Version : مبتدی: خطا در هنگام افزودن يك ركورد



Programmer 1
سه شنبه 19 مرداد 1389, 21:15 عصر
سلام ،
من يك دفترچه تلفن ساده با سي شارپ طراحي كرده ام كه هدفم يادگيري بانك اطلاعاتي است ، همين اول كار يك خطا رخ داد و دليلش
رو هم نمي دونم ، همه چيز به نظر درسته ، خطايي كه ميده هنگام افزودن يك ركورد هست به صورت زير :


System.Data.OleDb.OleDbException was unhandled

Message="The field is too small to accept the amount of data you attempted to add. Try inserting or pasting less data."

اندازه فيلدها هم به اندازه كافي بزرگ هست كه اطلاعات به راحتي در آن جا بگيرد

سورس برنامه همراه با بانك اطلاعات رو ضميمه كردم ، براي مشاهده خطا برنامه را اجرا كنيد و دكمه افزودن را بزنيد و بعدش يك ركورد جديد
وارد نماييد و دكمه ذخيره را بزنيد و اينجا است كه اين خطا رخ ميده و دليلش رو نمي دونم .
از موتوربانك اطلاعاتي اكسس استفاده كرده ام .
فقط لطف كنيد و connection String رو خودتون تغيير بديد تا برنامه اجرا بشه .

با تشكر/.

mahdi_7610
سه شنبه 19 مرداد 1389, 21:30 عصر
برنامه را من نمی بینم .

برنامه را هم ضمیمه کنید .

behnam25214
سه شنبه 19 مرداد 1389, 21:45 عصر
لطفا برنامه و پایگاه داده رو ضمیمه کنید.:لبخندساده:

Programmer 1
چهارشنبه 20 مرداد 1389, 19:58 عصر
فايل ضميمه شد .
با تشكر /.

md_bluelily
چهارشنبه 20 مرداد 1389, 21:36 عصر
این قسمت رو:


if (newMode == true)
{
newRow["FirstName"] = txtFirstName;
newRow["LastName"] = txtLastName;
newRow["HomePhone"] = txtHomePhone;
newRow["MobilePhone"] = txtMobilePhone;
ds.Tables["tblPhoneList"].Rows.Add(newRow);
cb = newOleDbCommandBuilder(da);
da = cb.DataAdapter;
da.Update(ds, "tblPhoneList");
}
else
{
cb = newOleDbCommandBuilder(da);
da.Update(ds, "tblPhoneList");
}


به این شکل تغییر بدید:



if (newMode == true)
{
newRow["FirstName"] = txtFirstName.Text;
newRow["LastName"] = txtLastName.Text;
newRow["HomePhone"] = txtHomePhone.Text;
newRow["MobilePhone"] = txtMobilePhone.Text;
ds.Tables["tblPhoneList"].Rows.Add(newRow);
cb = newOleDbCommandBuilder(da);
da = cb.DataAdapter;
da.Update(ds, "tblPhoneList");
}
else
{
cb = newOleDbCommandBuilder(da);
da.Update(ds, "tblPhoneList");
}


موفق باشید.

Programmer 1
پنج شنبه 21 مرداد 1389, 20:50 عصر
سلام ،
بهتر ديدم كه به جاي سوال هاي مختلفي كه مي پرسم ، پروژه رو واستون بفرستم تا جاهايي كه لازمه تصحيح كنيد ، اين جوري خيلي سريعتر و راحت تر هم ياد مي گيرم.
اگه امكان داره براي دفترچه تلفني كه نوشتم (برنامه و فايل بانك اطلاعات ضميمه شده ) كد مربوط به بخش ويرايش و جستجو را قرار دهيد :

جستجو به اين صورت باشه كه كاربر با وارد كردن هريك از فيلدها و زدن دكمه جستجو نتيجه يا نتايج رو در ديتاگرايد مشاهده كنه و به صورت انتخاب شده در بياد .

ويرايش هم به اين صورت باشه كه كاربر با انتخاب هر يك از سطرهاي ديتاگرايد اطلاعات آن سطر را در فيلدهاي بالا مشاهده كند و سپس با تغيير آنها و زدن دكمه ويرايش تغييرات مربوط به آن ركورد ثبت بشه .

كد طوري باشد كه با كليك بر هر سطري در ديتا گرايد كل آن سطر به حالت انتخاب دربياد.
ضمنا فونت ديتاگرايد رو هم ميخواهم Tahoma با اندازه 8 باشه .
ستونهاي ديتاگرايد هم مي خواهم به صورت فارسي نوشته بشه (معادل نام مقابل TextBox ها ).
اگه زياد كد پيچيده نميشه ، كدي بنويسيد كه سطرهاي ديتاگرايد رو به صورت يك در ميان به رنگ خاكستري كمرنگ در بياره ( رنگ پس زمينه سطر )


بانك اطلاعاتي هم اكسس هست .
اگر كد رو برام بنويسيد ممنون مي شم فقط خواهشي كه دارم اينه كه تا حد امكان به جاهاي ديگر كد دست نزنيد و تا حد امكان به صورت
ساده كد نوشته بشه . زياد هم حساسيت به خرج ندهيد ، من خودم جزئيات و مديريت خطا رو تكميل خواهم كرد .

فقط دقت كنيد كه فايل ضميمه همين پست رو دانلود كنيد چون تغييراتي در آن داده ام .
منتظر پاسخ شما دوستان عزيز هستم .

با تشكر /.

md_bluelily
شنبه 23 مرداد 1389, 03:14 صبح
درخواست کد ممنوع است و مخالف قوانین سایت ،کد را باید خودتان بنویسید و فقط میتوانید درخواست راهنمایی کنید.

این قانون رو مدیران سایت وضع کردند. لطفا به این قانون احترام بگذارید.

Programmer 1
پنج شنبه 28 مرداد 1389, 07:19 صبح
درخواست کد ممنوع است و مخالف قوانین سایت ،کد را باید خودتان بنویسید و فقط میتوانید درخواست راهنمایی کنید.

این قانون رو مدیران سایت وضع کردند. لطفا به این قانون احترام بگذارید.

سلام،

من چون مي خواستم زياد سوال و جواب نكنم گفتم كد رو تصحيح كنيد و برام بفرستيد وگرنه مشكلي از اين لحاظ نبود كه سوالات خود را قرار بدم ، چون همانطور كه خودتان بهتر از من اطلاع داريد بعضي مواقع استفاده از يك خط كد كه به صورت نادرستي و يا نابجايي وجود داره مشكلات عديده اي پيش مي آره و باعث و باني سوالات زيادي است كه در صورت مطرح شدن اونها در انجمن ممكنه وقت خيلي از افراد رو بي جهت بگيره ، اصلا بخوام خيلي راحت بگم اينه كه وقتي من كد مربوط به بخش ويرايش برنامه دفترچه تلفن رو اصلا نمي دونم حالا من بيام چي بنويسم كه بعدش از انجمن درخواست كنم اشكالش رو بهم بگن !!! ، حال گذشته از اينكه توجيه مديران محترم سايت برنامه نويس براي چنين تصميمي چي هست سر راست مي رم سراغ سوالاتم :

الان كد مربوط به بخش جستجو رو قرار دادم ولي نتيجه نمايش داده نميشه ، مشكلش چيه ؟
كد مربوط به بخش ويرايش رو هم كه اصلا نتونستم بنويسم .

كد برنامه رو همراه با بانك اطلاعات كه كمي تغيير كرده را دوباره قرار دادم ، از اين پست دانلود كنيد .
با تشكر /.

Programmer 1
شنبه 30 مرداد 1389, 06:48 صبح
بعد ميگن از عبارات لطفا كمك كنيد ، چرا كمك نمي كنيد ، چرا جواب نمي ديد استفاده نكنيد ، خوب الان 3 روزه كه به اين سوال جواب داده نشده و من منتتظرم حداقل دليل پاسخ ندادن رو بگيد كه ما سر كار نباشيم ، اين پست هم زدم تا سوالم بياد اول صفحه اول چون رفتيم ، نمي خواستم اين پست رو ارسال كنم ولي خوب مجبور شدم .

براي يادگيري بانك اطلاعاتي : افزودن ركورد ، حذف ، ويرايش ، جستجو و ... يك برنامه نمونه سراغ نداريد كه البته خط به خط هم توضيح داده باشه ؟
با تشكر /.

md_bluelily
شنبه 30 مرداد 1389, 18:51 عصر
برای رفع مشکل جستجو کد رو به شکل زیر تغییر بدید. سعی کردم کمترین تغییر ممکن رو اعمال کنم.



string codeNumber;
OleDbCommand cmd = new OleDbCommand();
string sqlSelect;
codeNumber = txtCode.Text;
sqlSelect = "Select * from tblPhoneList where Code=" + codeNumber;
cmd.CommandText = sqlSelect;
cmd.Connection = con;
//cmd.ExecuteNonQuery();
ds.Clear();
da.SelectCommand = cmd;
da.Fill(ds, "tblPhoneList");
grdPhoneList.DataBindings.Clear();
grdPhoneList.DataBindings.Add(new Binding("datasource", ds, "tblphonelist"));


موفق باشید.

md_bluelily
شنبه 30 مرداد 1389, 19:00 عصر
برای ویرایش سعی کنید کد رو بنویسید، اگر مشکلی پیش اومد اطلاع بدید.
ببخشید که زودتر جواب ندادم.

Programmer 1
دوشنبه 01 شهریور 1389, 20:17 عصر
سلام ،

ضمن تشكر فرآوان به خاطر پي گيريتون و جواب دادن عالي كد بخش ويرايش رو نوشتم به صورت زير :


string codeNumber;
string sqlUpdate;
codeNumber = txtCode.Text;
OleDbCommand cmd = new OleDbCommand();
codeNumber = txtCode.Text;

sqlUpdate = "Update tblPhoneList set Firstname=@firstName,LastName=@lastName,HomePhone= @homePhone,MobilePhone=@mobilePhone where CodeNumber=" + codeNumber;
cmd.Connection = con;
cmd.CommandText = sqlUpdate;

cmd.Parameters.AddWithValue("@firstName", txtFirstName.Text);
cmd.Parameters.AddWithValue("@lastName", txtFirstName.Text);
cmd.Parameters.AddWithValue("@homePhone", txtHomePhone.Text);
cmd.Parameters.AddWithValue("@mobilePhone", txtMobilePhone.Text);


ds.Clear();
//da.UpdateCommand = cmd;
cmd.ExecuteNonQuery();

da.Fill(ds, "tblPhoneList");
grdPhoneList.DataBindings.Clear();
grdPhoneList.DataBindings.Add(new Binding("datasource", ds, "tblphonelist"));


ولي يك استثناي كنترل نشده رخ ميده كه برنامه رو متوقف مي كنه با اين پيام :


System.Data.OleDb.OleDbException was unhandled
Message="No value given for one or more required parameters."
Source="Microsoft JET Database Engine"
ErrorCode=-2147217904

به نظر شما مشكل كجاست ؟

همچنين در رويداد لود صفحه و رويداد كليك دكمه افزودن كد زير رو اضافه كردم تا سطرها به صورت يك در ميان رنگ متفاوتي داشته باشند ولي احساس مي كنم از روش درستي نرفتم يعني به نظر مي آد روش بهتري وجود داره كه مانند اين كد پردازش اضافي به پردازنده تحميل نمي كنه ، نظرتون چيه روش بهتر و آسونتري وجود داره ؟


for (int i = 0; i < grdPhoneList.Rows.Count; i++)
{
if (i % 2==0 )
{
for (int j = 0; j < grdPhoneList.Columns.Count; j++)
{
grdPhoneList.Rows[i].Cells[j].Style.BackColor = Color.LightBlue;
}
}
}

منتظر پاسخ شما دوست(آن) گرامي هستم .

فايل جديد برنامه هم ضميمه شده .

با تشكر /.

md_bluelily
سه شنبه 02 شهریور 1389, 16:24 عصر
کد ویرایش رو به شکل زیر تغییر بدید:



string codeNumber;
string sqlUpdate;
codeNumber = txtCode.Text;
OleDbCommand cmd = new OleDbCommand();
codeNumber = txtCode.Text;

sqlUpdate = "Update tblPhoneList set FirstName=?,LastName=?,HomePhone=?,MobilePhone=? where Code=?";
cmd.Connection = con;
cmd.CommandText = sqlUpdate;

cmd.Parameters.Add("@FirstName", OleDbType.VarChar, 15, "FirstName").Value = txtFirstName.Text;
cmd.Parameters.Add("@LastName", OleDbType.VarChar, 15, "LastName").Value = txtFirstName.Text;
cmd.Parameters.Add("@HomePhone", OleDbType.VarChar, 11, "HomePhone").Value = txtHomePhone.Text;
cmd.Parameters.Add("@MobilePhone", OleDbType.VarChar, 11, "MobilePhone").Value = txtMobilePhone.Text;
cmd.Parameters.Add("@Code", OleDbType.Integer, 5, "Code").Value = codeNumber;


ds.Clear();
cmd.ExecuteNonQuery();

da.Fill(ds, "tblPhoneList");
grdPhoneList.DataBindings.Clear();
grdPhoneList.DataBindings.Add(new Binding("datasource", ds, "tblphonelist"));


برای تغییر یک در میان رنگ به جای کدی که نوشتید خصوصیت AlternatingRowDefaultCellStyle رو تغییر بدید.

موفق باشید.

Behrang_a
چهارشنبه 03 شهریور 1389, 15:15 عصر
سلام ،


ولي يك استثناي كنترل نشده رخ ميده كه برنامه رو متوقف مي كنه با اين پيام :


System.Data.OleDb.OleDbException was unhandled
Message="No value given for one or more required parameters."
Source="Microsoft JET Database Engine"
ErrorCode=-2147217904به نظر شما مشكل كجاست ؟

.

سلام غير از راه حلي كه دوست خوبمون گفتن شما چرا سعي نميكني اشكالات برنامه رو Handle كني
كدي رو كه نوشتي داخل يه tyr-catch بزار و در قسمت catch اين OleDbException رو بهش پاس بده و متن Error رو ازش بگير اينطوري دقيق متوجه ميشي ايراد كار كجاست. ضمن اينكه ديگه برنامت خارج نميشه.

وقتي از AddWithValue استفاده ميكني بدون كه ريسك از دست دادن ديتابيست رو بوسيله يه دستور ساده تو يكي از فيلدها زياد كردي معمولا از همين روشي كه دوستمون گفت اينكارو انجام ميدن.