Avatar billede simsen Mester
24. oktober 2007 - 18:37 Der er 15 kommentarer og
1 løsning

Opdatering virker ikke

Hej,

Jeg har følgende programkode, der skal opdatere i databasen. Den gør det bare ikke......og nej, den fremkommer heller ikke med fejlmeddelse :-(

Nogen der kan sige, hvor problemet ligger?

protected void btnSaveCompany_Click(object sender, EventArgs e)
    {
        ERSCompany company = new ERSCompany();

        try
        {
            if (company.UpdateCompany(Convert.ToInt32(txtCompanyId.Text), txtCompanyName.Text, txtCompanyAdress.Text, Convert.ToInt32(txtCompanyZipCode.Text), txtCompanyCity.Text, Convert.ToInt32(txtCompanyPhone.Text), txtCompanyEmail.Text) == Status.Success)
            {               
                HidePanels();
                panShowCompanies.Visible = true;
                ShowCompanyList();
            }
        }
        catch
        { }
    }

//Opdaterer firma oplysninger
    public Status UpdateCompany(int companyId, string companyName, string companyAdress, int companyZipCode, string companyCity, int companyPhone, string companyEmail)
    {
        Status status = Status.Failure;

        try
        {
            connect.command.CommandText = "UPDATE Company SET companyName = @companyName, companyAdress = @companyAdress, companyZipCode = @companyZipCode, companyPhone = @companyPhone, companyEmail = companyEmail WHERE companyId = @companyId";

            connect.command.Parameters.Clear();
            connect.command.Parameters.Add(new OleDbParameter("@companyId", companyId));
            connect.command.Parameters.Add(new OleDbParameter("@companyName", companyName));
            connect.command.Parameters.Add(new OleDbParameter("@companyAdress", companyAdress));
            connect.command.Parameters.Add(new OleDbParameter("@companyZipCode", companyZipCode));
            connect.command.Parameters.Add(new OleDbParameter("@companyCity", companyCity));
            connect.command.Parameters.Add(new OleDbParameter("@companyPhone", companyPhone));
            connect.command.Parameters.Add(new OleDbParameter("@companyEmail", companyEmail));

            connect.command.ExecuteNonQuery();

            status = Status.Success;
            connect.Dispose();
        }
        catch
        { }
               
        return status;
    }

mvh
simsen :-)
Avatar billede neoman Novice
24. oktober 2007 - 18:40 #1
klassikeren er at overskrive data i page load, hvor man lige glemmer at smække sine reads ind i if !Page.Postback blokken hvordan er det hos dig ?
Avatar billede neoman Novice
24. oktober 2007 - 18:41 #2
!page.IsPostback
Avatar billede arne_v Ekspert
24. oktober 2007 - 18:45 #3
Ingen opdatering og ingen fejl => jeg tror at WHERE companyId = @companyId ikke matcher
nogle række.

Check companyId for execute.
Avatar billede simsen Mester
24. oktober 2007 - 18:51 #4
Min pageload ser ud som følgende:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            panShowCompanies.Visible = true;

            //Henter liste med firmaere
            ShowCompanyList();
        }
    }

Mht companyId så er den lig med 10 - og jeg har en med id 10 i databasen - det har jeg checket
Avatar billede simsen Mester
24. oktober 2007 - 18:54 #5
Jeg vil spørge om det kan være noget med jeg ikke får lukket min database korrekt efter sidste åbning (jeg har nemlig ændret den del)?

Jeg åber databasen:

public class ERSConnect
{
    //Constants
    public const string SessionUserId = "userid";
    public const string CookieUsername = "username";
    public const string CookieUserInfo = "userinfo";
    public const string SessionAdminId = "adminid";
    public const string CookieAdminname = "adminname";
    public const string CookieAdminInfo = "admininfo";
    public const int InvalidUserId = 0;

    public enum FStatus
    {
        Success = 0,
        Failure = 1,
    }

    //Database
    private const string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\Inetpub\\wwwroot\\ANSI\\ERS\\Database\\ErrorReporting.mdb;";
    //public string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:/web/localuser/ansi-design.dk/database/ErrorReporting.mdb;";

    private OleDbConnection connection = null;
    public OleDbCommand command = null;

    public ERSConnect()
    {
        connection = new OleDbConnection(connectionString);
        command = new OleDbCommand();
        command.Connection = connection;
        connection.Open();
    }

    public void Dispose()
    {
        connection.Close();
    }
}

Jeg referer til den i:
public class ERSCompany
{
    ERSConnect connect = new ERSConnect();

hvor jeg så har selve kaldet til databasen. I kaldet kalder jeg så connect.Dispose():
//Opdaterer firma oplysninger
    public Status UpdateCompany(int companyId, string companyName, string companyAdress, int companyZipCode, string companyCity, int companyPhone, string companyEmail)
    {
        Status status = Status.Failure;

        try
        {
            connect.command.CommandText = "UPDATE Company SET companyName = @companyName, companyAdress = @companyAdress, companyZipCode = @companyZipCode, companyPhone = @companyPhone, companyEmail = companyEmail WHERE companyId = @companyId";

            connect.command.Parameters.Clear();
            connect.command.Parameters.Add(new OleDbParameter("@companyId", companyId));
            connect.command.Parameters.Add(new OleDbParameter("@companyName", companyName));
            connect.command.Parameters.Add(new OleDbParameter("@companyAdress", companyAdress));
            connect.command.Parameters.Add(new OleDbParameter("@companyZipCode", companyZipCode));
            connect.command.Parameters.Add(new OleDbParameter("@companyCity", companyCity));
            connect.command.Parameters.Add(new OleDbParameter("@companyPhone", companyPhone));
            connect.command.Parameters.Add(new OleDbParameter("@companyEmail", companyEmail));

            connect.command.ExecuteNonQuery();

            status = Status.Success;
            connect.Dispose();
        }
        catch
        { }
               
        return status;
    }
Avatar billede neoman Novice
24. oktober 2007 - 18:56 #6
connect.command.Parameters.Add(new OleDbParameter("@companyId", companyId)); skal stå til sidst - for OleDb tager sig IKKE af parameterNAVNE men kun af rækkefølge
Avatar billede neoman Novice
24. oktober 2007 - 19:00 #7
Den slags fejl kan du nok undgå ved at specificere typen på parameteren - håber lige arne_v har et guldkorn her:)
Avatar billede neoman Novice
24. oktober 2007 - 19:22 #8
I øvrigt - overvej at tage et kig på typed data sets: det er bare SÅÅÅ nemt at arbejde med, og ændre i:-)
Avatar billede simsen Mester
24. oktober 2007 - 19:57 #9
Det hjalp ikke at flytte companyId til slut - og hvad mener du med typed data sets - når det er en update?
Avatar billede neoman Novice
24. oktober 2007 - 20:06 #10
Ja og det hjalp ikke at flytte fordi du har defineret flere parametre end der er i din SQl - tæl dem op !

Med typed data sets kan du gemme alt sql derude, og det er vildt nemt at ændre i, og så slipper man for alskens pjat med rækkefølge. Prøv at google på det. Ellers , opret et typed data set i din VS/VWD, og når du står i designeren højreklik og vælg new DataAdapter.

Fordelen er at man så refererer til data ved navn. F.eks, hvis du har et dataset med en tabel som hedder Companies, så kan du i din kode sige, til en række i Companies, som vi så benævner Company:

Company.Name = "blabla"
Company.Email="mere bla"
Avatar billede neoman Novice
24. oktober 2007 - 20:20 #11
Mht parametre : http://msdn2.microsoft.com/en-us/library/system.data.oledb.oledbparameter.oledbparameter.aspx

hvis du specificerer typen så vil systemet nok brokke sig runtime hvis en parameter af den forkerte type bliver sat til det forkerte sted, så det er nok også værd at prøve.

I dit tilfælde så var det en Integer som skulle sammenlignes med en String, og mit gæt er systemet ville have brokket sig, hvis der var en type på parameteren, i stedet for en eller anden bevidstløs automatisk typekonvertering begået af systemet:)
Avatar billede simsen Mester
24. oktober 2007 - 20:31 #12
neoman

Ok - forsøgte at lege med det - men kunne ikke få hjælp herinde, da jeg normalt bruger accessdatabase og det sted jeg fandt, hvor det var nemmest var med sql database - og der fik jeg en fejl....som jeg som sagt ikke kunne få hjælp til - så opgav jeg og gør som jeg så plejer at gøre.....og jeg plejer ikke at have fejl i det....kun denne gang...

Og ja jeg mangnlede én men det er heller ikke nok til at den gemmer i databasen :-/

Har fundet fejlen nr. 2, ved at starte forfra (som gik godt). Sammenlignede linie for linie..... det var companyEmail = companyEmail.....

Tak for hjælpen neoman - smid et svar :-)
Avatar billede neoman Novice
24. oktober 2007 - 20:36 #13
fungerer det nu så ? Og det med de typed data sets: prøv det. Det tager 1 time at sætte sig ind i, men sparer en heeeeeeeeeelvedes masse tid. Selv hvis jeg ikke skal bruge et helt dataset så bruger jeg det alligevel til prototyping, og undgår at have sql-kode spredt all over min applikation.
Avatar billede simsen Mester
24. oktober 2007 - 21:50 #14
Nu har jeg ikke sql datat hængende udover min applikation - har dem pænt i nogle cs filer, så de er nemme at gå til *SS*
Avatar billede neoman Novice
24. oktober 2007 - 21:52 #15
Nu fik du et råd - og dem kan man jo altid behandle som man lyster.
Avatar billede simsen Mester
25. oktober 2007 - 08:27 #16
Hov sorry - det var ikke for at være negativ - forsøgte kun at forklare hvordan jeg har organiseret mig - ked af du opfattede det sådan. Tager altid gernne mod råd, da jeg jo gerne vil udvikle mig :-)
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