New column in a table and problem with update function
I have a problem with my UPDATE functions and I need your help.
I created a table Computers(COM_ID,Company,Price,Model,Description,CAT_ID,Image,Quantity)
I have a web service(AdminCentral.asmx) with this code
[WebMethod(Description = "Updates a computer in the computer table", EnableSession = false)]
public string updateItem(string comid, string company, double price, string model, string description, string image, int CAT_ID, int quantity)
{
try
{
dbConn = new DbConnection();
SqlConnection conn = dbConn.OpenConnection();
SqlCommand updateItem = new SqlCommand("UpdateComputer", conn);
updateItem.CommandType = CommandType.StoredProcedure;
SqlParameter updatecomid = updateItem.Parameters.Add("@COM_ID", SqlDbType.Char, 15);
updatecomid.Value = comid;
SqlParameter updateCompany = updateItem.Parameters.Add("@Company", SqlDbType.Char, 90);
updateCompany.Value = company;
SqlParameter updatePrice = updateItem.Parameters.Add("@Price", SqlDbType.Money, 8);
updatePrice.Value = price;
SqlParameter updateModel = updateItem.Parameters.Add("@Model", SqlDbType.Char, 150);
updateModel.Value = model;
SqlParameter updateDescription = updateItem.Parameters.Add("@Description", SqlDbType.Char, 255);
updateDescription.Value = description;
SqlParameter updateImage = updateItem.Parameters.Add("@Image", SqlDbType.Char, 50);
updateImage.Value = image;
SqlParameter updateCatId = updateItem.Parameters.Add("@CAT_ID", SqlDbType.Int, 2);
updateCatId.Value = CAT_ID;
SqlParameter updateQuantity = updateItem.Parameters.Add("@Quantity", SqlDbType.Int, 2);
updateQuantity.Value = quantity;
return this.ExecuteQuery(updateItem);
}
catch (Exception e)
{
return e.ToString();
}
}
In a different application I created the web reference and I have this Datagrid
<asp:datagrid id="Computerchange" runat="server" AllowPaging="True" PageSize="2" AutoGenerateColumns="False" BorderColor="Gainsboro" Height="500px"
<Columns>
<asp:EditCommandColumn ButtonType="LinkButton" UpdateText="Update" HeaderText="Admin Functions" CancelText="Cancel" EditText="Edit"></asp:EditCommandColumn>
<asp:ButtonColumn Text="Delete" HeaderText="Delete" CommandName="Delete"></asp:ButtonColumn>
<asp:BoundColumn DataField="com_id" ReadOnly="True" HeaderText="Computer Number"></asp:BoundColumn>
<asp:BoundColumn DataField="company" HeaderText="Company"></asp:BoundColumn>
<asp:BoundColumn DataField="price" HeaderText="Price"></asp:BoundColumn>
<asp:BoundColumn DataField="model" HeaderText="Model"></asp:BoundColumn>
<asp:BoundColumn DataField="description" HeaderText="Description"></asp:BoundColumn>
<asp:BoundColumn DataField="id" ReadOnly="True" HeaderText="Category"></asp:BoundColumn>
<asp:BoundColumn DataField="imgSrc" HeaderText="Image"></asp:BoundColumn>
<asp:BoundColumn DataField="quantity" ReadOnly="True" HeaderText="Quantity"></asp:BoundColumn>
</Columns>
</asp:datagrid>
and I wrote this function
private void Computerchange_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
//Store updated column values in local variables:
string updateCOM_ID = e.Item.Cells[2].Text;
string updateCompany = ((TextBox)e.Item.Cells[3].Controls[0]).Text;
double updatePrice = double.Parse(((TextBox)e.Item.Cells[4].Controls[0]).Text);
string updateModel = ((TextBox)e.Item.Cells[5].Controls[0]).Text;
string updateDescription = ((TextBox)e.Item.Cells[6].Controls[0]).Text;
int updateCategoryId = int.Parse(e.Item.Cells[7].Text);
string updateImage = ((TextBox)e.Item.Cells[8].Controls[0]).Text;
int updateQuantity = int.Parse(e.Item.Cells[9].Text);
newView.RowFilter = "com_id='" + updateCOM_ID + "'";
if (newView.Count > 0)
{
//Delete the row that is being updated
newView.Delete(0);
}
newView.RowFilter = "";
//Create a new DataRow and populate it with the new data.
DataRow Row = Table.NewRow();
Row["com_id"] = updateCOM_ID;
Row["company"] = updateCompany;
Row["price"] = updatePrice;
Row["model"] = updateModel;
Row["description"] = updateDescription;
Row["id"] = updateCategoryId;
Row["imgSrc"] = updateImage;
Row["quantity"] = updateQuantity;
//Insert the new DataRow:
Table.Rows.Add(Row);
Computerchange.EditItemIndex = -1;
Computerchange.DataSource = newView;
Computerchange.DataBind();
// Now update the database with the new data
adminCentral1.adminCentral newData = new adminCentral1.adminCentral();
string results;
results = newData.updateItem(updateCOM_ID, updateCompany, updatePrice, updateModel, updateDescription, updateImage, updateCategoryId, updateQuantity);
if (results == "Success")
{
errorLabel.Text = "Computer Updated to database!";
}
else
{
errorLabel.Text = results;
}
When I click the Update button the error which I have is
"**Specified argument was out 开发者_如何学Cof the range of valid values.
Parameter name: index**"
Stack Trace:
[ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: index]
System.Web.UI.ControlCollection.get_Item(Int32 index) +8750274
AdminMainPage.Computerchange_UpdateCommand(Object source, DataGridCommandEventArgs e) +626
System.Web.UI.WebControls.DataGrid.OnUpdateCommand(DataGridCommandEventArgs e) +115
System.Web.UI.WebControls.DataGrid.OnBubbleEvent(Object source, EventArgs e) +498
System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
System.Web.UI.WebControls.DataGridItem.OnBubbleEvent(Object source, EventArgs e) +121
System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +125
System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +169
System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +9
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +176
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5563
Can you please help me with this error? I would like to mention that first, I didn't have the Quantity column and the code was working. When I inserted the Quantity column then I had this error. I think that I am trying to access a control which is not created or not exist in the collection.
The Specified argument was out of the range of valid values."Parameter name: index*
means you tried to access collection outside its range
The top two lines of stacktrace are
System.Web.UI.ControlCollection.get_Item(Int32 index) +8750274
AdminMainPage.Computerchange_UpdateCommand(Object source, DataGridCommandEventArgs e) +
This means in the method Computerchange_UpdateCommand
you're accessing the Control Collection by an index that doesn't exist.
Unfortunatly you reference the control several times, any of the following could be the problem
string updateCOM_ID = e.Item.Cells[2].Text;
string updateCompany = ((TextBox)e.Item.Cells[3].Controls[0]).Text;
double updatePrice = double.Parse(((TextBox)e.Item.Cells[4].Controls[0]).Text);
string updateModel = ((TextBox)e.Item.Cells[5].Controls[0]).Text;
string updateDescription = ((TextBox)e.Item.Cells[6].Controls[0]).Text;
int updateCategoryId = int.Parse(e.Item.Cells[7].Text);
string updateImage = ((TextBox)e.Item.Cells[8].Controls[0]).Text;
int updateQuantity = int.Parse(e.Item.Cells[9].Text);
However this is the most likely candidate.
int updateQuantity = int.Parse(e.Item.Cells[9].Text);
I suggest you put a breakpoint on the first one and step through and see which one is failing.
This is a LOT of information to read through... A few things you can do to narrow-down the scope a bit:
1) Make sure your index is not out of range. Typically, indexes cannot be less than 0. 2) Step through your execution with debug. While debugging, track the value of your index variable. 3) Run your stored procedure manually (via SSMS)
The one useful piece of information I don't see is which line of code is actually throwing your exception. Since the exception showed up after you added quantity I would suggest putting a break point on this line of code.
int updateQuantity = int.Parse(e.Item.Cells[9].Text);
When it hits the breakpoint step-over to see if this is the line throwing the exception. If it is you know your Cells[9] doesn't actually exist and you have a clear idea of what needs to be fixed.
精彩评论