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 ClassHahaaa!!!
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 Ifsen 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 IfMoikka 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 ClassAihe on jo aika vanha, joten et voi enää vastata siihen.