webForumDet fria alternativet

Egen databas class

8 svar · 680 visningar · startad av smileenergy

smileenergyMedlem sedan jan. 200781 inlägg
#1

Hej!
Jag har precis börjat med ett nytt litet projekt och det här projektet är enbart till för att lära mig hur det här fungerar. Jag vet att det finns bättre sätt att göra det här i asp.net 2.0 med inbyggd mysql men det här är som sagt bara ett projekt för att lära mig hur det här fungerar då jag ska ha en liknande lösning till en annan sak. Så försök att hjälpa mig med mina frågor istället för att rekommendera en inbyggd kontroll.

Det är som så att jag vill ha en egen klass för min mysql databas som jag sedan vill kunna använda i mitt vanliga projekt för att uppdatera, lägga till, radera data osv. Jag vill kunna ha vilka namn som helst på mina textboxar, lägga till hur mycket information som helst och till vilken databastabell som helst men jag kommer inte på hur man gör det.

Som du ser i min class här nedan så har jag kopierat in en uppkoppling som fungerar på en vanlig sida med mina textboxars namn osv men eftersom jag nu vill kunna använda den här classen till alla mina sidor kan jag inte ha statiska namn där som txtSubject osv utan jag vill att han ska skapa så många parametrar som värden jag skickar in i classen osv. Jag hoppas att ni förstår vad jag menar. Hur skriver jag sen CommandText med mina dynamiska värden? Som ni ser kommer ni hitta lite frågor i koden nedan. Mina statiska parametrar måste ju också bytas ut på något sätt men hur?

Min class (MySql_Connection.cs)

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using MySql.Data.MySqlClient;

/// <summary>
/// Lägg till, ta bort, uppdatera data i min MySql databas
/// </summary>
public class MySql_Connection
{
    //Variabler
    string _connectionString = "user id=****; password=****; database=****; server=****;"; //uppkoppling
    string _table;

    //Konstruktor
	public MySql_Connection()
	{    
        //
		// TODO: Add constructor logic here
		//
	}

    //Table
    public string Table
    {
        get { return _table; }
        set { _table = value; }
    }

    //Add data
    public void AddData()
    {
        MySqlConnection cnn = new MySqlConnection();
        try
        {
            cnn.ConnectionString = strCon;
            //Parametrar
            MySqlParameter subject = new MySqlParameter("subject", txtSubject.Text);
            MySqlParameter note = new MySqlParameter("note", txtNoteText);
            MySqlCommand cmd = new MySqlCommand();
            cmd.Connection = cnn;
            //Hur skriver jag min CommandText?
            cmd.CommandText = "INSERT INTO ???????????? " +
                              "VALUES ?????????????? ";
            cmd.Parameters.Add(subject);
            cmd.Parameters.Add(note);
            cnn.Open();
            cmd.ExecuteNonQuery();
        }
        catch (MySqlException ex)
        {
            "Något gick fel (" + ex.Message + ")";
        }
        finally
        {
            //Avsluta kopplingen till databasen
            cnn.Close();
        }
    }
    //Update data
    public void UpdateData()
    { 
    
    }
    //Delete data
    public void DeleteData()
    { 
    
    }
}

Här kommer min sida (default.aspx.cs)
Som du ser har jag inte så mycket kod här utan jag behöver er hjälp som ni förstår. För enkelhetens skull kan vi säga vi ska lägga till två textboxars värden i databastabellen test_note. De två textboxarna kan vi kalla för txtSubject och txtNote

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page 
{
    //Variabler
    MySql_Connection MySqlCon = new MySql_Connection();

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    //Lägg tilli en databas
    private void AddNote()
    {
        //Ange vilken databastabell man ska använda
        MySqlCon.Table = "test_note";
        //Lägg till datan i databasen
        MySqlCon.AddData = "VAD SKA DET STÅ HÄR?????";
    }
    protected void btnAdd_Click(object sender, EventArgs e)
    {
        AddNote();
    }
}

Jag hoppas att ni kan hjälpa mig få det här att fungera.

emissionMedlem sedan dec. 19996 721 inlägg
#2

Vad vill du att din klass ska utföra? Det verkar som om du vill ha en lite väl generell klass.

GladhMedlem sedan maj 20012 812 inlägg
#3

Jag håller med emisson. Det verkar som du gapar över lite väl mycket i diin klass. Men skam den som ger sig.

Få se om jag förstod dig korrekt, du skall kunna skapa en sida, men olika inputkontroller och utifrån dessa skall du kunna lägga till/ta bort/uppdatera/hämta data från en databas. Det är ett rätt stort span som du vill att din klass skall kunna. Men om vi bryter ner det lite och förenklar dina önskemål lite.

Säg att vi börjar med endast textboxar och bara lägga till data till en databas. Så blir det lite mer övergrippligt och en bra grund att bygga vidare på.

Om vi nu skall göra detta så är det lättaste att du skapar din egen TextBox som du kan sätta lite egna properties på. En av dessa måste vara kolumnamnet i din databas. Samt att du behöver skapa en TabelControl där du kan skriva in tabellnamnet och connectionstring.

Om du dessutom i din TableControl kan lägga till alla dina Textboxar så kan du gruppera vilka textboxar som skall höra ihop med vilen TableControl Typ så här:

DbTableControl dbTableControl = new DbTableControl();
dbTableControl.TableName = "User";
dbTableControl.ConnectionString = "....";

DbTextbox dbtxtFirstName = new DbTextBox
dbtxtFirstName.Columnname = "FirstName";
dbTableControl.Items.Add(dbTxtFirstName);

DbTextbox dbtxtFirstName = new DbTextBox
dbtxtFirstName.Columnname = "LastName";
dbTableControl.Items.Add(dbTxtLastName);

string sqlStatement = dbTableControl.CreateSqlStatement();

Nu kan du få ut den INSERT sqlStatement som du behöver för att skapa datan i databasen. Det är inte speciellt svårt, loopa igenom alla din items i TableControl och ta fram namnen på alla kolumner, loopa sedan igenom de en gång till och hämta ut värdet i dem och lägg ihop allt till en SQL sats typ så här:

string sqlStatement;
sqlStatement = "INSERT INTO [" + this.TableName +"] ("
for(int i = 0; i < this.items.Length; i++)
{
  if(i != 0)
    sqlStatement += ", ";
  sqlStatement += txtBox.Columname;
}
sqlStatement += ") VALUES(";

for(int i = 0; i < this.items.Length; i++)
{
  if(i != 0)
    sqlStatement += ", ";
  sqlStatement += "'" +  txtBox.value + "'";
} 
sqlStatement += ");";

Där har den en bas att börja bygga på, det finns massor som fattas samt att man inte bör returnera en SQL sträng utan ett DbCommand objekt där man använder parametizerad SQL istället för att bara skriva in värdet från textboxen direkt. Men det är mindre problem...

- M

smileenergyMedlem sedan jan. 200781 inlägg
#4

emission skrev:

Vad vill du att din klass ska utföra? Det verkar som om du vill ha en lite väl generell klass.

Det kan hända, det jag är ute efter egentligen är en klass där jag kan skicka in värden så att han lägger till information i databasen i en metod (AddData), en som uppdaterar, en som raderar osv.. ni förstår säkert.
Jag vill helt enkelt komma åt ett förkortat skrivsätt så att jag slipper skriva in all den här information varje gång, som kan bli väldigt mycket om man har många parametrar och värden som ska in som ni säkert förstår. Det känns onödigt att skriva in den här koden på varje sida.

SqlConnection cnn = new SqlConnection();
                    try
                    {
                        cnn.ConnectionString = strCon;
                        SqlParameter prmFileName = new SqlParameter("fileName", FileUpload1.FileName);
                        SqlParameter prmContentType = new SqlParameter("contentType", FileUpload1.PostedFile.ContentType);
                        SqlParameter prmFileSize = new SqlParameter("fileSize", FileUpload1.PostedFile.ContentLength);
                        SqlParameter prmUploadedBy = new SqlParameter("uploadedBy", Membership.GetUser().UserName);
                        SqlCommand cmd = new SqlCommand();
                        cmd.Connection = cnn;
                        cmd.CommandText = "INSERT INTO GameVersion (fileName, contentType, fileSize, uploadedBy) " +
                                                "VALUES (@fileName, @contentType, @fileSize, @uploadedBy)";
                        cmd.Parameters.Add(prmFileName);
                        cmd.Parameters.Add(prmContentType);
                        cmd.Parameters.Add(prmFileSize);
                        cmd.Parameters.Add(prmUploadedBy);
                        cnn.Open();
                        cmd.ExecuteNonQuery();
                    }
                    catch (System.Exception ex)
                    {
                        lblStatus.Text = "Något gick fel (" + ex.Message + ")";
                    }
                    finally
                    {
                        cnn.Close();
                        //lblStatus.Text = "Din fil (" + FileUpload1.FileName + ") har laddats upp utan problem!";
                        Response.Redirect("Downloads.aspx");
                    }

