ADO.NET :: Data Adapter Update Method With Command Builder
Nov 11, 2010
Code:
SqlDataAdapter da = new SqlDataAdapter("select * from " + txtTableName.Text, DataStoreGeneral.GetConnectionString());
DataTable dt_app = new DataTable();
da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
da.FillSchema(dt_app, SchemaType.Source);
da.Fill(dt_app);
SqlCommandBuilder build = new SqlCommandBuilder(da);
da.InsertCommand= build.GetUpdateCommand();
da.Update(ds.Tables[1].GetChanges(DataRowState.Added));
Problem: In my scenerio i had dataset with a table (in code->ds.Tables[1]) in rowstate added. I wanted update on database with this table so i changed insert command of adapter to update command of command builder, but no update got performed. When debugged in sql profiler i found that update command generated by builder is checking all columns in where clause and with parameter value of data table instead of from database column value.
exec sp_executesql N'UPDATE [ShopResources] SET [GROUP_RESOURCE_ID] = @p1, [SEQ_NO] = @p2, [SUB_RESOURCE_ID] = @p3, [EFFICIENCY_FACTOR] = @p4, [RUN_COST_PER_HR] = @p5, [RUN_COST_PER_UNIT] = @p6, [BUR_PER_HR_SETUP] = @p7, [BUR_PER_HR_RUN] = @p8, [BUR_PERCENT_SETUP]
= @p9, [BUR_PERCENT_RUN] = @p10, [BUR_PER_OPERATION] = @p11 WHERE (([GROUP_RESOURCE_ID] = @p12) AND ([SEQ_NO] = @p13) AND ([SUB_RESOURCE_ID] = @p14) AND ((@p15 = 1 AND [EFFICIENCY_FACTOR] IS NULL) OR ([EFFICIENCY_FACTOR] = @p16)) AND ([RUN_COST_PER_HR] = @p17)
AND ([RUN_COST_PER_UNIT] = @p18) AND ([BUR_PER_HR_SETUP] = @p19)
The problem I identified is parameter values inside where clause are from data table which is obvious that update condition will not be met. Is there some way to restrict where clause to primary key only in Command Builder?Or why is command builder taking where clause parameter values from datatable instead of command (query)?
how would i do my Gridview delete command like a update command?
im using a datasource... and my delete command is like my update command... so i can change the status into "INACTIVE"...
DeleteCommand="UPDATE ACCOUNT_MAINTENANCE SET am_status = 'INACTIVE' WHERE (accmain_no = @accmain_no)"
UpdateCommand="UPDATE [ACCOUNT_MAINTENANCE] SET [account_type] = UPPER(@account_type), [min_deposit] = @min_deposit, [min_capital] = @min_capital WHERE [accmain_no] = @accmain_no"
when i press my delete command at gridview... the status changed into "INACTIVE" but when i refresh or press f5... it automatically update the status into "INACTIVE" also...
I am using table adapter in a dataset type (.xsd) file mapping to database. But I found after I created a new stored procedure in database and use table adapter mapping to the new stored procedure, I got method not found error like
Method not found: 'PO_GetNewOrdersSummaryDataTable BizTalk.Application.DataAccess.DatalayerTableAdapters.PO_GetNewOrdersSummaryTableAdapter.GetDataByCompletedDays(System.String, System.String, System.Nullable`1<Boolean>, System.Nullable`1<Boolean>, System.Nullable`1<Int32>)'.
on the testing server. But it is fine if I run the web application on my local dev machine and another machine we use it for building application before deployment. Does anyone know what could cause this problem on testing server? It works fine before I created the new method
GetDataByCompletedDays in PO_GetNewOrdersSummaryTableAdapter.
I have created a function that is called when a user wishes to upload a file to the database. The problem I am having is that it won't write the files to the database anymore. This function used to work before I implemented a treeview (which connects to the database). I am struggling to see how the treeview could have cause the file upload to stop working (the error may not even be related to the implementation of the treeview).
The error message I am receiving is: 'Update' is not a member of 'CMS.SiteFilesDSTableAdapters.SiteFilesTableAdapter'.
The code for the upload function is:
<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Insert, True)> _ Public Function AddSiteFile(ByVal FileData As Byte(), ByVal FileName As String, ByVal FileDescription As [code]....
It is throwing the error at: Dim rowsAffected As Integer = Adapter.Update(SiteFiles) ' Return true if precisely one row was inserted, otherwise false Return rowsAffected = 1
EDIT: I managed to solve this problem by following:
I've recently started working in ASP.NET and RDBMS.I'm making a test form where I can do basic add,update,delete operations.I'm using OracleDataClient to do the DB operations.I was able to populate a listbox using OracleDataAdapter.
Now after clicking on update button,I intend to Update in DB.I've Dataadapter with it's update property.But the update query is not happening.The examples I saw over net all have Select command before Update.Is it actually like that or am I missing some point.
How does Oracle DataClient work with Insert,Update,Delete Commands.
Using VisualWebDeveloper 2010 on the development machine. All nice and fast.Using VisualWebDeveloper 2008 on the server. Server runs on Windows Server 2008 and has IIS 7.
It looks like that when 'table', a datatabe filled up in C# code behind, is getting longer, then the server (whether running the website on IIS or on the local host of VIsualWebDeveloper2008) is really slowing down. Checked it in debug mode and traced it down to
Adapter.Update(table);
Are there any know issues? Could it be that there is incompatibility between different version of SQL server or something like that? The update works, it is just awefully slow, but only on the server.
I am trying to use an Update Command within my GridView. I need to find the "FindControl" for the Edit Command textboxes.
Ie. When the user clicks the Edit button, the row is populated with dropdown boxes, textboxes, etc for editting. Then when the user clicks on Update (button) and the GridView1_RowCommand function is activated with 'if (e.CommandName == "Update")' statement with my FindControl. etc. and my sql UPDATE command statements are used. How do I convert my FooterRow info to my Edit FINDCONTROL info?
I'm trying to create a ShoutBox for my site, and for those of you who are not familiar with shoutboxes, they are chat boxes on websites that users can post live messages on, and the other uses will see their message and be able to respond. I didn't find any good ones online, so I started to write my own. I'm doing it with an XML, but I want the user to be able to post messages using a textbox I added (txtMessage) and the button (cmdPostMessage), which should add a new item to the XML file, and all the other uses will receive that message (their xmlDataSource and the DataList will PostBack every second or something like that). It is able to read messages, but not send.I am however facing three problems:
1- I need to find a way for the user's input to be added to the XML.
2- I need to find a way for the current logged-in username to be found, and added to the XML, and also detect if no user is logged in, in which case the user wil receive an alert saying "Please log in to post messages to the ShoutBox" and redirect them to the login page.
I am using asp.net(C#) as platform for building my application. I want to update the values in the database for the particular user & using the following code:
[Code]....
when I run this code, it works perfectly fine & there's no error, but when I check into the database, the values do not change & remains same. The default value in the database is NULL.
I have a page that binds data from DB to a DetailsView.I want to use the auto-generated Update command.
Everything went OK, and also updating was successful, but if I remove any field that I don't want to have chance to update, then the Update command doesn't update! the old values retain!
I mean: if all of the fields are present in the detailsView, the update will be OK, otherwise, the update will NOT update any thing.I've tried to mark the fields that I don't want to view as "Visible = 'false'" but with no good results!
I have a asp.net gridview control on my page with several fields and a couple of command fields. However, the update command is giving me problems.
Here is what works. The update command works provided I put straight text into the textboxes that appear. I even have one field that contains a dropdown list which works fine.
Here's the problem. I have two fields that need to access their value programmatically. These fields will reflect the current datetime and the current loggedin user from active directory. I have already created public strings in the C# code.
When I run the edit command on the asp form the grid uses one "DataKeyNames" element. With this the grid can update the selectedrow. However, I haven't been able to access it programmatically in the C# code. I can access the selectedrow in the "selectedindexchanged" event but then I am not able to update my fields in the gridview itself. So, part one of my question is how to I access the "DataKeyNames" properties of a gridview control.
if I can't access the "DataKeyName" property perhaps I could set the label nested within the gridview to the "myCurrentUser()" public string. I am inserting my code to hopefully make this clearer.
I have 3 gridviews in one of my web page, each of which will display different data based on the typeid. I have simplified the system structure in the image below(further description will be stated below the image):
As shown in the image above, the web site(presentation layer) will work closely with the Business Logic layer(BLL) and Data Access Layer(DLL). ObjectDataSource control will be the middle man to select, update, insert and delete the data in the gridviews.
During Select, returned data from the database at DAL will be stored in a datatable and return to BLL and then the website itself.
[code]....
However, the Update(command button) and Delete(template field) doesn't work,the RowUpdating and RowDeleting event wasn't trigger when I click on the button, but it works if I set the gridviews' datasourceid to the objectdatasource.
I have a gridview and sqldatasource in a form. My sqldatasource has select,delete and update command. The delete command is working but the update doest not work when I click the update command field.
Bug: UPDATE command Does NOT Work as Expected on a DataBound GridView This was tested in VS2005 and VS2008
Took a while to figure this out - A simple recurse thru Page Controls Makes UPDATE Not Work as expected.
To Recreate this bug:
A simple Gridview bound to an Objectdatasource on a page with ALLOWEDIT ALLOWDELETE
If one inserts some code (a function call in my example) that just recurses the PAGE controls in either the PAGE_PREINIT, PAGE_INIT, PAGE_INITCOMPLETE events,
Then the UPDATE does not FIRE! and After Pressing UPDATE the GRID does not BIND! You Get A Blank Page - Funny thing tought it's only the UPDATE Functionality that gets affected by this - Everything else works fine including EDIT & DELETE.
If the same function call (recurse thru page controls) is added in the PAGE_PRELOAD, PAGE_LOAD -- Then the UPDATE starts working again as expected.
BELOW Is SAMPLE Code using the NORTHWIND DB Products Table and a Typed DATASET.XSD - You can use your own datasource for the ObjectDatasource - (Note I took out the Foreingkey constraint in products table from Nortwind for delete to work)
NOTE: One should be able to just cut and paste the function PAGECONTROLS_RECURSETEST on any working form that has a bound Gridview with Update functionality and you should be able recreate the bug that way by calling the function from the different page_events
i'm trying to issue a select command in my app soi could execute the command and retrive the data into a string variable.the problem is that this command is overloaded with DataSourceSelectArgument and i can't figure out what it is.i'm using sql server express and when issue a n insert command for example sq.Insert(); i have no problems.this the command that's holding me:
SqlDataSource sq = new SqlDataSource(); sq.ConnectionString = ConfigurationManager.ConnectionStrings["CustomerDatabaseConnectionString1"].ToString(); sq.SelectCommandType = SqlDataSourceCommandType.Text; sq.SelectCommand = "SELECT * FROM CustomerTable where customerID = 1"; string result = sq.Select(some overload that's stopping me);
I have an ObjectDataSource that I want to perform updates using a business entity i.e. Type="Object"). Since the values for the entity are within a user control, I have stored a reference to the control in Session and in the updating event, set the new instance to the value of the entity from the user contol property (which also pulls values from the form viaother properties of the control):
Protected Sub MasterDataSource_Updating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ObjectDataSourceMethodEventArgs) Handles MasterDataSource.Updating Dim entity As New Login() Dim accountControl As AccountInfo = TryCast(Session("AccountCtrl"), AccountInfo) entity = accountControl.Entity e.InputParameters.Add("entity", entity) End Sub
My question is, how can I get the update method to pass this entity to the update method in my BLL class? It seems the Update method requires an ID or reference to the original object to use in determining whether any changes have taken place, but I don't really want to do this. In other words, I just want to use the Update event on my ObjectDataSource to pass my entity to the method ("Update") I set as a property and then let this business method handle the update of the data. Shown below, is the BLL update method I want to call:
Public Overloads Function Update(ByVal entity As Login) If entity Is Nothing Then Throw New ArgumentNullException("entity") End If MyBase.Update("UpdateLogin", entity.Username, entity.Password, entity.FirstName, entity.LastName, entity.Role, entity.Region, _ entity.Email, entity.Title, entity.TierID, entity.Street, entity.City, entity.State, entity.Zip, entity.Mobile, entity.Phone, entity.Fax) End Function
When I try to call this as it stands now, I get an error: ObjectDataSource 'MasterDataSource' could not find a non-generic method 'Update' that has parameters: ID, entity. Previously, I'd set up a long list of parameters of basic data types (string, int, boolean), but this is rather cumbersome and I was hoping to use an entity for this (FYI, I also got the same type of error when I tried this approach, but with the ID as the last parameter in the list). Perhaps what I'm doing here is atypical to how the ODS is normally used?? Has anyone done something like this successfully?
I'm trying to return the full recordcount of a data adapter but I'm struggling.
This is a snippet of the code I am using
[Code]....
This works ok but it only returns the number of records I am actually filling into the dataset table.... So my query might return 700 records but because I am only returning 15 back into the dataset table (to paginate the results) then it only shows 15 records found.
Do I have to fill a 2nd dataset table with the full results set and count that? Should I return a count of records as a column in the products table.
What's the correct way of doing this (and what's the most efficient way of doing this)?
My program is doing good when I suddenly bumped into this problem. I dont know how to do the next functionality that I need to accomplish. I am done with inserting values, showing the gridview etc and it works great. Now my problem is the update command.
I have 2 tables table: tblDest Fields: destLastName destFname destEmail Table:tblSource Fields: Sourcelastname SourceFname SourceEmai
Now, when I run my update command in sql server, it works great! I just right click the database, click new query and i run this command:
Code:
update tblDest set DestEmail =(Select SourceEmail from tblSource where tblSource.SourceFname = tblDest.DestFname and tblSource.SourceLastname = tblDest.DestLastname) what the query does, is it updates the table tbldest email where lastname and firstname exists in both tables that are equal, the question is, I want to automate this, I am done with inserting values, the problem is, I dont know how to run the update command, I tried doing this:
Code:
Dim sqlds As New SqlDataSource sqlds.ConnectionString = ConfigurationManager.ConnectionStrings("sqlconnect").ConnectionString sqlds.ProviderName = ConfigurationManager.ConnectionStrings("sqlconnect").ProviderName sqlds.UpdateCommand = "update tblDest set DestEmail =(Select SourceEmail from tblSource where tblSource.SourceFname = tblDest.DestFname and tblSource.SourceLastname = tblDest.DestLastname)" DestGrid.DataSource = sqlds DestGrid.DataBind()