HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Névnap web service készítése


Példaprogram letöltése

173421 bájt

Készítünk most egy olyan web service-t, mely két funkcióval fog rendelkezni: az egyik azt árulja el számunkra, hogy egy adott napon milyen névnapok vannak, míg a másik arról árulkodik, hogy egy adott keresztnév mely napokon van.
A web service felhasználásával könnyen készíthetünk olyan alkalmazást, melyben e két funkciót csak felhasználnunk kell és a megvalósítására nincs gondunk.

A mellékelt példa fordítása előtt a Service1.asmx.cs forráskód 60. sorában lévő connStr változóban módosítani kell az SQL szerverhez megadott kapcsolódási sztringet. További tennivaló, hogy a mellékelt NameDay_Data.MDF adatbázist felvegyük az SQL szerverünk alá.
A megvalósításhoz készítettünk egy adatbázist MS SQL szerver alá, melyben egyetlen tábla kapott helyet Days névvel. Ebbe került eltárolásra, hogy mely napon milyen név szerepel.
Oszlop név Típus Méret
MonthNum int 4
DayNum int 4
Name1 varchar 60
Name2 varchar 60
Egy dátumhoz két név is rendelhető, de minimum egynek szerepelnie kell.
Nézzük most a két függvényt. A GetNamesByDate függvény egy dátum alapján visszaad egy sztringeket tartalmazó tömböt. A tömb elemei azokat a neveket fogja tartalmazni, melyek az adott napra esnek. A függvény egy DateTime típusú paramétert vár. E dátumból természetesen csak a hónap és a nap kerül felhasználásra.


    [WebMethod]
    public string[] GetNamesByDate(DateTime dateValue)
    { 
Első lépésként egy kapcsolat felépítésére lesz szükségünk az adatbázissal, hogy előkereshessük a szükséges adatokat.
      SqlConnection connection = new SqlConnection(connStr);
      connection.Open();
A lekérdezés egyszerű: elő kell keresnünk a Days tábla azon sorát, amelynél egyezik a hónap és nap.
      SqlCommand c = new SqlCommand("select name1, name2 from Days where (MonthNum=@monthnum) and (DayNum=@daynum)", connection);
      c.Parameters.Add("@monthnum", SqlDbType.Int);
      c.Parameters.Add("@daynum", SqlDbType.Int);
      c.Parameters["@monthnum"].Value = dateValue.Month;
      c.Parameters["@daynum"].Value = dateValue.Day;
Futtatva a lekérdezést biztosak lehetünk benne, hogy egy sort kapunk eredményül, így nem szükséges ciklus, hogy végigmenjünk az eredményhalmazon, elegendő az SqlDataReader osztály Read függvényének egyszeri meghívása az egyetlen sor eléréséhez.
      SqlDataReader dr = c.ExecuteReader();
      dr.Read();
Meg kell vizsgálnunk, hogy a name2 oszlop rendelkezik-e értékkel. Ha ennek értéke null lenne, akkor csak egy nevet kell visszaadnunk, ha nem null, akkor a tömbnek két eleme lesz.
      int count = 1;
      if (!dr.IsDBNull(1))
      {
        count++;
      }
      String[] output = new String[count];
Az egy vagy két nevet kiolvassuk az output nevű tömbbe, majd zárjuk az adatbázis kapcsolatot és visszatérési értékként az output tömböt adjuk.
      output[0]=dr.GetString(0);
      if (!dr.IsDBNull(1))
      {
        output[1] = dr.GetString(1);
      }
      dr.Close();
      connection.Close();
      return output;
    }
A másik függvényt GetDatesByName-nek neveztük el. Paraméterként egy sztringet vár, melyben azt a nevet kell megadnunk, amelynek előfordulási dátumaira kíváncsiak vagyunk. A név megadásánál ügyeljünk arra, hogy az első karakter nagybetű legyen és az egész szó ékezet helyes, különben nem kapunk találatot.
A függvény visszatérési értékként egy tömböt ad, melynek minden eleme egy DateTime típus. Ezek a dátumok jelölik, hogy az adott név mely napokon van. A hónap és nap az adattáblából származik, míg az év, mindig az aktuális év száma lesz.


    [WebMethod]
    public DateTime[] GetDatesByName(string name)
    {
A megvalósítás első lépése most is egy kapcsolat felvétel az adattáblával, majd egy sql lekérdezés futtatása, melyben a Name1 és Name2 oszlop értékeiben keressük a megadott nevet.
      SqlConnection connection = new SqlConnection(connStr);
      connection.Open();
      SqlCommand c = new SqlCommand("select MonthNum, DayNum from Days where (Name1=@nameValue) or (Name2=@nameValue)", connection);
      c.Parameters.Add("@nameValue", SqlDbType.VarChar, 60);
      c.Parameters["@nameValue"].Value = name;
      SqlDataReader dr = c.ExecuteReader();
A lekérdezés futtatása után egy Stack osztályt hozunk létre. Itt hozzuk létre a kapott eredmény alapján a DateTime típusokat. Egy y nevű változóba tároljuk az aktuális évszámot, melyet majd a dátum készítéskor használunk fel.
      Stack s = new Stack();
      int y = DateTime.Now.Year;
Egy ciklus segítségével megyünk végig a lekérdezés összes során. Minden találatnál létrehozunk egy új DateTime-ot, melybe bekerül az év, hónap, nap száma.
      while (dr.Read())
      {
        s.Push(new DateTime(y, dr.GetInt32(0), dr.GetInt32(1)));
      }
      dr.Close();
      connection.Close();
      if (s.Count>0)
      {
Végül készítünk egy tömböt, DateTime típusú elemekkel és egy ciklussal átmásoljuk a Stack-en létrehozott dátumokat.
        DateTime[] dt = new DateTime[s.Count];        
        int i=0;
        while (i<=s.Count)
        {
          dt[i++] = (DateTime)s.Pop();
        }
        return dt;
      }
      else
      {
        return null;
      }
    }

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2002 évkönyv 193. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |