Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  C# ja MySQL "fetch" massiivi märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
Alan
HV veteran
Alan

liitunud: 12.02.2008



Autoriseeritud ID-kaardiga

sõnum 02.04.2010 21:35:05 C# ja MySQL "fetch" massiivi vasta tsitaadiga

Tegelen siin üle pika aja C#-ga jälle ja tekkis dilemma, kuidas oleks kõige mõistlikum PHP mysql_fetch_assoc funktsiooni C#-i kirjutada.
Enda arust tuli väga kohmakas lahendus, seega ootaks kriitikat kuidas lühemalt soovitud tulemust saada.

PHP-s pean silmast sellist lihtsat lahendust:
php:
  1. $q = MySQL_Query("SELECT * FROM `users`");
  2. while($result = MySQL_Fetch_Assoc($q))
  3. {
  4. ...
  5. }


Kirjutasin valmis midagi sellist:
c#:
  1.  
  2. public ArrayList Fetch(string query)
  3. {
  4.         ArrayList ret = new ArrayList();
  5.         try
  6.         {
  7.             sqlCommand.CommandText = query;
  8.             OdbcDataAdapter sqlDataAdapter = new OdbcDataAdapter();
  9.             sqlDataAdapter.SelectCommand = sqlCommand;
  10.             DataSet sqlDataSet = new DataSet();
  11.             sqlDataAdapter.Fill(sqlDataSet);
  12.             DataTable table = sqlDataSet.Tables[0];
  13.        
  14.             for (int r = 0; r < table.Rows.Count; r++)
  15.             {
  16.                 SortedList tmp = new SortedList();
  17.                 DataRow row = table.Rows[r];
  18.                 for (int c = 0; c < table.Columns.Count; c++)
  19.                 {
  20.                     tmp.Add(table.Columns[c].ToString(), row[table.Columns[c]].ToString());
  21.                 }
  22.                 ret.Add(tmp);
  23.             }   
  24.         }
  25.         catch (Exception e)
  26.         {
  27.             log.Output("Cannot execute SQL Query: " + query);
  28.             log.Output(e.ToString());
  29.         }
  30.         return ret;
  31. }


Ja nii kasutan praegu (just seda osa soovikski saada veel lühemalt (soovitavalt ühe tsükliga) kirja pandud):

c#:
  1.  
  2. ArrayList results = db.Fetch("SELECT * FROM users");
  3. for(int i = 0; i < results.Count; i++)
  4. {
  5.     SortedList data = (SortedList)results[i];
  6.     foreach (string columnName in data.Keys)
  7.     {
  8.         log.Output(i + ") " + columnName + " = " + data[columnName]);
  9.     }
  10. }
  11.  
Kommentaarid: 131 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 121
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
andreie
HV vaatleja
andreie

liitunud: 09.09.2006




sõnum 03.04.2010 10:10:21 vasta tsitaadiga

Ma pole PHP-d palju kirjutanud ja ei kujuta hästi ette, kuidas Sa kahest tsüklist ühe teed. Kas ehk abifunktsiooniga StringOfSortedList?
c#:
  1.  
  2. static string StringOfSortedList(SortedList sl)
  3. {
  4.         var r = new StringBuilder();
  5.         foreach (var columnName in sl.Keys)
  6.         {
  7.                 r.append(columnName + " => \"" + sl[columnName] + "\" ; ");
  8.         }
  9.         return r.ToString();
  10. }
  11.  


Muide, NHibernate'i (ja NHibernat.Mapping) abil saab C# struktuurid seostada üks-ühele andmebaasi tabelitega. Näide:
c#:
  1.  
  2. using NHibernate.Mapping.Attributes;
  3.  
  4. ...
  5.  
  6.     [Class(Name = "User", Lazy=false)]
  7.     public class User
  8.     {
  9.         [Id(Name = "Id")]
  10.         [Generator(1, Class = "native")]
  11.         public int Id { get; set; }
  12.  
  13.         [Property]
  14.         public string FirstName { get; set; }
  15.  
  16.         [Property]
  17.         public string LastName { get; set; }
  18.  
  19.         public string override ToString()
  20.         {
  21.                 return Id.ToString() + ": " + FirstName + " " + LastName;
  22.         }
  23.     } // class User
  24.  
  25. ...
  26.  
  27.         List<User>      users_table = DbSession.CreateCriteria(typeof(User)).List<User>();
  28.         foreach (User user in users_table)
  29.         {
  30.                 log.Output(user.ToString());
  31.         }
  32.  

_________________
Unix survives only because everyone else has done so badly.
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 03.04.2010 10:36:51 vasta tsitaadiga

andreie, PHP's on see $result ühetasemeline massiiv lihtsalt, kus iga võti on üks tulp.
php:
  1. $sql = "SELECT id as userid, fullname, userstatus
  2.         FROM   sometable
  3.         WHERE  userstatus = 1";
  4.  
  5. $result = mysql_query($sql);
  6.  
  7. while ($row = mysql_fetch_assoc($result)) {
  8.     echo $row["userid"];
  9.     echo $row["fullname"];
  10.     echo $row["userstatus"];
  11. }
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
mrkaarel
HV vaatleja

liitunud: 08.07.2008




sõnum 03.04.2010 13:10:30 vasta tsitaadiga

Ma PHP poolega pole kursis, äkki seal on mingeid nüansse veel, aga kas ei sobiks abifunktsioon, mis sul etteantud SQL päringustringi peale tagastab avatud DataReaderi? Umbes midagi (kood võib pisivigu täis olla, pole hetkel tööarvuti taga):


