none
ben veritabanı oluşturmaya calısıyorum ama hata alıyorum RRS feed

  • Soru

  • veri tabanı olustururken acces tarih başlangıc ve bitiş tarih diye olusturdum ama hata alıyorum herşey acces uyumlu kuşkum tarihi kodlayamadım herşey yerli yerinde dogru sıralaması isimleri bile.

    Imports System.Data.OleDb




    Public Class Form1
        ReadOnly baglanti As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Database1.mdb")

        Private Sub Tem()
            TextBox1.Text = ""
            TextBox2.Text = ""
            TextBox3.Text = ""
            TextBox4.Text = ""
            TextBox5.Text = ""
            TextBox6.Text = ""
            DateTimePicker1.Text = ""
            DateTimePicker2.Text = ""

        End Sub

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            baglanti.Open()
              komut As New OleDbCommand("insert into HC (İsim, Soyisim, Telefon, Adres, BasTarih, Bitarih,  Fiyat, Açıklama) values ('" + +TextBox1.Text + +"','" + +TextBox2.Text + +"','" + +TextBox3.Text + +"','" + +TextBox4.Text + +"','" + +DateTimePicker1.Text + +"','" + +DateTimePicker2.Text + +"','" + +TextBox5.Text + +"', '" + +TextBox6.Text + +"')", baglanti)
                komut.ExecuteNonQuery()
            End Using
            baglanti.Close()
            MessageBox.Show("", "")
            Tem()


        End Sub

        Private Sub DateTimePicker1_ValueChanged(sender As Object, e As EventArgs) Handles DateTimePicker1.ValueChanged

        End Sub
    End Class

    yürütmeye bastıgımda kayıt ekle yapıyorum direk atıyor alttakı hatayı verıyor

    Aldıgım hata=

    System.InvalidCastException: '"insert into HC (İsim, Soyisim, T" dizesinden 'Double' türüne yapılan dönüştürme geçerli değil.'
    FormatException: Giriş dizesi doğru biçimde değildi.
    Bu özel durum özgün olarak bu çağrı yığınında oluşturuldu:
    Microsoft.VisualBasic.CompilerServices.Conversions.ParseDouble(string, System.Globalization.NumberFormatInfo)
    Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(string, System.Globalization.NumberFormatInfo)


    7 Ocak 2020 Salı 00:37

Yanıtlar

  • Harun'un söylediği gibi parametre kullanmazsanız "SQL injection attack" büyük bir tehlikedir. Ancak, yine parametre kullanmazsanız, verileri veritabanına hatalı gönderme sansiniz var. Bu hata yeterince açıksa, o zaman (sizinkinde de olduğu gibi) sanslisinizdir ve hata olarak gorulur. Daha kotusu, hata olmasina ragmen programın calismasinda hataya yol acmayacak bir şeydir ve "hatalı" veri sessiz sedasız kaydedilir (tipik bir ornek, 2 Ocak 2020'nin, 1 Şubat 2020 olarak kaydedilme olasiligi). Uzun lafın kısası, veritabanı islemlerinde parametre kullanınız. Parametre sayesinde, data tiplerini siz hyalin haliyle kullanirsiniz, doğrular cevirim islerini aradaki driverlar sizin adınıza halleder.

    ReadOnly baglanti As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Database1.mdb"
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    	Dim sql As String = <sql>insert into HC 
    		(İsim, Soyisim, Telefon, Adres, BasTarih, Bitarih,  Fiyat, Açıklama) 
    		values 
    		(@isim, @Soyisim, @Telefon, @Adres, @BasTarih, @Bitarih,  @Fiyat, @Aciklama)
        </sql>
    	Dim fiyat As Decimal = Nothing
    
    	Using cn As OleDbConnection = New OleDbConnection(baglanti)
    
    		Using komut As OleDbCommand = New OleDbCommand("", cn)
    			komut.Parameters.Add("@isim", OleDbType.VarChar).Value = TextBox1.Text
    			komut.Parameters.Add("@Soyisim", OleDbType.VarChar).Value = TextBox2.Text
    			komut.Parameters.Add("@Telefon", OleDbType.VarChar).Value = TextBox3.Text
    			komut.Parameters.Add("@Adres", OleDbType.VarChar).Value = TextBox4.Text
    			komut.Parameters.Add("@BasTarih", OleDbType.Date).Value = DateTimePicker1.Value
    			komut.Parameters.Add("@Bitarih", OleDbType.Date).Value = DateTimePicker2.Value
    			Decimal.TryParse(TextBox5.Text, fiyat)
    			komut.Parameters.Add("@Fiyat", OleDbType.Decimal).Value = fiyat
    			komut.Parameters.Add("@Aciklama", OleDbType.VarChar).Value = TextBox6.Text
    			cn.Open()
    			komut.ExecuteNonQuery()
    			cn.Close()
    		End Using
    	End Using
    	MessageBox.Show("", "")
    	Tem()
    End Sub
    

    OleDbConnection gibi bağlantı nesnelerini bir kez yaratıp saklamayın. Onun yerine bağlantı cümlesini saklayın (bağlantı nesneleri daha kıymetli). 

    Dikkat ederseniz, veri tiplerini cevirip (fiyat) gönderiyoruz. Tarih degerleri icin de, dateTimePicker.Text yerine .Value yani DateTime kullanıyoruz. Text degerleriyle dogruyu yakalamak pek de kolay bir islem degil, tek güvenilir olan ODB canonical format tarzı olan (yyyy/MM/dd HH:mm:dd).

    access'i veritabanı olarak kullanmamanız gerektiğine ben de yürekten katiliyorum. Eğer çok geç degilse onun yerine bir veritabanı kullanmaya baslamanizi öneririm, postgreSQL, mySQL , MS SQL Server, SQLIte, LiteDb ... yeter ki düzgün bir veritabanı olsun.

    Bu arada, eğer access kullanmaya mahkumsanız, hiç olmazsa driverinizi değiştirmeyi dusunun. Jet yerine ACE.OLEDB driverini kullanmakta fayda var (access 2007 engine ile gelmeye baslamisti galiba?).

      


    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    7 Ocak 2020 Salı 13:53
    Yanıtlayıcı

