lørdag, januar 23, 2021

C# SQL Reader problemer

Daily Rush Debat Programmering C# SQL Reader problemer

  • Forfatter
    Emne
  • #0

    Krisp
    Bruger
    5.059 indlæg
    Offline

    Jeg ønsker at læse flere ting fra samme connection til MSSQL databasen, men jeg kan kun få det til at virke med én ting af gangen.

    Hvad er den smarteste måde at lave det her på?

    SqlConnection conn;
    SqlCommand comm;

    conn = new SqlConnection(“db conection her”);

    comm = new SqlCommand(“SELECT COUNT(Navn) AS Expr1 FROM Links WHERE Kategori=’1′”, conn);
    comm = new SqlCommand(“SELECT COUNT(Navn) AS Expr2 FROM Links WHERE Kategori=’2′”, conn);
    comm = new SqlCommand(“SELECT COUNT(Navn) AS Expr3 FROM Links WHERE Kategori=’3′”, conn);
    comm = new SqlCommand(“SELECT COUNT(Navn) AS Expr4 FROM Links WHERE Kategori=’4′”, conn);

    conn.Open();

    SqlDataReader reader = comm.ExecuteReader();

    while (reader.Read())
    {
    NyhedCount.Text += reader[“Expr1”];
    EsportCount.Text += reader[“Expr2”];
    KlanerCount.Text += reader[“Expr3”];
    AndetCount.Text += reader[“Expr4”];
    }

    reader.Close();

    conn.Close();

    Steam: Krisp89 - Origin: Krisp1989 - BattleTag: Krisp#2319

Viser 14 kommentarer - 1 til 14 (af 14 i alt)
  • Forfatter
    Kommentarer
  • #1

    Neve
    Bruger
    66 indlæg
    Offline

    Det er vel at lave det som en funktion med parametre, f.eks. private DataTable query (string query)

    Så kan du kalde funktionen med f.eks. DataTable dt=query(“select * from tabel);

    også loope igennem DataTable med DataTableReader.

    #2

    Holger-IST-
    Bruger
    6.970 indlæg
    Offline

    Ikke lige et svar på det du spørger, men jeg ville helt klart gå over til at bruge LINQ to SQL, som er noget mere elegant end at bruge strengbaserede sql queries, se f.eks.:
    http://weblogs.asp.net/scottgu/archive/2007/06/29/linq-to-sql-part-3-querying-our-database.aspx

    grunden til at du ikke lige kan det du vil, er at du overskriver dit sql sommand object (comm) med en ny command hver gang. dvs du får kun kørt Expr4 på den måde.

    Andre måde du kan opnå det du vil er at bruge en anden sql command, noget som f.eks.
    “SEL­ECT , Kategori, COUNT(Navn) FROM Links groub by Kategori”

    Så burde du få counts for hver kategori.

    Eller du kan lave et view, der foretager det count for dig, som du så bruger til at hente tallene fra.

    - Holger "A woman drove me to drink and I didn't even have the decency to thank her." - W. C. Fields

    #3

    Wayfarer
    Bruger
    5.714 indlæg
    Offline

    #0 hvis du har en mssql server så tag og lave stored procedures (meget lettere at administrerer), og for gudsskyld, tag altid og bruge parametre. Det er en stor sikkerheds risiko ikke at bruge..

    I believe our future depends powerfully on how well we understand this cosmos in which we float like a mote of dust in the morning sky. -Carl Sagan

    #4

    Rats
    Bruger
    341 indlæg
    Offline

    Som #2 skriver er nok det nemmeste at gøre, hvis du vil have alle kategorier med, ellers tilføj WHERE Kategori <= 4 før din group.

    #5

    Krisp
    Bruger
    5.059 indlæg
    Offline

    #2: Hvis jeg nu laver en group by Kategori, hvordan får jeg så tildelt de 4 ting den udskriver, til hver sin Label.Text? Det kan vel ikke lade sig gøre med den metode?

    Steam: Krisp89 - Origin: Krisp1989 - BattleTag: Krisp#2319

    #6

    tossetaz
    Bruger
    1.146 indlæg
    Offline

    Hver gang du opretter en SqlCommand sletter du jo dit gamle SqlCommand objekt, du bliver nødt til at have et array af SqlCommands og så løber over arrayet

    Nogen speciel grund til du ikke bruger LINQ, skal det være .net 2.0?

    #8

    Krisp
    Bruger
    5.059 indlæg
    Offline

    #6: Fordi jeg fatter hat af LINQ. Jeg fatter ikke hvor DataContext kommer fra. -_-.

    Steam: Krisp89 - Origin: Krisp1989 - BattleTag: Krisp#2319

    #9

    tossetaz
    Bruger
    1.146 indlæg
    Offline

    Hvad mener du? LINQ er meget meget nemt, du skal bare installere den seneste version af MySQL .net driveren og så køre det, så opretter du en dbml og vælger de tabeller du skal bruge og så har du object-mapping søg på google

    #10

    Krisp
    Bruger
    5.059 indlæg
    Offline

    #9: Jeg bruger MSSQL.

    Steam: Krisp89 - Origin: Krisp1989 - BattleTag: Krisp#2319

    #11

    Krisp
    Bruger
    5.059 indlæg
    Offline

    Jeg fik løst problemet på en mindre elegant måde og sikkert også ret oldschool måde. :P. Det virker, det kører dog lidt sløvt. Men den åbner trods alt kun en connection én gang, så vidt jeg har forstået.

    //Count af alle links sker her
    SqlConnection conn;
    SqlCommand comm;
    SqlCommand comm1;
    SqlCommand comm2;
    SqlCommand comm3;
    SqlCommand comm4;

    conn = new SqlConnection(“db her”);

    comm = new SqlCommand(“SELECT COUNT(Navn) AS Expr1 FROM Links”, conn);
    comm1 = new SqlCommand(“SELECT COUNT(Navn) AS Expr2 FROM Links WHERE Kategori=’1′”, conn);
    comm2 = new SqlCommand(“SELECT COUNT(Navn) AS Expr3 FROM Links WHERE Kategori=’2′”, conn);
    comm3 = new SqlCommand(“SELECT COUNT(Navn) AS Expr4 FROM Links WHERE Kategori=’3′”, conn);
    comm4 = new SqlCommand(“SELECT COUNT(Navn) AS Expr5 FROM Links WHERE Kategori=’4′”, conn);

    conn.Open();

    // Viser count i alt
    SqlDataReader reader = comm.ExecuteReader();
    while (reader.Read())
    {
    lblCount.Text += reader[“Expr1”];
    }
    reader.Close();

    // Viser count på Nyheder
    SqlDataReader reader1 = comm1.ExecuteReader();
    while (reader1.Read())
    {
    lblCount1.Text += reader1[“Expr2”];
    }
    reader1.Close();

    // Viser count på eSport
    SqlDataReader reader2 = comm2.ExecuteReader();
    while (reader2.Read())
    {
    lblCount2.Text += reader2[“Expr3”];
    }
    reader2.Close();

    // Viser count på Klaner
    SqlDataReader reader3 = comm3.ExecuteReader();
    while (reader3.Read())
    {
    lblCount3.Text += reader3[“Expr4”];
    }
    reader3.Close();

    // Viser count på Andet
    SqlDataReader reader4 = comm4.ExecuteReader();
    while (reader4.Read())
    {
    lblCount4.Text += reader4[“Expr5”];
    }
    reader4.Close();

    conn.Close();

    Steam: Krisp89 - Origin: Krisp1989 - BattleTag: Krisp#2319

    #12

    Ni
    Bruger
    1.070 indlæg
    Offline

    #0+#3

    Lad for guds skyld være med at rode stored procedures ud i det… Det er et mareridt uden lige at skulle rydde op i igen. Data og kode skal være adskilt. Punktum.

    Brug LinqToSQL.

    #13

    tossetaz
    Bruger
    1.146 indlæg
    Offline

    #10 sorry jeg troede du brugte MySQL, anyway du burde virkelig sætte dig ind i linq

    #14

    Moog
    Bruger
    716 indlæg
    Offline

    Som flere har påpeget er Linq hvad du skal bruge her, Stored procedures er måske lidt overkill.

    Linq tager 10 min at lære, og så skal du ellers formulere dig ala hvordan du skrive SQL.

    Hvis ikke, kan du sagtens få det ned på en omgang.

    I stedet for at lave en masse commands laver du en SQL sætning med OR

    Og hvis det her er til web så skal du for guds skyld slå “parameterized query” op, ellers vil du være meget åben for SQL injections.

    #15

    Wayfarer
    Bruger
    5.714 indlæg
    Offline

    #14 Stored Procedures er sku meget let at skrive. Stored Procedures vs Linq er ofte lidt af et religions sprøgsmål. Det kommer an på, hvor vil du styre dine relationer, joins etc. På database niveau, eller i din kode..

    I believe our future depends powerfully on how well we understand this cosmos in which we float like a mote of dust in the morning sky. -Carl Sagan

Viser 14 kommentarer - 1 til 14 (af 14 i alt)
  • Du skal være logget ind for at kommentere på dette indlæg.