Avatar billede kagehuset Nybegynder
31. januar 2008 - 09:47 Der er 23 kommentarer og
1 løsning

Returnere array i webservice

Hejsa

Jeg har en webservice der skal returnere et array.
Arrayet er en struct (orderEntry) jeg selv har lavet, hvorfra jeg laver et array orderData:

orderEntry[] orderData;

og webservice metoden:

[WebMethod(Description="my webservice")]
    public OrderEntry getEntries(string id)
    {
        readEntries(id);
        return orderData;
    }

Jeg får en " Typen 'Service.orderEntry[]' kan ikke implicit konverteres til 'service.orderEntry' " fejl i VS2005 når jeg prøver at køre det. Nogen der kan pege mig i den rigtige retning?

mvh
Mads
Avatar billede nielle Nybegynder
31. januar 2008 - 09:53 #1
Brufer du store eller små bogstaver?

Men prøv ar rette:

public OrderEntry getEntries(string id)

til:

public OrderEntry[] getEntries(string id)
Avatar billede kagehuset Nybegynder
31. januar 2008 - 11:03 #2
Hej igen

Nåå - ja - store og små bogstaver var vidst lige en skrivefejl :-)

Hvis jeg prøver OrderEntry[] i stedet for OrderEntry får build succeeded fra VS, men når jeg prøver at køre webservicen får jeg en fejl 500. Syntes iøvrigt jeg har slået debugging til i web.config, men syns ikke der kommer meget debugging info om den fejl 500...

mvh
Mads
Avatar billede nielle Nybegynder
31. januar 2008 - 11:12 #3
Gå ind i Internet Options, vælg Ananveret, scroll ned til at du finder checkboksen udfor noget med "venlige HTTP fejl beskeder". Fjern hakket og prøv så igen.
Avatar billede kagehuset Nybegynder
31. januar 2008 - 13:38 #4
Så fik jeg fejlbeskeder :-)
Den kommer med:

System.NullReferenceException: Objektreferencen er ikke indstillet til en forekomst af et objekt.
  ved Service.readEntries(String inputIds) i Service.cs:linje 50
  ved Service.getEntries(String id) i Service.cs:linje 66

readEntries ser således ud:

public void readEntries(string inputIds)
    {
        string connectionString = "provider=Microsoft.Jet.OLEDB.4.0;data source=TestDB.mdb";
        OleDbConnection OleDbConnection = new OleDbConnection(connectionString);
        OleDbCommand OleDbCommand = OleDbConnection.CreateCommand();

        string[] ids = inputIds.Split(',');

        OleDbConnection.Open();

        for (int i = 0; i < ids.Length; i++)
        {
            OleDbCommand.CommandText = "SELECT * FROM tOrders WHERE id=" + Convert.ToInt32(ids[i]);
            OleDbDataReader OleDbDataReader = OleDbCommand.ExecuteReader();

            OleDbDataReader.Read();

            orderData[i].CustomerNo = Convert.ToInt32(OleDbDataReader["CustomerNo"].ToString());

            OleDbDataReader.Close();
        }
        OleDbConnection.Close();
    }//readEntries

og getEntries står ovenfor i WebMethod.

Er det fordi den ikke er forberedt på at få et arary ind eller hvordan?

mvh
Mads
Avatar billede nielle Nybegynder
31. januar 2008 - 16:56 #5
Det ville nok hjælpe hvis du fortalte hvilken der var linje 50?

Jeg gætter dog på at det er din orderData[] som ikke er initialiseret. Hvor kommer den egentlig fra?

Umiddelbart ville jeg synes at det var pære programmering, hvis det var readEntries() som initialiserede og oprettede orderData[]. Så kunne den passende returneder den i stedet for void.
Avatar billede kagehuset Nybegynder
31. januar 2008 - 19:28 #6
Hej igen

Jaa det kan du have ret i. Det er orderData der er linje 50, og den er et array af orderEntry som vistnok står i det originale spørgsmål. Men kan godt se din pointe - jeg prøver at lave readEntries() om så den returnerer arrayet fremfor void så snart jeg kommer tilbage til puteren i morgen tidlig ;-)
Avatar billede nielle Nybegynder
04. februar 2008 - 17:27 #7
Kom du videre med denne her?
Avatar billede kagehuset Nybegynder
04. februar 2008 - 18:11 #8
Hej igen

Sorry jeg ikke lige fik opdateret tråden - der kom lige pludselig en masse andet i vejen. Jeg forsøgte at fjerne void og returnere funktionen i stedet, men uden held. Kan  desværre først poste hele koden på fredag.

Tak for hjælpen so far!
Mads
Avatar billede nielle Nybegynder
04. februar 2008 - 20:54 #9
Jeg venter til da :^)
Avatar billede kagehuset Nybegynder
08. februar 2008 - 09:24 #10
Hej igen

Her er koden for den simple webservice. Den build'er fint i VS, men så snart den åbnes i browser får jeg fejlen:

System.NullReferenceException: Objektreferencen er ikke indstillet til en forekomst af et objekt.
  ved Service.readEntries(String inputIds) i c:\Users\Vista-1\Documents\Visual Studio 2005\WebSites\dbService\App_Code\Service.cs:linje 50
  ved Service.getDatabaseEntries(String id) i c:\Users\Vista-1\Documents\Visual Studio 2005\WebSites\dbService\App_Code\Service.cs:linje 67

Linje 50 og 67 er markeret i koden...

public class Service : System.Web.Services.WebService
{
    public Service () {

        //Uncomment the following line if using designed components
        //InitializeComponent();
    }
   
    public struct OrderEntry
    {
        public int ID;
        public int CustomerNo;
    }
   
