ورود

View Full Version : how update database!!!!!



ابراهیم_م
یک شنبه 14 خرداد 1385, 12:44 عصر
من یک دیتا بیس اکسس دارم که می خواهم آپدیتش کنم اگر کسی می تونه یک کمک فوری بکن تا من از شر این پروژه خلاص بشم.پایگاه داده دانشجویان و درس های ارائه شده ترم تحصیلی است
البته از دیتا لیست استفاده کردم

البته این کد رو هم نوشتم
Dim connectstr, sqlstr As String
connectstr = Application("path")
Dim oledbconnect As New OleDbConnection(connectstr)
oledbconnect.Open()
sqlstr = "UPDATE input_year SET const_price = 20000 WHERE year=81"
Dim oledbcmd As New OleDbCommand(sqlstr, oledbconnect)
oledbcmd.ExecuteNonQuery()
ولی خطای زیر رو می ده

Exception Details: System.Data.OleDb.OleDbException: Operation must use an updateable query.

Arminizer_88
یک شنبه 14 خرداد 1385, 13:55 عصر
سلام عزیز

اولا که دیتابیس اکسس رو با ExecuteNonQuery آپدیت نمیکنن باید از این دستور استفاده کنی:
()ExecuteScalar

دوما اینکه برای آپدیت کردن دیتابیست همیشه نمیتونی از دستورات SQL استفاده کنی، خصوصا وقتی که نعداد فیلد ها زیاد باشه. میتونی از DataSet,DataAdapter,DataTable,DataRow و پارامتر ها استفاده کنی. مثال زیر رو ببین:



Dim Sql As String="SELECT * FROM tbl_Users WHERE UserId=99"
Dim dbAdapter As New OleDbDataAdapter (Sql,ConnStr)

dbAdapter.UpdateCommand=New OleDbCommand("UPDATE tbl_Users SET FName=@FName,LName=@LastName WHERE UserID=@UserID"
dbAdapter.UpdateCommand.Parameters.Add "@FirstName",OleDbType.VarChar,50,"FName"
dbAdapter.UpdateCommand.Parameters.Add "@LastName",OleDbType.VarChar,50,"LName"

Dim DS As New DataSet("MyDataSet")
dbAdapter.Fill(DS,"tbl_Users")
Dim dbRow As DataRow=DS.Tables("tbl_Users").Rows(0)

dbRow("FName")=txtFirstName.Text
dbRow("LName")=txtLastName.Text

dbAdapter.Update(DS,"tbl_Users")
'Close All Instances


و در آخر اینکه How Update Database معنی نداره، درستش اینه که بنویسی:
.How To Update A Database

ابراهیم_م
دوشنبه 15 خرداد 1385, 09:05 صبح
ابراهیم_م]از کد شما متشکرم امیدوارم که بتون ازش درست استفاده کنم.:
و به بزرگی خودتون اشتباهات تازه کار بودن من رو ببخشید
این کد اصلا روند برنامه رو تغییر داد دستتون درد نکن
اما برای آپدیت خطا می ده اگه می در مورد پارامتر ها و استفاده از @lastnameو@fname یک کمی توضیح بدهید چون اصلا نمی تونم بفهمم که کار
شون چی
سر این خط
dbAdapter.Update(DS, "tbl_Users")
خطای زیر رو می ده
System.Data.OleDb.OleDbException: Operation must use an updateable query.

nazaninam
دوشنبه 15 خرداد 1385, 09:24 صبح
اولا که دیتابیس اکسس رو با ExecuteNonQuery آپدیت نمیکنن باید از این دستور استفاده کنی:
()ExecuteScalar



اولا اگه از چیزی مطمئین نیستید درموردش با این اطمینان صحبت نکنید
ExecuteNonQuery به دیتابیس خاصی تعلق نداره بلکه توی اکسس هم میتونید خیلی راحت ازش استفاده کنید
()ExecuteScalar برای برگردوندن فقط و فقط یک مقدار از یک تیبل بکار میره...در حقیقت فقط میتونه بصورت اسکالر اثر گذار باشه میتونیم اینجوری تفسیر کنیم : فرمان رو عمل میکنه (execute) ولی فقط یک مقدار رو بر میگردونه ولی در ExecuteNonQuery فرمان عمل میشه ولی داده ای رو بر نمیگردونه بنابراین برای بروز رسانی (update) بسیار مناسب تره چون نیاز به بر گردوندن مقدار نداریم...




و به بزرگی خودتون اشتباهات تازه کار بودن من رو ببخشید

اشتباه اگه نباشه آدم هیچ چیزی یاد نمیگیره
این یک نمونه آپدیت برای بانک اکسس هست



Dim updatesql As String

updatesql = "update links set name='" & name.Text & "',"
updatesql &= " comment='" & comment.Text & "',"
updatesql &= " link='" & link.Text & "'"

updatesql &= "where val(id)='" & droplist.SelectedItem.Value & "'"

Dim con As New OleDbConnection("provider=microsoft.jet.oledb.4.0; data source = d:\domains\ssss.ir\db\news.mdb")
Dim cmd As New OleDbCommand(updatesql, con)
con.Open()
cmd.ExecuteNonQuery()
con.Close()




بد نیست به نقل از msdn چند خطی رو یاداور شم:
درمورد ()ExecuteScalar



Executes the query and returns the first column of the first row in the result set returned by the query. All other columns and rows are ignored.

Use the ExecuteScalar method to retrieve a single value (for example, an aggregate value) from a database. This requires less code than using the ExecuteReader method and performing the operations necessary to generate the single value using the data returned by a DbDataReader.



در موردExecuteNonQuery



Executes an SQL statement against the Connection object of a .NET Framework data provider, and returns the number of rows affected.

You can use the ExecuteNonQuery to perform catalog operations (for example, querying the structure of a database or creating database objects such as tables), or to change the data in a database without using a DataSet by executing UPDATE, INSERT, or DELETE statements.

Although the ExecuteNonQuery does not return any rows, any output parameters or return values mapped to parameters are populated with data.

For UPDATE, INSERT, and DELETE statements, the return value is the number of rows affected by the command. For all other types of statements, the return value is -1.






خطای زیر رو می ده
System.Data.OleDb.OleDbException: Operation must use an updateable query


این خطابه به دلیل نداشتن پرمیشن لازم در بانک اکسس رخ میده
اولا تو این سایت چندین بار مطرح شده یک جستجو بکنید
راه حل کلیش اینه که پرمیشن بدید اگه سخت هست میتونی به یک درایو دیگه که ntfs نیست بانک رو منتقل کنی...

Arminizer_88
دوشنبه 15 خرداد 1385, 10:49 صبح
اولا اگه از چیزی مطمئین نیستید درموردش با این اطمینان صحبت نکنید
ExecuteNonQuery به دیتابیس خاصی تعلق نداره بلکه توی اکسس هم میتونید خیلی راحت ازش استفاده کنید

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

ابراهیم_م
دوشنبه 15 خرداد 1385, 12:24 عصر
با تشکر از همگی که کمک کردن واقعا از این گفتگو لذت بردم

Arminizer_88
دوشنبه 15 خرداد 1385, 12:48 عصر
من هم همینطور.
موفق باشی.