PDA

View Full Version : مشکل در ذخیره شدن تغییرات در دیتابیس فقط در عملیات ویرایش



M.Soroor
یک شنبه 05 اسفند 1386, 11:52 صبح
پیرو تاپیک قبلی که زده بودم و مشکلم حل شد، فقط مشکلی در Update شدن دیتابس برام پیش اومده

من یک جدول دارم به نام Info و سه فیلد به نام های name , family , pic
در Form1 دو TextBox به نام های txtName1 , txtFamily1 دارم و یک کلید جستجو (btnSearch)
در Form2 هم یک DataGrid ، دو TextBox به نام های txtName2 , txtFamily2 ، یک PictureBox به نام PicBox1 ، یک کلید ویرایش (btnEdit) و یک کلید حذف (btnDel)
وقتی کاربر در فرم1 یکی یا هر دو TextBox رو با مقدار دلخواه پر می کنه و برروی جستجو کلیک می کنه فرم2 نمایش داده میشه و در DataGrid نتایج جستجو نمایش داده میشه
کد مربوط به جستجو در رویداد لود Form1:


Me.InfoTableAdapter.Fill(Me.DataSet1.Info)
objDataView = New DataView(DataSet1.Tables("Info"))
name = "name LIKE " + "'%" + Form1.txtname1.Text + "%'"
family = "family LIKE " + "'%" + Form1.txtfamily1.Text + "%'"
objDataView.RowFilter = name + " AND " + family
DataGrid1.DataSource = objDataView
DataGrid1.Refresh()
جستجو بدون هیچ مشکلی انجام میشه و نتایج در DataGrid نمایش داده میشه
TextBoxها و PictureBox را به DataView متصل(bind) کردم و با انتخاب یک سطر در DataFrid اطلاعات اون سطر در TextBoxها و PictureBox نمایش داده میشه
حذف کردن یک سطر از DataGrid رو با این کد انجام دادم:


DataDrid1.Rows.RemoveAt(DataGrid1.CurrentRow.Index )
و برای اعمال این تغییرات در دیتابیس از این کد استفاده کردم:


InfoTableAdapter.Update(DataSet1)
برای اضافه کردن رکورد هم از روش DataSet استفاده کردم:


InfoBindingSource.AddNew()

InfoBindingSource.EndEdit()
InfoTableAdapter.Update(DataSet1)
تا اینجای کار مشکلی نیست، اضافه کردن، حذف کردن و جستجو بدون هیچ مشکلی انجام میشه و تغییرات در دیتابیس هم اعمال میشه

اما در ویرایش اطلاعات مشکل دارم، با اینکه TextBoxها رو به DataView متصل(bind) کردم و تغییرات در DataGrid اعمال میشه، اما تغییرات در دیتابیس ذخیره نمیشه

لطفآ راهنمایی کنید از چه کدی باید در رویداد کلیک کلید btnEdit استفاده کنم برای ذخیره تغییرات در دیتابیس

پیشاپیش ممنونم:لبخندساده:

nasseritemp
یک شنبه 05 اسفند 1386, 16:21 عصر
شما باید قبل از Update کردن DataSet ، یک SqlCommandBuilder ایجاد کنید.

M.Soroor
یک شنبه 05 اسفند 1386, 17:22 عصر
میشه بیشتر توضیح بدید به همرا کد
ممنون

M.Soroor
یک شنبه 05 اسفند 1386, 19:39 عصر
منتظر راهنمایی دوستان هستم:افسرده:

seeker
یک شنبه 05 اسفند 1386, 20:24 عصر
و برای اعمال این تغییرات در دیتابیس از این کد استفاده کردم:
کد:
InfoTableAdapter.Update(DataSet1)

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

InfoBindingSource.EndEdit()
InfoTableAdapter.Update(DataSet1)

VB.NET2005
یک شنبه 05 اسفند 1386, 20:34 عصر
دوست عزیز من استفاده از این کلاس رو پیشنهاد میکنم :


Imports System.Data.OleDb
PublicClass DataBase
Dim connectionString = "provider=microsoft.jet.oledb.4.0;data source=database.mdb;"
'for insert , update , delete
PublicFunction DoCommand(ByVal ole AsString)
Try
Dim cmd AsNew OleDbCommand
Dim con AsNew OleDbConnection
con.ConnectionString = connectionString
cmd.Connection = con
con.Open()
cmd.CommandText = ole
cmd.ExecuteNonQuery()
con.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
EndTry
EndFunction
'for select and search in table
PublicFunction MySelect(ByVal ole AsString) As DataTable
Dim dt AsNew DataTable
Try
Dim cmd AsNew OleDbCommand
Dim con AsNew OleDbConnection
Dim da AsNew OleDbDataAdapter(cmd)
con.ConnectionString = connectionString
cmd.Connection = con
con.Open()
cmd.CommandText = ole
da.Fill(dt)
con.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
EndTry
Return dt
EndFunction
EndClass

فراخوانی : [ برای سلکت کردن ]


Dim dt AsNew DataTable
'sakhte yek nemoone az class DataBase
Dim db AsNew DataBase
'seda zadan function==>MySelect baraye jostejoo dar bank
dt = db.MySelect("select * from YourTable")
DataGrid1.DataSource = dt

فراخوانی : [ برای Insert , Update , . . . ]


Dim dt AsNew DataTable
Dim db AsNew DataBase
dt = db.DoCommand("insert into YourTable values(. . .)")
DataGrid1.DataSource = dt

M.Soroor
یک شنبه 05 اسفند 1386, 20:46 عصر
اشتباه نشود
خطاب به جناب seeker:
بله درسته
من از همین کد هم قبلآ استفاده کردم اما تغییرات در دیتابیس ذخیره نشد

لطفآ راهنمایی کنید
---------------------

VB.NET2005
یک شنبه 05 اسفند 1386, 20:49 عصر
من که با اکسس اینو تست کردم درسته ؟

Dim dt AsNew DataTable
Dim db AsNew DataBase
dt = db.DoCommand("insert into YourTable values(. . .)")
DataGrid1.DataSource = dt

seeker
یک شنبه 05 اسفند 1386, 20:54 عصر
ممکنه سورستونو آپ کنید؟

M.Soroor
یک شنبه 05 اسفند 1386, 21:33 عصر
من که با اکسس اینو تست کردم درسته ؟

Dim dt AsNew DataTable
Dim db AsNew DataBase
dt = db.DoCommand("insert into YourTable values(. . .)")
DataGrid1.DataSource = dt

ممنون جناب VB.NET2005
من هم اول از این روش استفاده کردم یعنی نوشتن کدهای SQL بدون Bind کردن کنترل ها
البته نه اینطور تر و تمیز و به صورت کلاس

اما مشکل من تو این روش این بود که وقتی عکسی رو در دیتابیس ذخیره می کردم و جدول رو در یک DataGrid نمایش می دادم
نمی تونستم کاری کنم که وقتی کاربر یک سطر از DataGrid رو انتخاب کرد عکس اون رکورد در PictureBox نمایش داده بشه
البته این مشکل رو با مقدارهای Text نداشتم

nasseritemp
یک شنبه 05 اسفند 1386, 21:58 عصر
Try
cn = New SqlConnection(strCon)
cn.Open()
Dim daBuilder AsNew SqlCommandBuilder(daStudent)
daStudent.Update(dtStudent)
cn.Close()
Catch ex As Exception
MsgBox(ex.Message)
EndTry

M.Soroor
یک شنبه 05 اسفند 1386, 22:38 عصر
باید یه بار از اول تا آخر پروژه رو بازبینی کنم
چون همین کار رو (روشی که گفتم) رو یه برنامه کوچیک آزمایشی امتحان کردم و جواب داد

چون از کدهای مختلف استفاده کردم یه مقدار به هم ریخته شده که باید تمیزش کنم
مشکل از کدها نیست از بی نظمی پروژه ام هست

ممنون از همه دوستان