praegune kellaaeg 19.06.2025 19:01:59
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
Alan
HV veteran

liitunud: 12.02.2008
|
02.04.2010 21:35:05
C# ja MySQL "fetch" massiivi |
|
|
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:
Kirjutasin valmis midagi sellist:
c#:
|
public ArrayList Fetch(string query) { ArrayList ret = new ArrayList (); try { sqlCommand.CommandText = query; OdbcDataAdapter sqlDataAdapter = new OdbcDataAdapter (); sqlDataAdapter.SelectCommand = sqlCommand; DataSet sqlDataSet = new DataSet (); sqlDataAdapter.Fill(sqlDataSet); DataTable table = sqlDataSet.Tables[0]; for (int r = 0; r < table.Rows.Count; r++) { SortedList tmp = new SortedList (); DataRow row = table.Rows[r]; for (int c = 0; c < table.Columns.Count; c++) { tmp.Add(table.Columns[c].ToString(), row[table.Columns[c]].ToString()); } ret.Add(tmp); } } catch (Exception e) { log.Output("Cannot execute SQL Query: " + query); log.Output(e.ToString()); } return ret; }
|
Ja nii kasutan praegu (just seda osa soovikski saada veel lühemalt (soovitavalt ühe tsükliga) kirja pandud):
c#:
|
ArrayList results = db.Fetch("SELECT * FROM users"); for(int i = 0; i < results.Count; i++) { SortedList data = (SortedList)results[i]; foreach (string columnName in data.Keys) { log.Output(i + ") " + columnName + " = " + data[columnName]); } }
|
|
|
Kommentaarid: 131 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
121 |
|
tagasi üles |
|
 |
andreie
HV vaatleja

liitunud: 09.09.2006
|
03.04.2010 10:10:21
|
|
|
Ma pole PHP-d palju kirjutanud ja ei kujuta hästi ette, kuidas Sa kahest tsüklist ühe teed. Kas ehk abifunktsiooniga StringOfSortedList?
c#:
|
static string StringOfSortedList(SortedList sl) { var r = new StringBuilder (); foreach (var columnName in sl.Keys) { r.append(columnName + " => \"" + sl[columnName] + "\" ; "); } return r.ToString(); }
|
Muide, NHibernate'i (ja NHibernat.Mapping) abil saab C# struktuurid seostada üks-ühele andmebaasi tabelitega. Näide:
c#:
|
using NHibernate.Mapping.Attributes; ... [Class(Name = "User", Lazy=false)] public class User { [Id(Name = "Id")] [Generator(1, Class = "native")] public int Id { get; set; } [Property] public string FirstName { get; set; } [Property] public string LastName { get; set; } public string override ToString() { return Id.ToString() + ": " + FirstName + " " + LastName; } } // class User ... List<User> users_table = DbSession. CreateCriteria(typeof(User )). List<User> (); foreach (User user in users_table) { log.Output(user.ToString()); }
|
_________________ Unix survives only because everyone else has done so badly. |
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
5 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
03.04.2010 10:36:51
|
|
|
andreie, PHP's on see $result ühetasemeline massiiv lihtsalt, kus iga võti on üks tulp.
php:
|
$sql = "SELECT id as userid, fullname, userstatus FROM sometable WHERE userstatus = 1"; }
|
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
mrkaarel
HV vaatleja
liitunud: 08.07.2008
|
03.04.2010 13:10:30
|
|
|
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 |
|
 |
Absona
Lõuapoolik

liitunud: 17.09.2008
|
03.04.2010 13:12:18
|
|
|
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 |
|
 |
Alan
HV veteran

liitunud: 12.02.2008
|
06.04.2010 19:05:25
|
|
|
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#:
|
public DbDataReader FetchArray(string query) { sqlCommand.CommandText = query; return sqlCommand.ExecuteReader(); } DbDataReader rdr = db.FetchArray("SELECT * FROM users"); while (rdr.Read()) { for (int i = 0; i < rdr.FieldCount; i++) log.Output(rdr.GetName(i) + " = " + rdr[rdr.GetName(i)]); }
|
|
|
Kommentaarid: 131 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
121 |
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
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.
|