    OrderEntry[] orderData;

    //Old single input command: public void readEntries(int number)
    public OrderEntry[] readEntries(string inputIds)
    {
        string connectionString = "provider=Microsoft.Jet.OLEDB.4.0;data source=TestDB.mdb";
        OleDbConnection OleDbConnection = new OleDbConnection(connectionString);
        OleDbCommand OleDbCommand = OleDbConnection.CreateCommand();

        string[] ids = inputIds.Split(',');

       
        OleDbConnection.Open();

        for (int i = 0; i < ids.Length; i++)
        {
            OleDbCommand.CommandText = "SELECT * FROM tOrders WHERE id=" + Convert.ToInt32(ids[i]);
            OleDbDataReader OleDbDataReader = OleDbCommand.ExecuteReader();

            OleDbDataReader.Read();

            orderData[i].CustomerNo = Convert.ToInt32(OleDbDataReader["CustomerNo"].ToString()); //linje 50
            orderData[i].ID = Convert.ToInt32(ids[i]); //

            OleDbDataReader.Close();
        }
        OleDbConnection.Close();
        return orderData;
    }//readEntries

    [WebMethod(Description="Returns entries")]
    public OrderEntry[] getDatabaseEntries(string id)
    {
        readEntries(id); //linje 67
        return orderData;
    }
}

mvh
Mads
Avatar billede erikjacobsen Ekspert
08. februar 2008 - 09:29 #11
Kan det tænkes at du beder om et id, der ikke er i tabellen?
Avatar billede kagehuset Nybegynder
08. februar 2008 - 10:04 #12
Hejsa

ID'et er i tabellen. Oprindeligt kørte webservicen fint med man gav den et id og så returnere den noget, men jeg prøver at udbygge den til at ville acceptere flere id'er sepereret af et komma hvis det er til nogen hjælp...

mvh
Mads
Avatar billede erikjacobsen Ekspert
08. februar 2008 - 11:30 #13
Okay, men det er stadigvæk u-god kode ikke at tjekke, at der er en række før man bruger indholdet - du kan køre videre så længe du ved de id-er er der, men ret det snarest.

Problemet som du har er derimod at du ikke har oprettet arrayet orderData - derfor din null-reference.
Avatar billede kagehuset Nybegynder
08. februar 2008 - 11:34 #14
Jeg sørger for at bygge noget kontrol ind så den ikke bruger indholdet uden at kontrollere det er der først!

Jeg syntes ellers jeg har oprettet arrayet orderData over readEntries() funktionen:

public struct OrderEntry
    {
        public int ID;
        public int CustomerNo;
    }
 
    OrderEntry[] orderData;

mvh
Mads
Avatar billede erikjacobsen Ekspert
08. februar 2008 - 12:16 #15
Du har kun erklæret det, og så er det null. Du skal
1) Give det en størrelse, så det får et antal indgange
2) Lægge et objekt af typen OrderEntry i hver indgang med "new"
Avatar billede kagehuset Nybegynder
08. februar 2008 - 12:41 #16
Ahh yes - det var jo lige det jeg havde overset - det funker nu!
Tak for hjælpen - smider du et svar?
Avatar billede erikjacobsen Ekspert
08. februar 2008 - 13:49 #17
Nej tak, jeg samler ikke på point. Der burde vel falde lidt af til andre ... ?
Avatar billede kagehuset Nybegynder
08. februar 2008 - 14:18 #18
Ingen point og ingen karma - du er jo godheden selv, eller er det bare fordi der er fredag  ;-)

Havde tænkt nielle skulle have nogen - måske der kan komme et svar derfra?

mvh
Mads
Avatar billede erikjacobsen Ekspert
08. februar 2008 - 15:16 #19
Du må nu gerne give mig karma ... hvis du kan, hehe ;)
Jeg skal vist have rettet i mit minisite.

Næh, du, det lidt hjælp jeg lægger på eksperten.dk har været ganske pointløst i en 3-4 år. Point giver bare anledning til ævl og kævl, og det er jeg nu så dejligt fri for.
Avatar billede kagehuset Nybegynder
08. februar 2008 - 15:32 #20
Hmm der var du (u)heldig:


7. februar 2008, 15:49

Hej.

Til stor glæde for alle, kan jeg oplyse at vi har besluttet at fjerne karmasystemet på Eksperten.

Alle karma'er er blevet slettet og alt vedr. karmasystemet er fjernet.

Karmasystemet vil alligevel være fjernet i den nye version af Eksperten, men kontroverserne er den seneste tid blevet større og værre, hvilket har fået os til at fjerne systemet nu.



Syns godt nok nyheden står til at være postet om 19 minutter, men hva'... Du får ihvertfald et tak for hjælpen og god weekend :-)
Holder lige tråden kørende for at se om nielle vil have lidt point for hjælpen i starten af ugen!

mvh
Mads
Avatar billede erikjacobsen Ekspert
08. februar 2008 - 16:39 #21
Det er den 8. i dag ;) Det skete i går.
Avatar billede nielle Nybegynder
08. februar 2008 - 16:47 #22
Svar :^)
Avatar billede nielle Nybegynder
08. februar 2008 - 16:49 #23
Jeg tror nu at jeg ville oprette den der:

OrderEntry[] orderData;

som en:

List<OrderEntry> orderData;

i stedet.
Avatar billede kagehuset Nybegynder
08. februar 2008 - 21:44 #24
erikjacobsen -> Du har helt ret - skal vidst lære at læse...

nielle -> Det kan der være noget om - jeg bytter ud med en liste!

God weekend!

mvh
Mads
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