public DbDataReader OpenDataReader(string queryText, DbConnection conn)
{

   DbCommand cmd = conn.CreateCommand();
   cmd.CommandText = queryText;
   return cmd.ExecuteReader();
}


ja kasutamiseks:


DbConnection conn = new SQLConnection(connectionString);
conn.Open();

using(DbDataReader rdr = OpenDataReader("SELECT foo1, foo2 FROM bar", conn)) {
   while(rdr.Read()) {
      Console.WriteLine(rdr["foo1"]);   
      Console.WriteLine(rdr["foo2"]);   
   }   
}

conn.Close();


viimati muutis mrkaarel 03.04.2010 13:11:13, muudetud 1 kord
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
Absona
Lõuapoolik
Lõuapoolik

liitunud: 17.09.2008




sõnum 03.04.2010 13:12:18 vasta tsitaadiga

Parimaks lahenduseks on LINQ kasutamine (saab paari koodireaga hakkama), seda toetatakse alates .NET 3.5.

Toon paar näidet (ei ole teemaga seotud kuid siit saab vajalikud niidiotsad kätte):


            int[] täisarvud = { 1, 6, 2, 27, 10, 33, 12, 8, 14, 5 };

            // Näide 1
            IEnumerable<int> arvud = from numbrid in täisarvud
                                     where numbrid >= 10
                                     select numbrid;
            var vastus = "Täisarvud >=: ";
            foreach (var arv in arvud)
                vastus += arv + "; ";
            MessageBox.Show(vastus);

            // Näide 2
            IEnumerable<int> esimesedNeliArvu = täisarvud.Take(4);
            vastus = "Esimesed neli arvu:  ";
            foreach (var arv in esimesedNeliArvu)
                vastus += arv + "; ";
            MessageBox.Show(vastus);



            private static void Näide() {
            List<Auto> Autod = LooAutodeNimekiri();
            IEnumerable<Auto> KallimadAutod = from auto in Autod
                                              where auto.Hind > 20000
                                              select auto;
            vastus = "Kallim auto:  ";
            foreach (Auto auto in KallimadAutod)
                vastus += string.Format("{0} maksab {1}", auto.Nimi, auto.Hind);
            MessageBox.Show(vastus); }

        private static List<Auto> LooAutodeNimekiri()
        {
            var autodeNimekiri = new List<Auto> {
             new Auto
                 {
                     Nimi = "Zaporozhets",
                     Mark = "ZAZ",
                     Mudel = "968A",
                     Aasta = "1975",
                     Kubatuur = "1.1",
                     Kütus = "Bensiin",
                     Hind = 30000
                 },
             new Auto
                 {
                     Nimi = "Zhiguli",
                     Mark = "VAZ",
                     Mudel = "2101",
                     Aasta = "1970",
                     Kubatuur = "1.2",
                     Kütus = "Bensiin",
                     Hind = 15000
                 }
            };
            return autodeNimekiri;
        }

    public class Auto
    {
        public string Nimi { get; set; }
        public string Mark { get; set; }
        public string Mudel { get; set; }
        public string Aasta { get; set; }
        public string Kubatuur { get; set; }
        public string Kütus { get; set; }
        public double Hind { get; set; }

    }

_________________
Veebilehed, veebiprogrammeerimine, veebilahendused
Erinevad rakendused ja skriptid.
Kommentaarid: 11 loe/lisa Kasutajad arvavad:  :: 2 :: 0 :: 8
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Alan
HV veteran
Alan

liitunud: 12.02.2008



Autoriseeritud ID-kaardiga

sõnum 06.04.2010 19:05:25 vasta tsitaadiga

mrkaarel kirjutas:
Ma PHP poolega pole kursis, äkki seal on mingeid nüansse veel, aga kas ei sobiks abifunktsioon, mis sul etteantud SQL päringustringi peale tagastab avatud DataReaderi? Umbes midagi (kood võib pisivigu täis olla, pole hetkel tööarvuti taga):


public DbDataReader OpenDataReader(string queryText, DbConnection conn)
{

   DbCommand cmd = conn.CreateCommand();
   cmd.CommandText = queryText;
   return cmd.ExecuteReader();
}


ja kasutamiseks:


DbConnection conn = new SQLConnection(connectionString);
conn.Open();

using(DbDataReader rdr = OpenDataReader("SELECT foo1, foo2 FROM bar", conn)) {
   while(rdr.Read()) {
      Console.WriteLine(rdr["foo1"]);   
      Console.WriteLine(rdr["foo2"]);   
   }   
}

conn.Close();



See lahendus läks peaaegu käiku. Eesmärk ei olnud küll võtmeid ise käsitsi välja kirjutada, aga õnneks on DbDataReader objektis juba piisavalt võimalusi, seega nuputasin vähe edasi:

c#:
  1. public DbDataReader FetchArray(string query)
  2. {
  3.     sqlCommand.CommandText = query;
  4.     return sqlCommand.ExecuteReader();
  5. }
  6.  
  7. DbDataReader rdr = db.FetchArray("SELECT * FROM users");
  8. while (rdr.Read())
  9. {
  10.     for (int i = 0; i < rdr.FieldCount; i++)
  11.         log.Output(rdr.GetName(i) + " = " + rdr[rdr.GetName(i)]);
  12. }
Kommentaarid: 131 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 121
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  C# ja MySQL "fetch" massiivi
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.