Avatar billede luke2009 Nybegynder
11. juni 2009 - 23:35 Der er 5 kommentarer og
1 løsning

kan ikke kalde stored procedure flere gange

Kalder en stored procedure der henter alle data fra en tabel ved programmets constructor. Dette virker fint. Når jeg så kalder den samme stored procedure fra en metode senere for at genindhente alle data fra samme tabel, så gives en exception

procedure .... has no parameters and arguments were supplied

Hvad kan årsagen være?
Avatar billede arne_v Ekspert
12. juni 2009 - 00:08 #1
Svært at sige uden at se noget kode !
Avatar billede j3ppah Novice
12. juni 2009 - 08:40 #2
Hehe... Jaa, kunne nu også godt lige bruge noget kode at kigge på (Bare reminder om du ikke har fået smidt det her ind endnu.)
Avatar billede luke2009 Nybegynder
12. juni 2009 - 10:32 #3
Her er så nogle stumper kode med kommentarer

Her er min databasecontroller

using System;
using System.Collections.Generic;
using System.Text;
using Model;
using Interfaces;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;

namespace Controllers
{
    class DB
    {
        private SqlConnection con;
        private SqlCommand cmd;

        private Controller boligforening;

        public DB(Controller boligforening)
        {
            this.boligforening = boligforening;

            string connectionStr;

            connectionStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\boligforening.mdf;Integrated Security=True;User Instance=True";


            // Skab forbindelses-objekt udfra connectionStr
            con = new SqlConnection(connectionStr);

            // Skab kommando-objekt og tilknyt til forbindelses-objekt
            cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandType = CommandType.StoredProcedure;

        }

public bool HentTyper()
        {
            cmd.CommandText = "HentTyper";

            SqlDataReader datareader;

            int id;
            string kontotype;


            try
            {
                con.Open();            // Åben forbindelsen til databasen
                datareader = cmd.ExecuteReader();

                // Gennemløb datareader (result set)
                while (datareader.Read() == true)
                {
                    id = (int)datareader["Id"];
                    kontotype = (string)datareader["Kontotype"];

                    boligforening.OpretTyperModel(id, kontotype);    // Opret varen i modellen
                }

                con.Close();            // Luk forbindelsen
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();
                return false;
            }

            return true;
        }
      public bool OpretType(string nytype)
        {
            cmd.CommandText = "OpretType";
            cmd.Parameters.Clear();

            SqlParameter param = new SqlParameter("@Kontotype", SqlDbType.NVarChar);
            param.Value = nytype;
            cmd.Parameters.Add(param);

            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();
                return false;
            }

            return true;
        }

Her er så min facadecontroller

using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using Model;
using Interfaces;
using System.IO;

namespace Controllers
{
    public class Controller
    {
        //ATTRIBUTTER
        private BilagsCollection bilagsCol;
        private KontoCollection kontoCol;
        private DB dbfacade;
        private FaellesCol faellesCol;
        private BeboerCollection beboerCol;
       
        //KONSTRUKTØR
        public Controller()
        {
            bilagsCol = new BilagsCollection();
            kontoCol = new KontoCollection();
            dbfacade = new DB(this);
            faellesCol = new FaellesCol();
            beboerCol = new BeboerCollection();
            dbfacade.HentBilag();
            dbfacade.HentTyper(); //det er denne her som er problemet. Men her kan jeg godt kalde den flere gange, hvis jeg vil.
            dbfacade.HentFaelles();
            dbfacade.Hentboere();
            TjekAar();
        }
  public void OpretTyperModel(int id, string kontotype)
        {
            kontoCol.OpretTyper(id, kontotype);
        }

  public bool OpretType(string nytype)
        {
            if (dbfacade.OpretType(nytype))
            {
                dbfacade.HentTyper(); //Her går det galt, og giver en exception ovre i dbfacade.
                return true;
            }
            else
                return false;
        }
Avatar billede sirius Nybegynder
12. juni 2009 - 10:40 #4
Du bruger den samme SqlCommand til både HentTyper og OpretType.
Ved OpretType tilføjer du et parameter, hvis du så efterfølgende kalder HentTyper, vil dette parameter stadig være der, og det giver fejl hvis den stored procedure ikke forventer nogen parameter.

Så enten skal du bruge forskellige SqlCommands eller også skal du bruge cmd.Parameters.Clear(); i starten af HentTyper
Avatar billede luke2009 Nybegynder
12. juni 2009 - 17:38 #5
Ja, det hjalp på det. Jeg havde ikke tænkt over, at sqlcommand er det samme objekt som skabes i starten.

Mange tak for din hjælp sirius. Læg et svar.
Avatar billede sirius Nybegynder
13. juni 2009 - 11:36 #6
var så lidt :-)
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