webForumDet fria alternativet

Vad är en O/R mapper!?

.NET

25 svar · 1 247 visningar · startad av inspiro · sida 2 av 2

Frågan, av inspiro

Jag börjar få en hel del kopplingar mot databasen och varje gång jag behöver använda databasen gör jag typ så här: SqlConnection myConn = new SqlConnection(ConnStr); SqlCommand myCommand = new SqlCommand("procedure", myConn); myCommand.CommandType = CommandType.StoredProcedure; SqlDataAdapter da = new SqlDataAdapter(myCommand); DataTable dt = new DataT

Läs frågan i sin helhet →
Medlem sedan sep. 2005673 inlägg
#21

Aha, ok perfekt, tack så mycket för alla svar! :)

Medlem sedan sep. 2005673 inlägg
#22

Tänkte dra upp den här tråden igen, har ett problem i samma anda... försöker förstå det här med "using". I mitt DAL har jag gjort en ny klass för att kunna använda ExecuteScalar.

    public int ExecuteScalar(string procName, SqlParameter[] prams)
    {
        return (int)((SqlCommand)CreateCommand(procName, prams)).ExecuteScalar();
    }

Fråga 1: Hur kan jag använda "Using" här, vad är det som ska stå i parentesen? Har ju ingen dataadapter här.

Fråga 2. Hur kör jag Clear() på mina parametrar här inne så jag inte får samma problem som tidigare?

Medlem sedan sep. 2005673 inlägg
#23

Jag tror jag fick till detta också. Är det här ett bra sätt att implementera executescalar-metoden?

    public object ExecuteScalar(string procName, SqlParameter[] prams)
    {
        object o = null;
        using (SqlCommand sqlCmd = CreateCommand(procName, prams))
        {
            o = sqlCmd.ExecuteScalar();
            sqlCmd.Parameters.Clear();
        }
        return o;
    }
Medlem sedan dec. 19996 721 inlägg
#24

inspiro skrev:

Jag tror jag fick till detta också. Är det här ett bra sätt att implementera executescalar-metoden?

    public object ExecuteScalar(string procName, SqlParameter[] prams)
    {
        object o = null;
        using (SqlCommand sqlCmd = CreateCommand(procName, prams))
        {
            o = sqlCmd.ExecuteScalar();
            sqlCmd.Parameters.Clear();
        }
        return o;
    }

Javisst, det ser helt OK ut, men det är ingen större mening att använda using på ett SqlCommand, eftersom den klassen inte gör något vettigt i Dispose-metoden. En SqlConnection däremot är vettig att kapsla in i using. Varifrån kommer din connection. Ligger den som en medlemvariabel i DAL:et? I så fall skulle du kunna låta din DAL-klass implementera IDisposable, stänga eventuellt öppna kopplingar i Dispose, och använda using runt ditt DAL.

Medlem sedan sep. 2005673 inlägg
#25

Jupp, jag implementerar Idisposable, men jag vet inte riktigt hur det här med interface fungerar om jag ska vara ärlig. Har klippt och klistrat lite. :) Vad har jag för nytta av den egentligen? Ett interface är om jag inte har fel ett sätt att tvinga någon att implementera vissa metoder och properties, men att dessa egentligen ligger någon annanstans?

Min connection:

    private void Open()
    {
        // open connection
        if (con == null)
        {
            con = new SqlConnection(ConfigurationManager.AppSettings["ConnStr"]);
            con.Open();
        }
    }

Är det där i jag ska använda using?

Medlem sedan dec. 19996 721 inlägg
#26

inspiro skrev:

Jupp, jag implementerar Idisposable, men jag vet inte riktigt hur det här med interface fungerar om jag ska vara ärlig. Har klippt och klistrat lite. :) Vad har jag för nytta av den egentligen? Ett interface är om jag inte har fel ett sätt att tvinga någon att implementera vissa metoder och properties, men att dessa egentligen ligger någon annanstans?

Ungefär (eller exakt, beroende på hur du menade).

Ett interface definierar en viss mängd (publika) metoder och properties. Om du gör en klass och säger att den ska implementera interfacet, så åstadkommer det att metoden måste ha alla de metoder och properties som ingår i interfacet. Men, det är ju inte det som är det fina, utan det är att andra klasser som utnyttjar din fina klass kan se att du implementerar detta interface, och på så sätt veta att metoderna finns, utan att för den skull ha någon aning om vad de utför bakom kulisserna. I fallet med "using" så krävs att klassen implementerar IDisposable, vilket i sin tur innebär att klassen måste ha en definierad Dispose-metod. När using-klausulen kommer till "slutet" så kommer den att köra Dispose-metoden på den använda klassen, utan att ha någon aning om vad den gör.

inspiro skrev:

Min connection:

    private void Open()
    {
        // open connection
        if (con == null)
        {
            con = new SqlConnection(ConfigurationManager.AppSettings["ConnStr"]);
            con.Open();
        }
    }

Är det där i jag ska använda using?

Nej, inne i den metoden ska du inte använda någon using, för du vill ju att kopplingen ska leva, även efter Open. I stället ska du implementera IDisposable, och därmed ha en Dispose-metod. Jag antar även att du har en Close-metod, som skulle kunna se ut så här:

private void Close()
    {
        // open connection
        if (con != null && conn.State!=ConnectionState.Closed)
        {
            con.Close();
        }
    }

(jag är inte riktigt med på hur din Open/Close används, eftersom de är privata, men det kan vi leva med...)

En enkel, demonstrativ variant av Dispose-metoden

public void Dispose()
{
   this.Close();
}

....och då kan du använda ditt DAL.

using (MyDAL dal=new MyDAL())
{
  dal.GörSomeFunnySaker();
}

Nu vet jag för lite om din implementering för att säga att det verkligen är så här du ska göra, men som ett experiment i using-användning (tautologi?) är det synnerligen vettigt.

382 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
241 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
245 ms — ändringar (db)