Avatar billede mema Nybegynder
29. december 2006 - 00:26 Der er 12 kommentarer og
1 løsning

Update og slet problem

Min DataGrid sorterer og paging virker også fint, men når jeg vil slette en post eller redigerer og klikker på "Opdater" får jeg følgende fejl i browseren:
Cannot find table 0.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.IndexOutOfRangeException: Cannot find table 0.
Source Error:
Line 31:  DataRow[] objRows;;
Line 32:  string strSelect = @"ID='" + ID.ToString() + "'";
Line 33:  objRows = _AndebyDataset.Tables[0].Select(strSelect);
Line 34:  return objRows[0];
Line 35:  }

Jeg bruger asp.net 1.1 og en Access database. Jeg bruger også en c# klasse:

Klasse:
------
public class Personaleklassen
{
OleDbDataAdapter objAdapter;
DataSet _PersonaleDataset = new DataSet();
public DataSet PersonaleData()
{
string strConnection;
string strSQL;
OleDbConnection objConnection;
strConnection = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + ConfigurationSettings.AppSettings["PersonalePath"] + @"\Personale.mdb";
objConnection = new OleDbConnection(strConnection);
strSQL = "SELECT * FROM Personale";
objAdapter = new OleDbDataAdapter(strSQL, objConnection);
objAdapter.Fill(_PersonaleDataset, "Personale");
return _PersonaleDataset;
}
public DataRow Persons(int ID) {
DataRow[] objRows;;
string strSelect = @"ID='" + ID.ToString() + "'";
objRows = _PersonaleDataset.Tables[0].Select(strSelect);
return objRows[0];
}
public void Opdater() {
OleDbCommandBuilder ObjBuilder = new OleDbCommandBuilder(objAdapter);
objAdapter.UpdateCommand = ObjBuilder.GetUpdateCommand();
objAdapter.InsertCommand = ObjBuilder.GetInsertCommand();
objAdapter.DeleteCommand = ObjBuilder.GetDeleteCommand();
objAdapter.Update(_PersonaleDataset, "Personale");
}
public void Slet(int ID) {
DataRow[] objRows;;
string strSelect = @"ID='" + ID.ToString() + "'";
objRows = _PersonaleDataset.Tables[0].Select(strSelect);
        objRows[0].Delete();
        Opdater();
    }
}

aspx-fil:
---------
<asp:datagrid id="dgridPersonale" runat="server" Width="600px" AutoGenerateColumns="False" DataKeyField="ID"
AllowSorting="True" AllowPaging="True" PageSize="4">
<Columns>
<asp:BoundColumn DataField="ID" SortExpression="ID" ReadOnly="True" HeaderText="ID"></asp:BoundColumn>
<asp:BoundColumn DataField="Fornavn" SortExpression="Fornavn" HeaderText="Fornavn"></asp:BoundColumn>
<asp:BoundColumn DataField="Efternavn" SortExpression="Efternavn" HeaderText="Efternavn"></asp:BoundColumn>
<asp:BoundColumn DataField="Telefon" SortExpression="Telefon" HeaderText="Telefon"></asp:BoundColumn>
<asp:BoundColumn DataField="Foedselsdato" SortExpression="Foedselsdato" HeaderText="F&#248;dselsdato"></asp:BoundColumn>
<asp:EditCommandColumn ButtonType="LinkButton" UpdateText="Opdater" CancelText="Annuler" EditText="Rediger"></asp:EditCommandColumn>
<asp:ButtonColumn Text="Slet" CommandName="Delete"></asp:ButtonColumn>
</Columns>                   
</asp:datagrid>

aspx.cs fil:
------------
...
...
using ProjektDatagrid.Klasser;

namespace ProjektDatagrid
{
public class DatabaseSomGrundlaeg_Loesning : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid dgridPersonale;
Personaleklassen _PersonaleKlas = new Personaleklassen();
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack){
sortfield = "ID";
sortorder = "ASC";
DoDatabind();
}
}
public string sortfield {
get { return (string)ViewState["sortfield"]; }
set { ViewState["sortfield"] = value; }
}
public string sortorder {
get { return (string)ViewState["sortorder"]; }
set { ViewState["sortorder"] = value; }
}
DataSet GetDataset()
{
return _PersonaleKlas.PersonaleData();
}
private void DoDatabind() {
DataView objDataView;
objDataView = GetDataset().Tables[0].DefaultView;
if (sortfield != "")
objDataView.Sort = sortfield + " " + sortorder;
dgridPersonale.DataSource = objDataView;
dgridPersonale.DataBind();
}
private void ChangePage(object sender, DataGridPageChangedEventArgs e) {
if (dgridPersonale.EditItemIndex == -1)
{
dgridPersonale.CurrentPageIndex = e.NewPageIndex;
dgridPersonale.SelectedIndex = -1;
DoDatabind();
}
}
private void dgridPersonale_SortCommand(object sender, DataGridSortCommandEventArgs e) {
if (dgridPersonale.EditItemIndex == -1) {
if (e.SortExpression != sortfield) {
sortfield = e.SortExpression;
sortorder = "ASC";
}
else {
if (sortorder == "DESC") {
sortorder = "ASC";
}
else {
sortorder = "DESC";
}
}
DoDatabind();
}
}
private void dgridPersonale_CancelCommand(object source, DataGridCommandEventArgs e) {
dgridPersonale.EditItemIndex = -1;
DoDatabind();
}
private void dgridPersonale_EditCommand(object sender, DataGridCommandEventArgs e) {
dgridPersonale.EditItemIndex = e.Item.ItemIndex;
DoDatabind();
}
private void dgridPersonale_UpdateCommand(object sender, DataGridCommandEventArgs e) {
DataRow Persons = _PersonaleKlas.Persons(Convert.ToInt16(dgridPersonale.DataKeys[e.Item.ItemIndex]));
Persons["Fornavn"] = ((TextBox)e.Item.Cells[1].Controls[0]).Text;
Persons["Efternavn"] = ((TextBox)e.Item.Cells[2].Controls[0]).Text;
Persons["Telefon"] = ((TextBox)e.Item.Cells[3].Controls[0]).Text;
Persons["Foedselsdato"] = ((TextBox)e.Item.Cells[4].Controls[0]).Text;
_PersonaleKlas.Opdater();
dgridPersonale.EditItemIndex = -1;
DoDatabind();
}
private void dgridPersonale_DeleteCommand(object sender, DataGridCommandEventArgs e) {
_PersonaleKlas.Slet(Convert.ToInt16(dgridPersonale.DataKeys[e.Item.ItemIndex]));
dgridPersonale.EditItemIndex = -1;
if (dgridPersonale.CurrentPageIndex > 0 && dgridPersonale.Items.Count == 1)
dgridPersonale.CurrentPageIndex -= 1;
DoDatabind();
}
private void dgridPersonale_ItemDataBound(object sender, DataGridItemEventArgs e) {
if (e.Item.ItemType != ListItemType.Header && e.Item.ItemType != ListItemType.Footer)
{
LinkButton deleteButton = (LinkButton)e.Item.Cells[6].Controls[0];
deleteButton.Attributes.Add("onClick", "java script:return confirm('Er du sikker på, at du ønsker at slette?')");
}
}
#region Web Form Designer generated code
...
...
private void InitializeComponent()
{   
this.dgridPersonale.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.ChangePage);
this.dgridPersonale.CancelCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgridPersonale_CancelCommand);
this.dgridPersonale.EditCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgridPersonale_EditCommand);
this.dgridPersonale.SortCommand += new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.dgridPersonale_SortCommand);
this.dgridPersonale.UpdateCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgridPersonale_UpdateCommand);
this.dgridPersonale.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgridPersonale_DeleteCommand);
this.dgridPersonale.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.dgridPersonale_ItemDataBound);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
Avatar billede dr_chaos Nybegynder
30. december 2006 - 16:40 #1
Du mangler at hente data til PersonaleDataset.
Avatar billede mema Nybegynder
30. december 2006 - 16:53 #2
Jeg ved, at DataSet'et er tøm, men hvor og hvordan skal jeg ændre på den? jeg har allerede i Personaleklassen i metoden PersonaleData() returneret DataSet'et:

public DataSet PersonaleData()
{
string strConnection;
string strSQL;
OleDbConnection objConnection;
strConnection = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + ConfigurationSettings.AppSettings["PersonalePath"] + @"\Personale.mdb";
objConnection = new OleDbConnection(strConnection);
strSQL = "SELECT * FROM Personale";
objAdapter = new OleDbDataAdapter(strSQL, objConnection);
objAdapter.Fill(_PersonaleDataset, "Personale");
return _PersonaleDataset;
}
Avatar billede dr_chaos Nybegynder
31. december 2006 - 09:35 #3
prøv med
objRows = PersonaleData().Tables[0].Select(strSelect);
Avatar billede mema Nybegynder
31. december 2006 - 15:06 #4
Tak for det. Send venligst et svar.
Nu virker slet og update. Det eneste er, at efter slet og update bliver alle rækkerne vist dobbelt!
Avatar billede dr_chaos Nybegynder
01. januar 2007 - 09:15 #5
prøv at gøre
_PersonaleDataset = new Dataset();

i PersonaleData()

