18. april 2009 - 19:04Der 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.
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?
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(); } }
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?
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?
Synes godt om
Ny brugerNybegynder
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.