WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   MySQL tabeller till Object .NET (https://www.wn.se/forum/showthread.php?t=31365)

ledstrom 2008-08-23 16:37

Satt och lekte lite och skrev följande kod som jag tycker personligen spar mig mycket tid... Hade tänkt och se om någon har lite feedback på det...

Det hela är mycket enkelt, du anger en Connection string, får upp alla tabeller i databasen, väljer en tabell och vips så har du ett enkelt object (kanske borde använda struct istället) som har samma namn som databasens fält. Plus att du får en funktion som retunerar Arraylist med aktuella objektet utifrån datatabeler..

Jag brukar använda det här rätt så ofta, jag skrev en längre variant också som är Lite mer avancerad som retunrerar funktioner för att spara det aktuella objectet med massa mer.. Men kika gärna lite på det, finns det något enklare sätt? Hur gör ni? Skriv gärna ditt lite extra kod om du känner för det..

Applikationen kräver Mysql.Data.dll filen..

Här kommer ASPX filen...
Kod:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="DTToObject.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title>Bra och ha sak</title>
</head>
<body>
  <form id="form1" runat="server">
  <div>
 
    Connectionstring:
    <asp:TextBox ID="tbConn" runat="server"></asp:TextBox>
    <br />
   
    Obejekt namn:
    <asp:TextBox ID="tbObjectname" runat="server"></asp:TextBox>
    <br />
 
  </div>
  <p>
    <asp:Button ID="btnKoppling" runat="server" Text="Hämta tabeler" />
    <asp:Repeater ID="repTabeler" runat="server">
      <ItemTemplate>
        <br /><asp:LinkButton ID="lbTabel" runat="server" CommandArgument='<%#Container.DataItem(0)%>' Text='<%#Container.DataItem(0)%>' OnCommand="GetInfo"/>
      </ItemTemplate>
    </asp:Repeater>
  </p>
  <asp:PlaceHolder ID="phTabelinfo" runat="server"/>
  <asp:Panel ID="pOutput" runat="server" BorderColor="Red"/>
  </form>
</body>
</html>


Och VB filen...
Kod:

Imports System.ComponentModel
Imports System.Web.UI
Imports MySql.Data.MySqlClient
Imports System.Data
Imports System.Data.Common
Imports System.Configuration.ConfigurationManager
Imports System.Security.Cryptography

Public Class SQL
  Public SQL As String
  Public Conn As String
  Public Function ExecuteSQL(ByVal strTable As String) As DataTable
    Dim ds As New DataSet
    Dim Cmd As MySqlCommand
    Cmd = New MySqlCommand(SQL, New MySqlConnection(Conn))

    Dim objCmd As New MySqlDataAdapter(Cmd)

    objCmd.Fill(ds, strTable)
    Return ds.Tables(0).Copy
  End Function
End Class

Partial Class _Default
  Inherits System.Web.UI.Page

  Public LSQL As New SQL
  Public DT As DataTable
  Public cControl As Collection
  Public cControl2 As Collection
  Public lDT As DataTable
  Public Tabel As String

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

  End Sub

  Protected Sub btnKoppling_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnKoppling.Click
    LSQL.Conn = tbConn.Text
    LSQL.SQL = "show tables"
    DT = LSQL.ExecuteSQL("tabeler")
    BindData()
  End Sub
  Sub BindData()
    repTabeler.DataSource = DT
    DataBind()
  End Sub

  Sub GetInfo(ByVal Obj As Object, ByVal E As CommandEventArgs)
    LSQL.Conn = tbConn.Text
    phTabelinfo.Controls.Clear()
    Tabel = E.CommandArgument
    LSQL.SQL = "SHOW COLUMNS FROM " & Tabel
    ldt = LSQL.ExecuteSQL("tabeler")

    Dim I As Integer

    Dim AR As New ArrayList
    For I = 0 To lDT.Rows.Count - 1
      AR.Add(lDT.Rows(I)(0))
    Next

    Dim Namn As String = tbObjectname.Text


    AddLine("Public Class " & Namn)
    For I = 0 To AR.Count - 1
      AddLine("Public " & lDT.Rows(I)(0) & " As " & TransformType(lDT.Rows(I)(1)))
    Next
    AddLine("End Class")

    AddLine("")

    AddLine("Public Function DTTo" & Namn & "(DT As DataTable) As ArrayList")
    AddLine("Dim I As Integer")
    AddLine("Dim Current" & Namn & " As New " & Namn)
    AddLine("For I = 0 To DT.Rows.Count - 1")
    For I = 0 To AR.Count - 1
      AddLine("Current" & Namn & "." & lDT.Rows(I)(0) & " = DT.Rows(I)(""" & lDT.Rows(I)(0) & """)")
    Next
    AddLine("Current" & Namn & ".Add(Current" & Namn & ")")
    AddLine("Next")
    AddLine("Return Current" & Namn)
    AddLine("End Function")
  End Sub

  Private Function TransformType(ByVal Input As String) As String
    If Input.Contains("int") = True Then TransformType = "Integer"
    If Input.Contains("tinyint") = True Then TransformType = "Short"
    If Input.Contains("text") = True Then TransformType = "String"
    If TransformType = "" Then TransformType = "Object"
  End Function


  Sub AddLine(ByVal X As String)
    pOutput.Controls.Add(New LiteralControl(X & "<BR/>"))
  End Sub

End Class


Fruitness 2008-09-08 13:46

Hej,

Har du testat LINQ to SQL eller NHibernate någon gång? Ifall du inte har gjort det så öppnas nog en ny värld i .NET för dig.

ledstrom 2008-09-08 17:30

Hej jag har testat Linq to SQL och jag tycker det blev förtjust, men det är bara för MsSQL... Jag testade en OpenSource lösning till MySQL.. NHibernate har jag även testat, men jag vet inte, jag tog väl mig antagligen inte tid och försökte med det.. Jag läste att det blev lite segt eftersom det bygger på så många olika lager och klasser.. Men men, jag ska nog ta en närmare titt på det... Jag hoppas bara på MySQLs nya Connections klasser som har inbyggt stöd för LINQ...


Alla tider är GMT +2. Klockan är nu 21:52.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson