Kolla den här tråden på webforum: http://www.webforum.nu/showthread.php?s=&threadid=61076 Hej. Hej igen... hej igen...Arbeta med classer och databaser
Jag har letat efter exempel som visar hur jag kan lägga min databaskoppling i en egen class och anropa den i en annan class, men jag har inte hittat några vettiga fungerande exempel, är det någon som vet hur man ska lösa problemet?
Mycket är för beta 1 &2 eller så omständiga att man inte ser vart eller hur man kan använda dem.
Min tanke är ju att jobba med classer på samma sätt som moduler i VB.
dvs ha ett presentations lager, ett lager som hanterar data och ett databaslager som sköter kopplingen.
/Anna-KarinSv: Arbeta med classer och databaser
Sv: Arbeta med classer och databaser
Jag har läst den där tråden och den koden är för asp.net och jag kodar windows applikation i C#. Det är just den där koden som jag sitter och försöker få att fungera, vilket den inte gör.
/Anna-KarinSv: Arbeta med classer och databaser
Nu ser min kod ut så här:
Form1,kod
Jag har skapat en OleDBConnection kallad conn där.
<code>
private void cmdLogin_Click(object sender, System.EventArgs e)
{
Member myMember = new Member();
myMember.Login(txtPWD.Text);
if(myMember.Login(txtPWD.Text))
{
myLabel.Text = "du är inloggad";
}
else
{
myLabel.Text = "försök igen" ;
}
}
</code>
Members klassen ser ut så här.
<Code>
namespace Reggmed
{
public class Member : Reggmed.OleDbData
{
public Member() //: base("conn)
{ }
public bool Login(string Password)
{
// The Sql Statement that fetches the DataReader
string SqlStatement = "SELECT UID,PWD FROM adm_admin WHERE PWD ='" + Password + "'";
OleDbDataReader DataReader = RetriveDataReader(SqlStatement);
if(DataReader.Read() )
{
return DataReader["PWD"].ToString() == Password ? true : false;
}
else
{
return false;
}
}
}
}
</code>
Databasklassen ser ut så här, och det är här det smäller, antagligen för att jag inte fattar hur den ska få tag på conn från form1.
<code>
namespace Reggmed
{
public abstract class OleDbData
{
protected OleDbConnection conn;
/// <summary>
/// A valid connectionstring
/// </summary>
/// <param name="ConnectionString"></param>
public OleDbData()
{
OleDbConnection conn = new OleDbConnection ("conn");
}
private OleDbCommand BuildCommand(string SqlStatement)
{
OleDbCommand Command = new OleDbCommand(SqlStatement, conn);
Command.CommandType = CommandType.Text;
return Command;
}
protected OleDbDataReader RetriveDataReader(string SqlStatement)
{
OleDbDataReader DataReader;
conn.Open();
OleDbCommand Command = BuildCommand(SqlStatement);
DataReader = Command.ExecuteReader(CommandBehavior.CloseConnection);
return DataReader;
}
}
}
</code>
/Anna-KarinSv: Arbeta med classer och databaser
Ändra:
Form:
Member myMember = new Member();
till
Member myMember = new Member("Min constring"); //skicla med en constring du vill
-------------------------------------------
Member:
public Member() //: base("conn)
{ }
till:
//denna klassen ärver OleDbData
public Member(string connectionstring) : base(connectionstring) //kontruktorn tar emot strängen och skickar den vidare till sin basklass
{ }
-----------------------------------
OleDbData:
public OleDbData()
{
OleDbConnection conn = new OleDbConnection ("conn");
}
till
public OleDbData(string connectionstring) //tar emot consträng i konstruktorn
{
OleDbConnection conn = new OleDbConnection (connectionstring);
}
---------------------------------
Detta borde få dig att komma en bit på vägen.
Skriver ur minnet så det kan fortfarande förekomma fel. (Bäst att tillägga det...)
EDIT:
Slopa det där med OleDbConnection, skicka en sträng istället...
Eller för all del, gör om hela kedjan... vilket du vill
//freddaSv: Arbeta med classer och databaser
Ändra också detta:
if(DataReader.Read() )
{
return DataReader["PWD"].ToString() == Password ? true : false;
}
else
{
return false;
}
till
bool val;
if(DataReader.Read() )
{
val = DataReader["PWD"].ToString() == Password ? true : false;
}
else
{
val = false;
}
DataReader.Close(); //tror jag det är man stänger den med.. Det viktigaste är att den stängs...
return val;
//freddaSv: Arbeta med classer och databaser
Detta fungerar hos mig:
Observera att jag var tvungen att implementera Member.Login lite annorlunda.
Du bör ju anvädnda variabeln password, (det gör ju inte jag nu...)
Hade ingen databas med användare att testa på.
Observera också ändringen i OleDbDatas konstruktor: "this...."
<code>
using System;
using System.Data.OleDb;
using System.Data;
namespace Labb
{
public class Member : OleDbData
{
public Member(string constr) : base(constr)
{ }
public bool Login(string Password)
{
bool res = false;
// The Sql Statement that fetches the DataReader
string SqlStatement = "SELECT * FROM Authors WHERE Au_id = 244";
OleDbDataReader DataReader = RetriveDataReader(SqlStatement);
if(DataReader.Read() )
{
res = DataReader["Au_id"].ToString() == "244" ? true : false;
}
DataReader.Close();
return res;
}
}
public abstract class OleDbData
{
protected OleDbConnection conn;
/// <summary>
/// A valid connectionstring
/// </summary>
/// <param name="ConnectionString"></param>
public OleDbData(string strcon)
{
//OBSERVERA ÄNDRINGEN
this.conn = new OleDbConnection(strcon);
}
private OleDbCommand BuildCommand(string SqlStatement)
{
OleDbCommand Command = new OleDbCommand(SqlStatement, conn);
Command.CommandType = CommandType.Text;
return Command;
}
protected OleDbDataReader RetriveDataReader(string SqlStatement)
{
OleDbDataReader DataReader;
conn.Open();
OleDbCommand Command = BuildCommand(SqlStatement);
DataReader = Command.ExecuteReader(CommandBehavior.CloseConnection);
return DataReader;
}
}
}
</code>
I formuläret skriver jag såhär:
<code>
string db = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\src\TestDBs\BIBLIO2000.mdb;Persist Security Info=False";
Member m = new Member(db);
MessageBox.Show(m.Login("Password").ToString());
</code>
Hoppas du får till det.
//fredda