Avatar billede jakobdo Ekspert
28. september 2009 - 15:31 Der er 10 kommentarer og
2 løsninger

Hvordan laver jeg følgende kode i ASP.net / C#

Jeg kan f.eks. lave følgende kode i php:

//Flere rækker
mysql_connect(***,***,***);
mysql_select_db(***);
$q = mysql_query("SELECT * FROM table");
//Har vi data?
if(mysql_num_rows($q)>0){
    while($r = mysql_fetch_assoc($q)){
        echo $r['DATA'];
    }
}

//Enkelt række
mysql_connect(***,***,***);
mysql_select_db(***);
$q = mysql_query("SELECT * FROM table LIMIT 1");
//Har vi data?
if(mysql_num_rows($q)==1){
    $r = mysql_fetch_assoc($q);
    echo $r['DATA'];
}

eller

//Enkelt række
mysql_connect(***,***,***);
mysql_select_db(***);
$q = mysql_query("SELECT * FROM table LIMIT 1");
//Har vi data?
if(mysql_num_rows($q)==1){
    echo mysql_result($q,0);
}

Men hvordan laver jeg de 3 stumper kode tilsvarende i C# ?
Jeg har forbundet med:

SqlConnection(***);
og
og kan lave queries med SqlCommand()
Men så er jeg lidt tabt, har prøvet DataSet og SqlAdapter, og det virker fint, men jeg synes bare det virker som meget kode, nu når jeg jo med få linjer php kode kan lave noget lign. :o)
Avatar billede bvli Praktikant
28. september 2009 - 15:44 #1
using (IDbConnection con = new SqlConnection("connection String"))
using (IDbCommand command = con.CreateCommand()) {
  command.CommandText = "SELECT * FROM table LIMIT";
  using (IDataReader reader = command.ExecuteReader()) {
    while (reader.Read()){
      Reponse.Write(reader.GetString(0));
    }
  }
}
Avatar billede bvli Praktikant
28. september 2009 - 15:45 #2
Du skal selvfølgelig bruge en MySqlConnection
Avatar billede jakobdo Ekspert
28. september 2009 - 15:50 #3
Undskyld, mindre detalje.
I C# arbejder jeg mod en MSSQL database.
Og med Response.Write() kan jeg skrive alle data ud.
Men jeg vil f.eks. gerne kunne udlæse en værdi.
Vil man så bare gøre sådan:

string noget = reader.GetString(0);
Altså inde i while(...) ?
Det virker ikke logisk, synes jeg.
Jeg ved jo jeg skal have f.eks. data fra row og felt 0 eller 1 agtigt. :o)
Avatar billede bvli Praktikant
28. september 2009 - 16:01 #4
Altså reader.Read() returnerer true, hvis den kan rykke frem til ny række.

reader.GetString(0) giver dig første kolonne som en string (hvis det er det) reader.GetString(1) ville give dig kolonne to, osv.

Nu deklarerer du din string "noget" inde i scope'd for while'n, så det ville jo være formålsløst.

Men du kunne jo lave en
List<string> mylist = new List<string>();
[bla bla - ind i din while]
  mylist.Add(reader.GetString(0));


og så arbejde med din liste af strenge hvor du nu skal bruge den.


Og - altså - hvis du KUN skal have fat i EN række, så er det jo rigeligt med:

string result = null;
if (reader.Read()) {
  result = reader.GetString(0);
}
Avatar billede arne_v Ekspert
28. september 2009 - 18:12 #5
Det kan faktisk oversaettes ret direkte. Men der er visse forskelle.

mysql_connect(***,***,***);
mysql_select_db(***);

->

SqlConnection con = new SqlConnection(***);

$q = mysql_query("SELECT * FROM table");

->

SqlCommand cmd = new SqlCommand("SELECT * FROM table", con);
SqlDataReader rdr = cmd.ExecuteReader();

if(mysql_num_rows($q)>0)

->

if(rdr.HasRows)

NB: jeg vil fraraade bruge af denne !!!!

while($r = mysql_fetch_assoc($q))

->

while(rdr.Read())

echo $r['DATA'];

->

Response.Write(rdr["DATA"]);

$r = mysql_fetch_assoc($q);

->

rdr.Read();

echo mysql_result($q,0);

->

rdr.Read();
Response.Write(rdr[0]);

Men men men.

Dit problem er ikke ADO.NET men ASP.NET !!!!

Der er doedsstraf for at bruge Response.Write i ASP.NET ...

Man boer bruge web controller.

Den mest programmatisk web control er nok repeateren.

Eksempel:

<%@ import namespace="System.Data" %>
<%@ import namespace="System.Data.SqlClient" %>
<html>
<head>
<script language="C#" runat="server">
void Page_Load(Object sender, EventArgs e)
{
    SqlConnection con = new SqlConnection("Server=ARNEPC3;Integrated Security=SSPI;Database=Test");
    con.Open();
    SqlCommand cmd = new SqlCommand("SELECT * FROM T1", con);
    SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    MyDataList.DataSource = rdr;
    MyDataList.DataBind();
}
</script>
</head>
<body>
<form runat=server>
    <table border>
        <asp:Repeater id="MyDataList" runat="server">
            <ItemTemplate>
                <tr>
                <td><%# DataBinder.Eval(Container.DataItem,"F1") %></td>
                <td><%# DataBinder.Eval(Container.DataItem,"F2") %></td>
                </tr>
            </ItemTemplate>
        </asp:Repeater>
    </table>
</form>
</body>
</html>
Avatar billede jakobdo Ekspert
28. september 2009 - 19:21 #6
Arne_V, det ser bestemt ud til du har fat i noget. (men det har du jo gerne) :o)
bvli: Takker for input.

Jeg kan dog først teste jeres input i morgen, da jeg roder med det på arbejde.
Avatar billede jakobdo Ekspert
29. september 2009 - 08:41 #7
Arne_V: hvad mener du med denne: NB: jeg vil fraraade bruge af denne !!!!

Er det linjen over eller under du henviser til ?
Avatar billede bvli Praktikant
29. september 2009 - 10:03 #8
SqlDataReader.HasRows() er ikke en del af IDataReader-interfacet, derfor er det dårlig stil at bruge den.

Men som Arne også skriver - så skal du nok gentænke data-access i din asp.net webapplikation i forhold til php.
Avatar billede arne_v Ekspert
29. september 2009 - 15:24 #9
Det er HasRows som jeg ikke kan lide.

Og det er ikke af principielle aarsager med hensyn til IDbDataReader.

Der er visseADO.NET providere som ikke har implementeret den korrekt, saa den returnerer falsk False.

Saa jeg vil anbefale at kalde Read og se om der er noget.
Avatar billede jakobdo Ekspert
02. oktober 2009 - 13:59 #10
Tak for jeres indlæg.
Smider i et svar, så kan vi få lukket.
Avatar billede bvli Praktikant
02. oktober 2009 - 14:23 #11
Hep! :)
Avatar billede arne_v Ekspert
02. oktober 2009 - 15:13 #12
.
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