logi sisse meist KKK

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:

$q = MySQL_Query("SELECT * FROM `users`");
while($result = MySQL_Fetch_Assoc($q))
{
    print_r($result);
}

Kirjutasin valmis midagi sellist:

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):

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]);
    }
}

küsitud Apr 02 '10 at 20:18

Alan%20Ibrus's gravatar image

Alan Ibrus
135


Tõenäoliselt peaksid saama midagi sellist teha (kood on testimata):

SqlConnection connection;

public DataReader query(String sql){
    SqlCommand cmd = new SqlCommand(connection, sql);
    return cmd.ExecuteReader();
}

//------

connection = new SqlConnection(...);

DataReader rdr = query("SELECT * FROM users");

while(rdr.read()){
    for(int i = 0; i < rdr.ItemCount; i++){
        log.Output(i + ") " + rdr.getItemName(i) + " = " + rdr.getItem(i) );
    }
}
rdr.close();
link

vastatud Apr 04 '10 at 15:11

egon's gravatar image

egon ♦♦
71138

Kahjuks DataReader objekti ODBC-ga kasutada ei saa... Aga tänud hea vastuse eest. Uurin võimalusi ehk saangi asja SqlClienti peale ümber kolida.

(Apr 06 '10 at 15:48) Alan Ibrus

... ise küsin ise vastan, aga nüüd egoni koodist motivatsiooni saades ja lähemalt uurides leidsin siiski System.Data.Common alt DbDataReader objekti ja sellega sain ka vähe (palju) lihtsamaks:

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)]);
}
link

vastatud Apr 06 '10 at 16:03

Alan%20Ibrus's gravatar image

Alan Ibrus
135

rdr[rdr.GetName(i)]... apis peaks mingi parem käsk selle jaoks olema... huupi pakun, et on äkki rdr.Get(i) või rdr.GetItem(i)

(Apr 06 '10 at 18:40) egon ♦♦
Sinu vastus
toggle preview

Jälgi seda küsimust

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or __italic__
  • **bold** or __bold__
  • link:[tekst](http://url.com/ "pealkiri")
  • pilt?![alt tekst](/path/img.jpg "pealkiri")
  • nummerdatud nimekiri: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Pinu tööpakkumised

kõik pakkumised »

Sildid:

×10
×9
×2
×2

küsitud: Apr 02 '10 at 20:18

nähtud: 906 korda

viimati uuendatud: Apr 06 '10 at 16:03

Litsents: Creative Commons Attribution License | Kontakt: info@pinu.ee