Hei taas.
Tein tietokanta harjoituksen: http://www.homeandlearn.co.uk/NET/nets12p4.html
Nyt haluaisin tehdä saman kaltaisen harjoituksen omalla tietokannalla, mutta ongelmaksi muodostui tietokannan luominen.
Millä ja miten esimerkin kaltainen yksinkertainen tietokanta luodaan?
En löytänyt aiheeseen mistään mitään selkeää ohjetta suurista etsinnöistä huolimatta.
Siis... tietokanna luomiseen löytyy kyllä ohjeita pilvin pimein, mutta mistä löytyy itse ohjelma millä se tehdään? Vai tarviiko siihen edes erityistä ohjelmaa? Microsoft access - maksullinen vai ei - mistä sen saa? Jos visual basic 2008 on ilmainen, niin en osaa kuvitella miksi tietokannanluomisohjelma olisi maksullinen. Löytyykö ilmaista ohjelmaa - mistä?
Tietokannan voi luoda ihan millä vaan ohjelmalla joka osaa käskyttää RDBMS:ää eli tietokantamoottoria.. Eli jos tarkoitus on luoda vaikka MySQL-palvelimelle tietokanta, niin millä vaan ohjelmointikielelle pystyy kyllä homman hoitamaan. Sen pystyy hoitamaan myös MySQL:n mukana tulevaa komentoriviclienttiä käyttäen. Access-tyyppisen (Jet engine) tietokannankin voi luoda ilmaiseksi saatavilla työkaluilla. Tosin miksi kukaan haluaisi käyttää Access-kantoja, jos tarkoitus ei ole käyttää Accessia, eli sitä graafista käyttöliittymää.
En nyt tiedä mikä voisi olla maksullinen tietokannanluomisohjelma, mutta voisin kuvitella että siinä olisi graafinen käyttöliittymä joka tekisi hommasta helpompaa tai tehokkaampaa. Silloin joku voisi jopa ostaa sellaisen.
Ok, mutta miten voin tehdä tietokantatiedoston jossa olisi nyt aluksi 1 taulu, 10 saraketta ja 10 riviä (en tiedä kutsunko noita nyt suomeksi oikeilla nimillä(table, column, row)).
Tietokannan olisi tarkoitus kulkea itse ohjelman mukana tiedostona josta tietoja luetaan ja tarvittaessa muutetaan (siis kaikki kopiot ohjelmasta käyttävät omaa tietokantaansa).
Onko siis olemassa yksinkertaista ohjelmaa jolla tämän tietokannan "pohjan" voisi tehdä valmiiksi (ja pohjan voisi sitten täyttää itse ohjelmalla)?
Vai täytyykö se tietokanta tehdä itse "koodaamalla"?
Olen varma, että tässä tietokanta hommassa on ainakin yksi (varmasti useampikin) asia mitä en ole tajunnut kunnolla/ollenkaan.
Moikka taas novice!
Koskapa sinulla näyttää olevan täysi vauhti päällä jo koulutuksen tässä vaiheessa niin...
Valmiita ohjelmia on pilvin pimein, mutta maksaa suhtkoht saman vaivan lisätä tietokannan luominen taulun/jen lisääminen ohjelmaasi mikäli ohjelmasi on takoitus pystyä dynaamiseen taulujen luontiin/muokkaukseen...
Jos sinulla ei ole JET-moottoria niin imppaa se täältä
ja tutki täältä mitä minulla on kerrottavaa ja tutki eritoten se ADOX-linkki (osviittaa)
Jos haluat monipuolisen, kevyen ja helppokäyttöisen työkalun tutustu tähän
Heippa taas novice!
jos innostuksesi ei ole laantumassa, mutta DataBase-viritelmät sattuisivat tökkimään niin tässä hieman lisää osviittaa...
dbdata.txt:
Matti;Mainio;Matinkatu 2;12112;Kotikaupunki;041-1234567;mailto:matti.mainio@kotiposti.fi;Eronnut äskettäin vaimostaan, juo paljon* Liisa;Mainio;Liisankatukatu 1;12110;Kotikaupunki;041-1234533;mailto:liisa.mainio@kotiposti.fi;Eronnut äskettäin miehestään, nai paljon* Martti;Mölsä;Sivukuja 13;12113;Kotikaupunki;050-5055513;Ei tietoa;Valittaa yleensä joka asiasta* Lilli;Simpsakka;Kotikatu 33;12133;Kotikaupunki;044-7649520;mailto:lilli.simpsakka@kotikanava.fi;Nähty usein kaupunginjohtajan kyljessä* Jorma;Jortikka;Keskuskatu 10;12111;Kotikaupunki;010-1112221;mailto:jorma.jortikka@kotikanava.fi;Vaimon kanssa ongelmia, vaan ei herra Mainion ex-vaimon
' Projektiin COM-Referenssi: ' Microsoft ADO Ext. 2.8 for DDL and Security ' Lomakkeelle: ' TextBox (ReadOnly/Multiline=True) ' DataGridView (Enabled/Visible=False) ' Button Imports ADOX Imports System Imports System.Data Imports System.Data.OleDb Imports System.Drawing Imports System.Windows.Forms Imports Microsoft.VisualBasic 'huom. väännetty SharpDevelop 3.0:lla Public Partial Class MainForm: Inherits Form Public Sub New() Me.InitializeComponent() End Sub Sub Button1Click(sender As Object, e As EventArgs) Dim tietokanta As String = "C:\" tietokanta += InputBox( _ "Tietokannan nimi", "Tietokanta manageri","") If tietokanta <> "C:\" Then tietokanta += ".mdb" ElseIf tietokanta = "C:\" MessageBox.Show("Tietokantaa ei ole nimetty!") tietokanta = Nothing: Exit Sub End If If Dir(tietokanta) = "" Then LuoAccessTietokanta(tietokanta) Else Dim palaute As DialogResult = _ MessageBox.Show( _ "Tietokanta: " + tietokanta + " on jo olemassa!" + _ Environment.NewLine + Environment.NewLine + _ "Ylikirjoitetaanko tietokanatatiedosto", _ "Tietokanta manageri",MessageBoxButtons.YesNo, _ MessageBoxIcon.Question) Select Case palaute Case 6 FileSystem.Kill(tietokanta) LuoAccessTietokanta(tietokanta) Case Else Exit Sub End Select End If End Sub Public Sub LuoAccessTietokanta(ByVal tietokanta As String) Dim katalogi As ADOX.Catalog = New ADOX.Catalog() katalogi.Create("Provider=Microsoft.Jet.OLEDB.4.0; " + _ "Data Source=" + tietokanta + ";Jet OLEDB:Engine Type=5") katalogi = Nothing MsgBox("Tietokanta " + tietokanta + " luotu onnistuneesti...") Dim yhteysmerkkijono As String = _ "PROVIDER=Microsoft.Jet.OLEDB.4.0;" + _ "Data Source =" + tietokanta Dim taulu As String = InputBox( _ "Taulun nimi", "Tietokanta manageri","") If taulu = "" Then MsgBox("Taulua ei nimetty") yhteysmerkkijono = Nothing: Exit Sub End If Dim onnistunut As Boolean = True Dim yhteys As OleDb.OleDbConnection = _ New OleDb.OleDbConnection(yhteysmerkkijono) Dim malliTaulu As New DataTable Try yhteys.Open() malliTaulu = yhteys.GetOleDbSchemaTable( _ OleDb.OleDbSchemaGuid.Tables, New Object() _ {Nothing, Nothing, Taulu, "TABLE"}) yhteys.Close(): yhteysmerkkijono = Nothing If malliTaulu.Rows.Count = 0 Then Dim komento As OleDb.OleDbCommand = _ New OleDb.OleDbCommand( _ "CREATE TABLE [" + Taulu + "]" + _ "([ID] INT IDENTITY(1, 1), " + _ "[Etunimi] TEXT(20) NOT NULL, " + _ "[Sukunimi] TEXT(20) NOT NULL, " + _ "[Osoite] MEMO NOT NULL, " + _ "[Postinumero] TEXT(10) NOT NULL, " + _ "[Postitoimipaikka] TEXT(50) NOT NULL, " + _ "[Puhelin] TEXT(15), " + _ "[Sähköposti] MEMO, " + _ "[Merkinnät] MEMO, " + _ "CONSTRAINT [pk_ID] PRIMARY KEY (ID))", yhteys) yhteys.Open() komento.ExecuteNonQuery() yhteys.Close(): komento = Nothing malliTaulu = Nothing End If Catch ex As Exception onnistunut = False End Try If Not onnistunut Then If connectionstate.Open Then yhteys.Close: yhteys = Nothing End If If Not (yhteysmerkkijono) Is Nothing Then yhteysmerkkijono = Nothing End If If Not (malliTaulu) Is Nothing Then malliTaulu = Nothing End If MsgBox("Tietokantataulun: " + taulu + _ " luomisessa tapahtui virhe!") onnistunut = Nothing: Exit Sub End If onnistunut = True MsgBox("Tietokantataulu: " + taulu + _ " luotu onnistuneesti...") If Dir() <> "C:\dbdata.txt" Then FileSystem.FileOpen( _ 1, "C:\dbdata.txt", OpenMode.Input, OpenAccess.Read) TextBox1.Text = FileSystem.InputString(1, LOF(1)) TextBox1.Tag = TextBox1.Text End If If TextBox1.Text <> "" Then Dim aErottelu() As String = _ TextBox1.Text.Split("*") yhteys.Open Dim i As Integer = 0 For i = 0 To aErottelu.GetUpperBound(0) onnistunut = True Dim bErottelu() As String = _ aErottelu(i).Replace(Environment.NewLine,"").Split(";") If bErottelu.Length <> 8 Then i = Nothing:yhteys.Close yhteys = Nothing MessageBox.Show( _ "Tietorakenne on väärää muotoa..." + _ Environment.NewLine + Environment.NewLine + _ "Tarkista tietolähteen tietorakenne") Exit Sub End If Dim j As Integer = 0 Dim arvot As String = String.Empty For j = 0 To bErottelu.GetUpperBound(0) arvot += Chr(34) + bErottelu(j).ToString.Replace( _ Environment.NewLine, "") + Chr(34) If j < bErottelu.GetUpperBound(0) Then arvot += "," End If Next j: j = Nothing Dim kysely As String = String.Empty Dim bKomento As New OleDb.OleDbCommand Try kysely = "INSERT INTO [Taulu1] " + _ "([Etunimi], [Sukunimi], [Osoite], [Postinumero], " + _ "[Postitoimipaikka], [Puhelin], [Sähköposti], " + _ " "[Merkinnät]) VALUES(" + arvot +")" bKomento = _ New OleDb.OleDbCommand(kysely, yhteys) bKomento.ExecuteNonQuery() Catch ex As Exception onnistunut = False End Try bErottelu = Nothing: arvot = Nothing kysely = Nothing: bKomento = Nothing If Not onnistunut Then yhteys.Close(): yhteys = Nothing aErottelu = Nothing: onnistunut = Nothing Dim msgstr As String = String.Empty If i = 0 Then msgstr = _ "Tietueiden viennissä tapahtui odottamaton virhe!" Else msgstr = Cstr(i) + _ ". tietueen viennissä tapahtui odottamaton virhe!" End If MsgBox(msgstr): msgstr = Nothing i = Nothing: Exit Sub End If Next i: i = Nothing yhteys.Close(): yhteys = Nothing aErottelu = Nothing: onnistunut = Nothing MsgBox("Tietueet viety onnistuneesti tauluun: " _ + taulu +"...", MsgBoxStyle.OkOnly, "Tietokantamanageri") TextBox1.Enabled = False TextBox1.Visible = False Button1.Enabled = False DataGridView1.Enabled = True DataGridView1.Visible = True TäytäDataTauluKontrolli(tietokanta, taulu) Else MsgBox("Mitään vietävää tietokantaan ei löytynyt!", _ MsgBoxStyle.OkOnly,"Tietokantamanageri") Exit Sub End If End Sub Sub TäytäDataTauluKontrolli( _ ByVal tietokanta As String, ByVal taulu As String) If Dir(tietokanta) <> "" Then Dim yhteysmerkkijono As String = _ "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source =" + tietokanta Dim yhteys As OleDbConnection = _ New OleDbConnection(yhteysmerkkijono) Try yhteys.Open Catch ex As Exception End Try If connectionstate.Open Then Try Dim datasetti As DataSet = New DataSet Dim kysely As String = _ "Select * From [" + taulu + "]" Dim adapteri As OleDbDataAdapter = _ New OleDbDataAdapter(kysely, yhteys) adapteri.Fill(datasetti, taulu) MsgBox("Tuodaan tietokannan: " _ + tietokanta + " tiedot...") DataGridView1.DataSource = _ datasetti.Tables(taulu) DataGridView1.Refresh kysely = Nothing: adapteri = Nothing yhteys.Close: yhteys = Nothing Catch ex As Exception MsgBox("Tiedonsiirto tietokannasta: "+ _ tietokanta + " epäonnistui!" End Try Else MsgBox("Yhteyttä tietokantaan: " + tietokanta + _ " ei saatu luotua!",MsgBoxStyle.OkOnly, "Tietokantamanageri") End If yhteysmerkkijono = Nothing Else MsgBox("Tietokantaa " + tietokanta + _ " ei löydy!", MsgBoxStyle.OkOnly,"Tietokantamanageri") End If tietokanta = Nothing End Sub Sub TextBox1Enter(sender As Object, e As EventArgs) Button1.Focus End Sub Sub MainFormFormClosing(sender As Object, _ e As FormClosingEventArgs) Me.Dispose End Sub Sub MainFormFormClosed(sender As Object, _ e As FormClosedEventArgs) End End Sub End Class
Hahaaa!!!
Kiitos Nea! Tämä viimeisin esimerkki valotti montaa asiaa.
Ohjelmassa on kuitenkin joku bugi; Taulun onnistuneen nimeämisen jälkeen data ilmestyy textboxiin ja tulee ilmoitus "tietueiden viennissä tapahtui odottamaton virhe!". En näin yömyöhään viitsinyt alkaa etsimään virhettä (tuskinpa olisin löytänytkään).
Toivon, että maanantaina iltasella pääsisin jatkamaan harjoituksia toimivan koodin parissa.
Edit: Nyt konetta sulkiessa huomasin, että dbdata.txt oli auki notepadissa. Liekö vaikutusta asiaan?
Heippa taas novice!
Tietolähteenä toimivan tekstitiedoston dbdata.txt tulee sijaita C:-aseman juuressa (C:\dbdata.txt). Oletan, että kopioit tiedoston käyttäen hyväksi copy/paste-kombinaatiota...tarkista, ettei esim. tiedoston loppuun tullut muutamaa ylimääräistä rivinvaihtoa...elikä tiedoston ensimmäiset viisi merkkiä
ovat: Matti ja kuusi viimeistä merkkiä ovat: vaimon...
Voit ohittaa tietolähteen kirjoittamalla ohjelmakoodissa seuraavien rivien eteen '-merkin tai poistamalla rivit kokonaan...
'If Dir() <> "C:\dbdata.txt" Then 'FileSystem.FileOpen( _ '1, "C:\dbdata.txt", OpenMode.Input, OpenAccess.Read) 'TextBox1.Text = FileSystem.InputString(1, LOF(1)) 'TextBox1.Tag = TextBox1.Text 'End If
sen jälkeen voit kirjoittaa ohjelman tekstiboxiin oman tietolähteen (ennen napin painamista) vaihda myös TextBox1.ReadOnly-ominaisuuden arvoksi False
Tietolähteen tietuerakenteen tulee noudattaa seuraavaa kaavaa:
etunimi;sukunimi;osoite;postinumero;postitoimipaikka;puhelin;email;merkinnät etunimi;sukunimi;osoite;postinumero;postitoimipaikka;puhelin;email;merkinnät etunimi;sukunimi;osoite;postinumero;postitoimipaikka;puhelin;email;merkinnät
Huom! viimeisen tietueen perään ei tule *-merkkiä eikä rivinvaihtoa.
Jos et kommentoi/poista koodissa em. rivejä voit kirjoittaa uuden templaatin esim. Notepad-ohjelmalla noudattaen samaa kaavaa, tallentaa tiedoston C:-aseman juureen nimellä dbdata.txt ja käyttää sitä omana tietolähteenä...
Tarkista, että ADOX ja Microsoft.VisualBasic näkyy Solution Explorer'ssa Referencess-listalla...jos ei näy niin tuo ne/se projektiin klikkaamalla Referencess-kuvaketta hiiren oikealla ja valitse: Add Reference, valitse .NET tai GAC-välilehti, etsi listalta Microsoft.VisualBasic tuplaklikkaa nimeä (pitäisi ilmaantua alempaan laatikkoon) valitse COM-välilehti, etsi listalta Microsoft ADO Ext. 2.8 for DDL and Security tuplaklikkaa nimeä ja klikkaa OK-painiketta.
PS. esimerkkiohjelmassa ei olekaan mitään muuta, kuin puutteita, mutta missään nimessä en ole kiinnostunut rakentamaan kenellekkään ilmaiseksi täydellisyyksiä hipovaa graafista tietokanta-hallintaohjelmaa...
Toiminta on kuitenkin testattu, joten toimintaa vakavasti haittaavia bugeja ei pitäisi löytymän - yksi sulkumerkki ")" oli jäänyt pois leikatessa/liimatessa tänne (Visual Basic näyttää automaattisesti mistä) ja MessageBox-viesteissä on tietenkin kirjoitusvirheitä...
Noniin.. Lähtihän se toimimaan. Taulun nimeksi piti vaan laittaa 'taulu1'.
Nyt vaan rivi riviltä käymään tämä läpi, että tajuan mitä tässä oikeen tapahtuu...
Moikka taas novice!
Teit todella tarkan havainnon...
vaihda koodissa rivi:
kysely = "INSERT INTO [Taulu1] " + _
tähän:
kysely = "INSERT INTO [" + taulu + "] " + _
ja voit antaa taululle haluamasi nimen.
Hei taas
Miten saan yhteyden vaikkapa openoffice base:lla (.odb) tehtyyn tietokantaan?
Tästä ilmeisesti pitää jotain vaihtaa
Dim yhteys As New OleDb.OleDbConnection yhteys.ConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0 _ ;Data Source = C:\tietokanta.odb" yhteys.Open()
Ja sitten jos vielä joku viitsisi suomentaa muutamia 'termejä':
OleDb
Microsoft.Jet.OLEDB.4.0
ODBC
OBDC
ADO
ADOX
API
RDBMS
Moikka taas novice!
Hauskaa, minullakin on oma tietokantamuoto, jonka tiedostopääte on .odb ja joka käyttää viriteltyä JET-moottoria... tein sen, kun rakentelin Excelin sisään oman graafisen tietokanta-hallinta moduulin...hoitelen samalla virityksellä myös sähköpostin-liitetiedostoineen ja FTP-down/upload työt.
Mikäli kiinnostaa niin sähköposti-moduulin esiastetta voi käydä tsekkaamassa täältä
OpenOffice.org mainostaa täyttä yhteensopivuutta Microsoft Office tuotteisiin nähden, joten jos lupaukset pitää niin OleDb-yhteyden pitäisi onnistua...testaa niin tiedät onnistuuko...
suomenteluissa ei ole mitään järkeä...riittää, että tietää mistä on kysymys ja miten jutskat toimii...Wikipedia auttaa...
Heippa Nea, minua alkoi kiinnostamaan tämä kohta:
neau33 kirjoitti:
käyttää viriteltyä JET-moottoria...
Siis miten oikein olet viritellyt JET-moottoria? Vai käytätkö jonkun muun virittelemää JET-moottoria? Miten tuo virittely käytännössä tapahtuu, kun tietääkseni siitä ei ole lähdekoodejakaan saatavilla?
Sitten noiden sanojen selityksiin. Uskoisin että tässä haettiin nimenomaan selityksiä mitä lyhenteet tarkoittavat eikä vain suomennoksia. Toki Wikipedia auttaa ja sinne noista monesta onkin linkki. Laitoin nyt silti myös lyhyen suomenkielisen kuvauksen kustakin.
OleDb
Microsoftin komponenttiobjektimalliin (COM) pohjautuva tietokantarajapinta
Microsoft.Jet.OLEDB.4.0
OLEDB:n ja Jet-tietokantamoottorin välinen liima (provider)
ODBC Open Database Connectivity
Liityntärajapinta, jonka avulla sovellus voi kommunikoida useiden eri tietokantamoottoreiden kanssa. Käytännössä kaikille yleisille tietokantamoottoreille löytyy ODBC-korjasto
OBDC
Hmm, olisiko väärin kirjoitettu ODBC ?
ADO ActiveX Data Objects
Microsoftin ActiveX komponenttimalliin perustuva tietokantakirjasto
ADOX Microsoftin DDL ja turvaominaisuuksien laajennus ADO:lle
Laajennus edelliseen, mahdollistaa myös tietokannan rakenteiden ja käytönhallinan käsittelemisen komponenttimallina.
APIApplication Programming Interface
Rajapinta, jonka avulla voidaan ohjelmallisesti käyttää toista ohjelmaa tai järjestelmää.
RDBMS Relational database management system
Relaatiotietokantamoottori. Eli järjestelmä joka säilyttää relaatiomallin mukaista tietoa muistivälineellä (yleensä kiintolevyllä) ja antaa käsitellä (lukea ja kirjoittaa) kyseistä tietoa, yleensä rakenteista kyselykieltä käyttäen.
Heippa Grez!
virittely on täysin omaa ja tieto siitä miten virittely käytännössä tapahtuu pysyy aivan täysin omana tietona...
No jos et halua kertoa miten olet viritellyt, niin paljasta edes miksi? Eli siis, mitä etuja olet hakenut ja saavuttanut virittelyllä.
Eipä sillä että nyt olisi mitään "akateemista" suurempaa mielenkiintoa asiaan. Viriteltyjä Jet-kirjastoja kun ei kuitenkaan voisi oikein hyödyntää mihinkään muuhun kuin omakäyttöprojekteihin.
Heippa taas Grez!
toi ei nyt toimi...miksi tässä = mitä kohtaa ≈ miten ...
Huomenta!
Aloin Nea vääntämään tosta sun antamasta 'tietokanta managerista' vähän 'edistyneempää'.
Laitoin nyt ainakin aluksi mahdollisuuden asettaa kenttien nimet ja lukumäärän ennen tietokanna tekemistä.
Koodi on varmaan päin peräaukkoa, mutta ei se ainakaan code ikkunassa herjaa mistään. Muuten hyvä mutta ei toimi ;(
Ei varmaan ole oikeen toi ALTER TABLE ADD systeemi - miten se pitäis tehdä?
Oletuksen ohjelman pitäis tehdä 1. kentään ton ID:n
Dim k As Integer 'nudlkm = numeric updown = 8 koska alkuperäisessäkin 'oli 8 kenttää + ID (muutan kunhan opin) Dim kenttänimi(nudLkm.Value - 1) As String For k = 0 To nudLkm.Value - 1 kenttänimi(k) = InputBox( _ "Anna " & k + 1 & ". kentän nimi", "Tietokanta manageri", "") Next k Try yhteys.Open() malliTaulu = yhteys.GetOleDbSchemaTable( _ OleDb.OleDbSchemaGuid.Tables, New Object() _ {Nothing, Nothing, taulu, "TABLE"}) yhteys.Close() : yhteysmerkkijono = Nothing If malliTaulu.Rows.Count = 0 Then Dim komento As OleDb.OleDbCommand = _ New OleDb.OleDbCommand( _ "CREATE TABLE [" + taulu + "]" + _ "([ID] INT IDENTITY(1, 1), " + _ "CONSTRAINT [pk_ID] PRIMARY KEY _ (ID))", yhteys) yhteys.Open() komento.ExecuteNonQuery() yhteys.Close() : komento = Nothing For k = 0 To nudLkm.Value - 1 komento = New OleDb.OleDbCommand( _ "ALTER TABLE [" + taulu + "] ADD _ ([" + kenttänimi(k) + "] MEMO NOT NULL) ", yhteys) yhteys.Open() komento.ExecuteNonQuery() yhteys.Close() : komento = Nothing Next k malliTaulu = Nothing End If
Moikka taas novice!
mitähän jos lähtisit lähestymään asiaa ensin vaikkapa tältä pohjalta...
C:\dbdata.txtbase:
Etunimi;Sukunimi;Osoite;Postinumero;Postitoimipaikka;Puhelin;Sähköposti;Merkinnät*TEXT;TEXT;TEXT;TEXT;TEXT;TEXT;HYPERLINK;MEMO|Matti;Mainio;Matinkatu 2;12112;Kotikaupunki;041-1234567;mailto:matti.mainio@kotiposti.fi;Eronnut äskettäin vaimostaan, juo paljon*Liisa;Mainio;Liisankatukatu 1;12110;Kotikaupunki;041-1234533;mailto:liisa.mainio@kotiposti.fi;Eronnut äskettäin miehestään, nai paljon*Martti;Mölsä;Sivukuja 13;12113;Kotikaupunki;050-5055513;Ei tietoa;Valittaa yleensä joka asiasta*Lilli;Simpsakka;Kotikatu 33;12133;Kotikaupunki;044-7649520;mailto:lilli.simpsakka@kotikanava.fi;Nähty usein kaupunginjohtajan kyljessä*Jorma;Jortikka;Keskuskatu 10;12111;Kotikaupunki;010-1112221;mailto:jorma.jortikka@kotikanava.fi;Vaimon kanssa ongelmia, vaan ei herra Mainion ex-vaimon
Ohjelma on väännetty SharpDevelop 3.0:lla
Imports System.Data Imports MicroSoft.VisualBasic Imports System.Windows.Forms Public Partial Class MainForm: Inherits Form Public Sub New() Me.InitializeComponent() End Sub Sub OpenToolStripMenuItemClick(sender As Object, e As EventArgs) OpenFileDialog1.Title = "Avaa tietokanta" OpenFileDialog1.InitialDirectory = "c:\" OpenFileDialog1.Filter = "Tietokanta tiedostot|*.txtbase" OpenFileDialog1.FileName = String.Empty OpenFileDialog1.ShowDialog() If Dir(OpenFileDialog1.FileName) <> "" And _ OpenFileDialog1.FileName.IndexOf(".") > -1 Then FileOpen(1,OpenFileDialog1.FileName, OpenMode.Input) Dim FileStrArray() As String = _ InputString(1,LOF(1)).Split("|") FileClose(1) Dim TypeArray() As String = _ FileStrArray(0).Split("*") Dim DataArray() As String = _ FileStrArray(1).Split("*") FileStrArray = Nothing Dim ds As DataSet = New DataSet Dim tbl As DataTable = New DataTable("Taulu1") Dim ColHeaderArray() As String = _ TypeArray(0).Split(";") For i As Integer = 0 To ColHeadeRArray.GetUpperBound(0) Dim dcols As DataColumn = New DataColumn With dcols .DataType = System.Type.GetType("System.String") .ColumnName = ColHeaderArray(i) End With tbl.Columns.Add(dcols): dcols = Nothing Next: ds.Tables.Add(tbl) For i As Integer = 0 To DataArray.GetUpperBound(0) Dim ArraySplit() As String = _ DataArray(i).Replace( _ Environment.NewLine,"").Split(";") Dim drow As DataRow = tbl.NewRow() For j As Integer = 0 To ArraySplit.GetUpperBound(0) drow.Item(j) = ArraySplit(j) Next j tbl.Rows.Add(drow) ArraySplit = Nothing Next i DataGridView1.DataSource = ds.Tables("Taulu1") Dim linkcol As DataGridViewLinkColumn = _ New DataGridViewLinkColumn Dim cell As DataGridViewCell = _ New DataGridViewLinkCell () linkcol.HeaderText = "Sähköposti" linkcol.CellTemplate = cell DataGridView1.Columns.RemoveAt(6) DataGridView1.Columns.Insert(6,linkcol) DataGridView1.ClearSelection Dim LinkExists As Boolean = False Dim ColTypes() As String = _ TypeArray(1).Split(";"): TypeArray = Nothing For i As Integer = 0 To ColTypes.GetUpperBound(0) If ColTypes(i) = "HYPERLINK" Then LinkExists = True: Exit For End If Next: ColTypes = Nothing If LinkExists Then For i As Integer = 0 To DataArray.GetUpperBound(0) DataGridView1.Rows(i).Selected = True Dim GetlinkArray() As String = _ DataArray(i).Replace( _ Environment.NewLine,"").Split(";") DataGridView1.SelectedCells.Item( _ 6).Value = GetlinkArray(6) DataGridView1.Rows(i).Selected = False Next i: DataArray = Nothing End If DataGridView1.AutoResizeColumns( _ DataGridViewAutoSizeColumnsMode.AllCells) End If End Sub Sub DataGridView1CellDoubleClick( _ sender As Object, e As DataGridViewCellEventArgs) CheckLinkField End Sub Public Sub CheckLinkField() If dblClick Then Dim col As DataGridViewColumn For Each col In DataGridview1.Columns If col.HeaderText = "Sähköposti" Then Dim address As String = _ DataGridView1.CurrentCell.Value.ToString If address.IndexOf("mailto:") > -1 Then If Dir("C:\Program Files\" " + _ "Outlook Express\msimn.exe") <> "" Then Shell("C:\Program Files\" + _ "Outlook Express\msimn.exe /mailurl:" + address) Exit Sub End If End If End If Next End If End Sub End Class
Aihe on jo aika vanha, joten et voi enää vastata siihen.