Avatar billede dennism Nybegynder
18. april 2009 - 19:04 Der er 8 kommentarer og
1 løsning

C#: LINQ to MSSQL

Jeg har aldrig rigtigt brugt MSSQL i .NET før - så da jeg kommer fra en Java- og PHP-verden, er jeg lidt på herrens mark!

Jeg har lavet en lille test-klasse:

    public class MSSQLAdapter {

        SqlConnection dbConnection;

        public MSSQLAdapter() {
            dbConnection = new SqlConnection();
            dbConnection.ConnectionString = @"Data Source=localhost;Initial Catalog=database;User Id=username;Password=password;";
            dbConnection.Open();
        }

        public Boolean isValidUser(String username, String password) {
            var userQuery = from user in dbConnection.Users
                            where user.username = username && user.password
                            select user.username;

            if (userQuery.Count()==1)
                return true;
            return false;
        }
    }


Som I kan se, så forbinder jeg til databasen i konstruktøren. Meningen med metoden "isValidUser" er, at den skal tjekke om en bruger eksisterer i databasen. Som I kan se, så forsøger jeg at bruge noget LINQ til at teste dette.
Som I kan se, så kalder jeg dbConnection.Users (hvos Users er navnet på tabellen) i LINQ. Dette virker dog ikke - hvordan får jeg fat i min tabel?
Jeg ved ikke om resten af LINQ koden er korrekt - men det var bare for at vise hvordan jeg forestiller mig, at det skal bruges.

På forhånd tak for hjælpen!
Avatar billede arne_v Ekspert
18. april 2009 - 19:43 #1
Skal du bruge LINQ ?

Du kunne jo også starte med en helt normal SqlCommand!
Avatar billede arne_v Ekspert
18. april 2009 - 19:44 #2
Eksempel:

        SqlConnection con = new SqlConnection("Server=ARNEPC3;Integrated Security=SSPI;Database=Test");
        con.Open();
        SqlCommand cmd = new SqlCommand("SELECT f1,f2 FROM t1", con);
        SqlDataReader rdr = cmd.ExecuteReader();
        while(rdr.Read()) {
            int f1 = (int)rdr[0];
            string f2 = (string)rdr[1];
            Console.WriteLine(f1 + " " + f2);
        }
        con.Close();
Avatar billede dennism Nybegynder
18. april 2009 - 21:35 #3
Hej Arne :)

Jeg ved godt, at det i dette eksempel ikke er den store fordel med LINQ, men skal meget gerne bruge der videre i projektet - så derfor jeg spørger til dette. Kan du hjælpe mig med det?
Avatar billede arne_v Ekspert
18. april 2009 - 22:08 #4
LINQ for SQL eksempel:

using System;
using System.Linq;
using System.Data.Linq;
using System.Data.Linq.SqlClient;
using System.Data.Linq.Mapping;
using System.Data.SqlClient;

public class LINQforDatabase
{
    [Table(Name="T1")]
    public class T1
    {
        [Column(IsPrimaryKey=true)]
        public int F1;
        [Column]
        public string F2;
    }
    public static void Main(string[] args)
    {
        SqlConnection con = new SqlConnection(@"Server=ARNEPC3\SQLEXPRESS;Integrated Security=SSPI;Database=Test");
        DataContext db = new DataContext(con);
        Table<T1> t1 = db.GetTable<T1>();
        // select en række (af typen T1)
        var q1 = from r in t1 where r.F1 == 2 select r;
        foreach(var r in q1) Console.WriteLine(r.F1 + " " + r.F2);
        // select en enkelt kolonne (af type string)
        var q2 = from r in t1 where r.F1 == 2 select r.F2;
        foreach(var r in q2) Console.WriteLine(r);
        // select dele af en række (af anonym type)
        var q3 = from r in t1 where r.F1 == 2 select new { r.F1, r.F2};
        foreach(var r in q3) Console.WriteLine(r.F1 + " " + r.F2);
        // select med aggregeret funktion til enkelt værdi (af typen double)
        var q4 = (from r in t1 select r.F1).Average();
        Console.WriteLine(q4);
        con.Close();
    }
}
Avatar billede dennism Nybegynder
18. april 2009 - 23:09 #5
Tak for det svar :)
Hvad er "practical use" i forhold til, hvordan man gemmer disse tabel-classes? Ligger man dem i en undermappe med navnet "DBTables" og så en klasse for hver tabel i databasen?

På forhånd tak for svaret.
Avatar billede arne_v Ekspert
18. april 2009 - 23:35 #6
Desværre. Jeg ved faktisk ikke hvad der er normalt. Hvis du bruger Visual Studio, så prøv og se hvor wizarden smider dem.
Avatar billede dennism Nybegynder
19. april 2009 - 19:48 #7
Tak. Vil du smide et svar?
Avatar billede arne_v Ekspert
19. april 2009 - 19:54 #8
svar
Avatar billede dennism Nybegynder
22. april 2009 - 18:58 #9
Jeg forsøger nu at bruge lidt mere af det du fortalte.
Jeg har denne "User" klasse:

    [Table(Name = "Users")]
    public class User {
        [Column(IsPrimaryKey = true)]
        public string username;
        [Column]
        public string password;
        [Column]
        public int isAdmin;

        public User() {

        }

        public User(String username, String password, int isAdmin) {
            this.username = username;
            this.password = password;
            this.isAdmin = isAdmin;
        }
    }

Et sted i mit program, vil jeg gerne have returneret en liste med alle rækker i User-tabellen. Dette forsøger jeg på denne måde:

        public List<User> GetUsers() {
            List<User> users = new List<User>();

            var userQuery = from user in this.tableUser
                            select user;

            foreach (var user in userQuery) {
                users.Add(new User(user.username, user.password, user.isAdmin));
            }

            return users;
        }

Men der får jeg en exception på run-time i foreach'en: InvalidCastException

Hvad gør jeg forkert - og kan dette klares på en pænere måde?
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
Kurser inden for grundlæggende programmering

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