Tüm Yanıtlar

  • Veritabanı olarak Access kullanımını kesinlikle tavsiye etmem.

    ('"+TextBox1.Text+"')

    Tarzında veri çekerek SQL sorgularında kullanmak, büyük bir " SQL Injection " açığına sebep olmaktadır. Sana tavsiyem sql sorgularında parametre kullan. 

    Merak et, Araştır, Geliştir. Harun Yılmaz

    7 Ocak 2020 Salı 07:51
  • Teşekkür ederim dedeginiz gibi yaptım şimdide 

    System.Data.OleDb.OleDbException: 'Ölçüt ifadesinde veri türü uyuşmazlığı.'

    hatası verdi

    7 Ocak 2020 Salı 08:15
  • Yazdığın kodu paylaşabilir misin? Kodu görmeden kimse bir şey diyemez 

    Merak et, Araştır, Geliştir. Harun Yılmaz

    7 Ocak 2020 Salı 12:44
  • Aslında hatayı aynen  google üzerinde aratırsanız size , tabloda yer alan kolonun tipi ile senin yolladığın verinin tipinin farklı olmasından dolayı böyle bir hata aldığını söyleyecek. Mesela int alana "0" değerini yollarsan string olarak atama yapmak isteyecektir.  Çünkü access çift tırnak içini metin olarak algılar. Bu da belirttiğin hatayı almanı sağlar.  Kolonların ve yolladığınız verilerin tiplerini kontrol edin. 

    Altan Özdemir

    7 Ocak 2020 Salı 13:36
  • Vb de 2 tane + yan yana double toplama yapıyormuş ahahaha, enteresan !!!.

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    7 Ocak 2020 Salı 13:48
  • Harun'un söylediği gibi parametre kullanmazsanız "SQL injection attack" büyük bir tehlikedir. Ancak, yine parametre kullanmazsanız, verileri veritabanına hatalı gönderme sansiniz var. Bu hata yeterince açıksa, o zaman (sizinkinde de olduğu gibi) sanslisinizdir ve hata olarak gorulur. Daha kotusu, hata olmasina ragmen programın calismasinda hataya yol acmayacak bir şeydir ve "hatalı" veri sessiz sedasız kaydedilir (tipik bir ornek, 2 Ocak 2020'nin, 1 Şubat 2020 olarak kaydedilme olasiligi). Uzun lafın kısası, veritabanı islemlerinde parametre kullanınız. Parametre sayesinde, data tiplerini siz hyalin haliyle kullanirsiniz, doğrular cevirim islerini aradaki driverlar sizin adınıza halleder.

    ReadOnly baglanti As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Database1.mdb"
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    	Dim sql As String = <sql>insert into HC 
    		(İsim, Soyisim, Telefon, Adres, BasTarih, Bitarih,  Fiyat, Açıklama) 
    		values 
    		(@isim, @Soyisim, @Telefon, @Adres, @BasTarih, @Bitarih,  @Fiyat, @Aciklama)
        </sql>
    	Dim fiyat As Decimal = Nothing
    
    	Using cn As OleDbConnection = New OleDbConnection(baglanti)
    
    		Using komut As OleDbCommand = New OleDbCommand("", cn)
    			komut.Parameters.Add("@isim", OleDbType.VarChar).Value = TextBox1.Text
    			komut.Parameters.Add("@Soyisim", OleDbType.VarChar).Value = TextBox2.Text
    			komut.Parameters.Add("@Telefon", OleDbType.VarChar).Value = TextBox3.Text
    			komut.Parameters.Add("@Adres", OleDbType.VarChar).Value = TextBox4.Text
    			komut.Parameters.Add("@BasTarih", OleDbType.Date).Value = DateTimePicker1.Value
    			komut.Parameters.Add("@Bitarih", OleDbType.Date).Value = DateTimePicker2.Value
    			Decimal.TryParse(TextBox5.Text, fiyat)
    			komut.Parameters.Add("@Fiyat", OleDbType.Decimal).Value = fiyat
    			komut.Parameters.Add("@Aciklama", OleDbType.VarChar).Value = TextBox6.Text
    			cn.Open()
    			komut.ExecuteNonQuery()
    			cn.Close()
    		End Using
    	End Using
    	MessageBox.Show("", "")
    	Tem()
    End Sub
    

    OleDbConnection gibi bağlantı nesnelerini bir kez yaratıp saklamayın. Onun yerine bağlantı cümlesini saklayın (bağlantı nesneleri daha kıymetli). 

    Dikkat ederseniz, veri tiplerini cevirip (fiyat) gönderiyoruz. Tarih degerleri icin de, dateTimePicker.Text yerine .Value yani DateTime kullanıyoruz. Text degerleriyle dogruyu yakalamak pek de kolay bir islem degil, tek güvenilir olan ODB canonical format tarzı olan (yyyy/MM/dd HH:mm:dd).

    access'i veritabanı olarak kullanmamanız gerektiğine ben de yürekten katiliyorum. Eğer çok geç degilse onun yerine bir veritabanı kullanmaya baslamanizi öneririm, postgreSQL, mySQL , MS SQL Server, SQLIte, LiteDb ... yeter ki düzgün bir veritabanı olsun.

    Bu arada, eğer access kullanmaya mahkumsanız, hiç olmazsa driverinizi değiştirmeyi dusunun. Jet yerine ACE.OLEDB driverini kullanmakta fayda var (access 2007 engine ile gelmeye baslamisti galiba?).

      


    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    7 Ocak 2020 Salı 13:53
    Yanıtlayıcı