Därför skulle jag gärna vilja kunna skapa en klass där jag tar myClass.AddData = de värden jag vill lägga till på något sätt. Jag vill alltså skapa en class som besparar mig på att skriva in all den där informationen på varje sida. Visst lite mer information än myClass.AddData kan jag ju gå med på att skriva men allt det där känns onödigt att behöva skriva på varje sida, det borde gå att implantera i en class så att jag slipper skriva lika mycket.

Gladhs metod verkade något avancerad, finns det kanske någon som har en enklare lösning?

theviceMedlem sedan dec. 2005198 inlägg
#5

Skulle giss på att han är ute efter något liknande:
http://www.aspsidan.se/default.asp?page=readArticle&artId=580

Fast i .NET förstås.

erkaMedlem sedan dec. 19996 522 inlägg
#6

Vill du slippa skriva CRUD skulle jag använda mig av ActiveRecord från castle project http://www.castleproject.org/

butikoMedlem sedan jan. 2007152 inlägg
#7

Jag har byggt en enkel db-klass som ärver från IDisposable som jag ofta använder i mina små projekt (public class Database : IDisposable). I den finns ett par olika databasanrop som stoppar in eller returnerar data på lite olika sätt, exempelvis min GetDataTable-funktion:

public DataTable GetDataTable(string procName, SqlParameter[] params)
    {
        DataTable dt = new DataTable();
        using (SqlDataAdapter da = new SqlDataAdapter(CreateCommand(sp, params)))
        {
            da.Fill(dt);
            da.SelectCommand.Parameters.Clear();
        }
     return dt;
}

Min sql-fråga har jag som en stored procedure. Namnet på min sp skickar jag in tillsammans med eventuella parametrar. Jag fyller sedan en datatable med mina hämtade data och returnerar datatablen. Allt jag behöver göra för att hämta ut mina data är alltså att skapa en instans av databasklassen och köra funktionen:

Database db = new Database();

// Skapa en collection med parametrar. MakeParam är också en liten snurra i min dbklass
SqlParameter[] prams = { db.MakeParam("@parameter", SqlDbType, "parameter_värde") };

// hämta ut data och lägg det i en datatable           
DataTable dt = db.GetDataTable("sp_name", prams);

Kanske kan vara nåt att bygga på?

smileenergyMedlem sedan jan. 200781 inlägg
#8

butiko:
Du kan inte visa hur du skriver för att hämta ut följande information?

Vi kan säga att vi ska hämta ut nyheter speciellt för en användare och har då två stycken parametrar, ID och Author.

MySqlConnection cnn = new MySqlConnection();
        try
        {
            cnn.ConnectionString = strCon;
            MySqlParameter prmID = new MySqlParameter("NewsID", ID);
            MySqlParameter prmAuthor = new MySqlParameter("Author", Membership.GetUser().UserName);
            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = "SELECT * FROM news WHERE id=@NewsID AND author=@Author";
            cmd.Connection = cnn;
            cmd.Parameters.Add(prmID);
            cmd.Parameters.Add(prmAuthor);
            cnn.Open();
            //kör queryn och lagra i datareader
            MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            dr.Read();
            txtID.Text = ID;
            txtSubject.Text = dr.GetString(1);
            txtNews.Text = dr.GetString(2);
        }
        catch (System.Exception ex)
        {
            lblStatus.Text = "Något gick fel (" + ex.Message + ")";
        }
        finally
        {
            cnn.Close();
        }

Jag förstod inte riktigt hur du menade med att skicka in sin sqlfråga som en stored procedure. Men det kommer säkert att släppa om du visar det ur ett "verkligt scenario" så det skulle vara jättehyggligt om du ville visa hur man skriver för att hämta en liten enkel sql sats, t.ex. en sån som jag visade här med din class och stored procedure. Hur sätter du ihop din parameter i din metod MakeParam?

theviceMedlem sedan dec. 2005198 inlägg
#9

Detta kanske kan vara något för dig?
http://tant102.mine.nu/project/tant102.data/details.aspx

130 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)