svar :)
Avatar billede mema Nybegynder
01. januar 2007 - 15:49 #6
Men jeg får nu følgende fejl ved update:
Exception Details: System.InvalidOperationException: Update unable to find TableMapping['Personale'] or DataTable 'Personale'.
Avatar billede dr_chaos Nybegynder
02. januar 2007 - 14:38 #7
kald evt PersonaleData() i stedet for _PersonaleDataset
Avatar billede mema Nybegynder
02. januar 2007 - 15:11 #8
Hvis jeg har rigtigt forstået, mener du at jeg kalder PersonaleData() i selve metoden "PersonaleData()". Det har jeg gjort, men jeg får nu:
Exception Details: System.StackOverflowException: Exception of type System.StackOverflowException was thrown.
Avatar billede dr_chaos Nybegynder
02. januar 2007 - 15:33 #9
paste lige hele din kode.
Avatar billede mema Nybegynder
02. januar 2007 - 23:05 #10
PersonaleClass.cs:
-----------------
using System;
using System.Data;
using System.Configuration;
using System.Web.UI.WebControls;
using System.Data.OleDb;

public class PersonaleClass
{
OleDbDataAdapter objAdapter;
DataSet _PersonaleDataset = new DataSet();
public DataSet PersonaleData()
{
string strConnection;
string strSQL;
PesonaleData();
OleDbConnection objConnection;
strConnection = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + ConfigurationSettings.AppSettings["PersonalePath"] + @"\Personale.mdb";
objConnection = new OleDbConnection(strConnection);
strSQL = "SELECT * FROM Personale";
objAdapter = new OleDbDataAdapter(strSQL, objConnection);
objAdapter.Fill(_PersonaleDataset, "Personale");
return _PersonaleDataset;
}
public DataRow Persons(int ID)
{
DataRow[] objRows;
string strSelect = @"ID='" + ID.ToString() + "'";
objRows = PersonaleData().Tables[0].Select(strSelect);
return objRows[0];
}
public void Opdater()
{
OleDbCommandBuilder ObjBuilder = new OleDbCommandBuilder(objAdapter);
objAdapter.UpdateCommand = ObjBuilder.GetUpdateCommand();
objAdapter.InsertCommand = ObjBuilder.GetInsertCommand();
objAdapter.DeleteCommand = ObjBuilder.GetDeleteCommand();
objAdapter.Update(_PersonaleDataset, "Personale");
}
public void Slet(int ID)
{
DataRow[] objRows;;
string strSelect = @"ID='" + ID.ToString() + "'";
objRows = PersonaleData().Tables[0].Select(strSelect);
objRows[0].Delete();
Opdater();
}
}
Avatar billede dr_chaos Nybegynder
03. januar 2007 - 08:53 #11
prøv med:


using System;
using System.Data;
using System.Configuration;
using System.Web.UI.WebControls;
using System.Data.OleDb;

public class PersonaleClass
{
OleDbDataAdapter objAdapter;

public DataSet PersonaleData()
{
string strConnection;
string strSQL;
DataSet _PersonaleDataset = new DataSet();
OleDbConnection objConnection;
strConnection = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + ConfigurationSettings.AppSettings["PersonalePath"] + @"\Personale.mdb";
objConnection = new OleDbConnection(strConnection);
strSQL = "SELECT * FROM Personale";
objAdapter = new OleDbDataAdapter(strSQL, objConnection);
objAdapter.Fill(_PersonaleDataset, "Personale");
return _PersonaleDataset;
}
public DataRow Persons(int ID)
{
DataRow[] objRows;
string strSelect = @"ID='" + ID.ToString() + "'";
objRows = PersonaleData().Tables[0].Select(strSelect);
return objRows[0];
}
public void Opdater()
{
OleDbCommandBuilder ObjBuilder = new OleDbCommandBuilder(objAdapter);
objAdapter.UpdateCommand = ObjBuilder.GetUpdateCommand();
objAdapter.InsertCommand = ObjBuilder.GetInsertCommand();
objAdapter.DeleteCommand = ObjBuilder.GetDeleteCommand();
objAdapter.Update(PersonaleData(), "Personale");
}
public void Slet(int ID)
{
DataRow[] objRows;;
string strSelect = @"ID='" + ID.ToString() + "'";
objRows = PersonaleData().Tables[0].Select(strSelect);
objRows[0].Delete();
Opdater();
}
}
Avatar billede mema Nybegynder
03. januar 2007 - 10:21 #12
Hej, Jeg får nu denne her:
Exception Details: System.InvalidOperationException: Update unable to find TableMapping['Personale'] or DataTable 'Personale'.
Avatar billede dr_chaos Nybegynder
03. januar 2007 - 10:25 #13
Prøv lige at tjekke tables i dit dataset igennem og se hvilke tabeller det indeholder.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester