Parameters.Add komutuya insert etme

Bu konuyu okuyanlar

Vatansever

Asistan
Katılım
23 Ağu 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
SQLite database'i kullanarak bir datatable'deki bilgileri database'ye aktarmaya çalışıyorum fakat bir türlü başaramadım öncelikle kayılar arasında (') şaretleri vardı bunlar hata veriyordu mesela (Jack's New England Clam Chowder) gibi girdiler bunu çözmenin yolu sanırım Parameters komutu kullanmak aşağıdaki kodu yazdım doğrumu değilmi bilmiyorum ama kod hata vermeye devam ediyor bu seferki hata farklı Girdilerden birini gösterip ( girdi ismi) dizesinden integer türüne yapılan dönüştürme geçerli değil diyor bir türlü işin içinden çıkamadım ben komut1.CommandText stringinde hata olduğunu düşünüyorum hatanın nerde olduğunu söyleyebilirmisiniz
Aşağıdaki döngüyüde doğru yaptığımdan tam emin değilim
Kod:
        For R As Integer = 0 To yeniTablo.Rows.Count - 1
            For C As Integer = 0 To yeniTablo.Columns.Count - 1
                    Dim komut1 As New SQLiteCommand()
                    If (Cn.State = ConnectionState.Closed) Then Cn.Open()
                    komut1.Connection = Cn
                    komut1.CommandText = "INSERT INTO Kisiler([check],isim,eposta,bilgi,grubu) VALUES (@check, [MENTION=12320]isim[/MENTION], @eposta, [MENTION=85892]bilgi[/MENTION], @grubu)" 
                    komut1.Parameters.Add("@check", 0)
                    komut1.Parameters.Add( [MENTION=12320]isim[/MENTION]", yeniTablo.Rows(R).Item(2).ToString)
                    komut1.Parameters.Add("@eposta", yeniTablo.Rows(R).Item(3).ToString)
                    komut1.Parameters.Add( [MENTION=85892]bilgi[/MENTION]", yeniTablo.Rows(R).Item(4).ToString)
                    komut1.Parameters.Add("@grubu", yeniTablo.Rows(R).Item(5).ToString)
                    komut1.ExecuteNonQuery()
                    komut1.Dispose()
                    Cn.Close()
            Next C

        Next R

Projemde alttaki kodu kullanıyordum bu kod çalışan kod ama (') karekteri ile ilgili sorunlar yüzünden değiştirmem gerekiyor

Kod:
   Dim deger As Boolean = False ' bu komut access'te kullanılıyor Sqlite'de 0 yada 1 kullanılıyor
            Dim komut1 As New SQLiteCommand()
            If (Cn.State = ConnectionState.Closed) Then Cn.Open()
            komut1.Connection = Cn
            komut1.CommandText = (((("INSERT INTO Kisiler([check],isim,eposta,bilgi,grubu) VALUES (" & 0 & ",'") & Me.TextBox1.Text & "','") & posta1.ToString & "','") & Me.TextBox3.Text & "','") & Me.ComboBox1.SelectedItem & "')"
            ' Alttaki komut Accesss'te kullanılıyor
            ' komut1.CommandText = (((("INSERT INTO Kisiler([check],isim,eposta,bilgi,grubu) VALUES (" & deger & ",'") & Me.TextBox1.Text & "','") & Me.TextBox2.Text & "','") & Me.TextBox3.Text & "','") & Me.ComboBox1.SelectedItem & "')"
            komut1.ExecuteNonQuery()
            komut1.Dispose()
            Cn.Close()
 

_Albay_

Öğrenci
Katılım
2 Nis 2013
Mesajlar
7
Reaksiyon puanı
0
Puanları
0
Paramaters.Add komutun sorun çıkarmıyor kullanımı da o şekildedir.
 

sdelta

Profesör
Katılım
23 Nis 2008
Mesajlar
4,195
Reaksiyon puanı
116
Puanları
63
Add yerine AddWithValue kullanın.
 

EropaKING

Profesör
Katılım
29 Tem 2009
Mesajlar
1,652
Reaksiyon puanı
17
Puanları
0
İstersen bir de şu kodu dene (Bana kalırsa kendi kodundaki tek hata CHECK değerinin value girişini STRING yerine INTEGER yapman. 0 -> "0"):


=============================
string query = @"INSERT INTO Kisiler([check],isim,eposta,bilgi,grubu) VALUES (@check, @isim, @eposta, @bilgi, @grubu)";

komut1.Connection = Cn;
komut1.CommandText = query;

komut1.Parameters.AddWithValue("@check", "0");

=============================

ADD veya ADDWITHVALUE yu kullanabilirsin. Performans farkı dışında her ikiside benzer işi yapar. Convert etme durumuna göre birtakım performans farkları yaratabilirler.
 

Vatansever

Asistan
Katılım
23 Ağu 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
Alttaki kod için verilen hata mesajı
Kisiler.check may not be NULL


Kod:
         For R As Integer = 0 To yeniTablo.Rows.Count - 1
         If yeniTablo.Rows(R).Item(1).ToString = "Kisiler" Then
                    Dim komut1 As New SQLiteCommand()
              If (Cn.State = ConnectionState.Closed) Then Cn.Open()
                     komut1.Connection = Cn
                     komut1.CommandText = "INSERT INTO Kisiler([check],isim,eposta,bilgi,grubu) VALUES (@check,  [MENTION=12320]isim[/MENTION], @eposta,  [MENTION=85892]bilgi[/MENTION], @grubu)"
                     komut1.Parameters.Add("@check", "0")
                     komut1.Parameters.Add(  [MENTION=12320]isim[/MENTION]", 2) 'yeniTablo.Rows(R).Item(2).ToString)
                     komut1.Parameters.Add("@eposta", 3) 'yeniTablo.Rows(R).Item(3).ToString)
                     komut1.Parameters.Add(  [MENTION=85892]bilgi[/MENTION]", 4) 'yeniTablo.Rows(R).Item(4).ToString)
                     komut1.Parameters.Add("@grubu", 5) ' yeniTablo.Rows(R).Item(5).ToString)
                     komut1.ExecuteNonQuery()
                     komut1.Dispose()
                     Cn.Close()
        End If
         Next R


Alttaki kod için verilen hata mesajı Ahmet isim sütunundaki ilk satırda yazan bilgidir
"Ahmet" dizesinden 'Integer' türüne yapılan dönüştürme geçerli değil.


Kod:
         For R As Integer = 0 To yeniTablo.Rows.Count - 1
         If yeniTablo.Rows(R).Item(1).ToString = "Kisiler" Then
                    Dim komut1 As New SQLiteCommand()
              If (Cn.State = ConnectionState.Closed) Then Cn.Open()
                        komut1.CommandText = "INSERT INTO Kisiler([check],isim,eposta,bilgi,grubu) VALUES (@check,  [MENTION=12320]isim[/MENTION], @eposta,  [MENTION=85892]bilgi[/MENTION], @grubu)"
                komut1.Parameters.Add("@check", "0")
                komut1.Parameters.Add(  [MENTION=12320]isim[/MENTION]", yeniTablo.Rows(R).Item(2).ToString)
                komut1.Parameters.Add("@eposta", yeniTablo.Rows(R).Item(3).ToString)
                komut1.Parameters.Add(  [MENTION=85892]bilgi[/MENTION]", yeniTablo.Rows(R).Item(4).ToString)
                komut1.Parameters.Add("@grubu", yeniTablo.Rows(R).Item(5).ToString)
                komut1.ExecuteNonQuery()
                komut1.Dispose()
                Cn.Close()
        End If
         Next R

Alttaki kodda verilen hata
SQL logic error or missing database
Insufficient parameters supplied to the command

Kod:
        For R As Integer = 0 To yeniTablo.Rows.Count - 1
            If yeniTablo.Rows(R).Item(1).ToString = "Kisiler" Then
            Dim komut1 As New SQLiteCommand()
            If (Cn.State = ConnectionState.Closed) Then Cn.Open()
            komut1.Connection = Cn
            komut1.CommandText = "INSERT INTO Kisiler([check],isim,eposta,bilgi,grubu) VALUES (@check,  [MENTION=12320]isim[/MENTION], @eposta,  [MENTION=85892]bilgi[/MENTION], @grubu)"
            komut1.Parameters.AddWithValue("@check", "0")
            komut1.Parameters.AddWithValue(  [MENTION=12320]isim[/MENTION]", yeniTablo.Rows(R).Item(2).ToString)
            komut1.Parameters.AddWithValue("@eposta", yeniTablo.Rows(R).Item(3).ToString)
            komut1.Parameters.AddWithValue(  [MENTION=85892]bilgi[/MENTION]", yeniTablo.Rows(R).Item(4).ToString)
            komut1.Parameters.AddWithValue("@grubu", yeniTablo.Rows(R).Item(5).ToString)
            komut1.ExecuteNonQuery()
            komut1.Dispose()
            Cn.Close()
            End If
        Next R

- - - Mesaj Güncellendi - - -

Arkadaşlar yapmak istediğim email programımdaki Adres Defteri ,Gruplar,Sunucular için bir yedekleme dosyası oluşturmak
ve istendiğindede bu yedekleme dosyasından tüm Kişi listesi ve ayarları tekrar programa geri yüklemek,
bu işi en basitinden nasıl yaparım diye düşündüm ve şöyle bir yöntem uyguladım

finalTablom isminde bir DataTable oluşturdum ardından bunun içine database'mdeki Gruplar tablosu Sunucular tablosu Kisiler tablosundaki bütün bilgileri bu
DataTable'ye ekledim ama hangi bilginin hangi tablonun bilgisi olduğunu ayırt edebilmek için fazladan tabloadi isminde bir sütun oluşturdum
burayada o satırdaki bilgi hangi tabloya aitse o tablonun adını yazıyorum böylece döngü içinde bunu kolayca filtreleyebiliyorum
mesela döngü içinde tabloadi sütununda Kisiler yazıyorsa o satırdaki bilgiyi Kisiler tablosuna insert et Gruplar yazıyorsa Gruplar tablosuna insert et şeklinde

İşte problemim bu, insert komutunda başarıya ulaşamadım ama fark edebilir diye birşey daha eklemem gerekiyor
Database'imdeki bilgilerin hepsini bir DataTable'ye doldurup ardında alttaki kod ile xml formatında kaydediyorum
Kod:
Private dsy As String = Application.StartupPath & "\user.xml"
finalTablom.WriteXml(dsy, XmlWriteMode.WriteSchema)

Bu bilgileri geri yüklerkende
Kod:
        Dim yeniTablo As New DataTable
        yeniTablo.ReadXml(dsy)
Komutuyla geri yüklüyorum işte herşey burda başlıyor, elde ettiğim bu DataTable içindeki bilgileri döngüye sokup
Tüm bilgileri ait oldukları tablonun içine insert edicem, verdiğim problemli döngü kodu bu kısma aittir,
bunu başardıktan sonraki aşamam ise insert edilecek bilgi Database'mde varmı yokmu kontrolunu yapıp yoksa
eklesin varsa eklemesin olacak böylece aynı şeylerden birden fazla eklenmesi engellenmiş olacak burası kolay
şu insert problemini çözsem yetecek.

Database'mdeki bilgileri doldurduğum Tablomun oluşturma kodu alta
Kod:
        Dim finalTablom As New DataTable
        finalTablom.TableName = "Final"
        finalTablom.Columns.Add("id", GetType(Integer))
        finalTablom.Columns("id").AutoIncrement = True
        finalTablom.Columns("id").AutoIncrementSeed = 1
        finalTablom.Columns("id").AutoIncrementStep = 1
        ' Bilginin hangi tabloya ait olduğuna dair bilgi sütunu
        finalTablom.Columns.Add("tabloadi", GetType(String))
        ' Kişiler Tablosu
        finalTablom.Columns.Add("isim", GetType(String))
        finalTablom.Columns.Add("eposta", GetType(String))
        finalTablom.Columns.Add("bilgi", GetType(String))
        finalTablom.Columns.Add("grubu", GetType(String))
        ' Gruplar Tablosu
        finalTablom.Columns.Add("liste", GetType(String))
        ' Sunucular
        finalTablom.Columns.Add("baslik", GetType(String))
        finalTablom.Columns.Add("mail", GetType(String))
        finalTablom.Columns.Add("sunucu", GetType(String))
        finalTablom.Columns.Add("port", GetType(String))
        finalTablom.Columns.Add("ssl", GetType(String))
        finalTablom.Columns.Add("zaman", GetType(String))
        finalTablom.Columns.Add("mb", GetType(String))
        finalTablom.Columns.Add("kullaniciadi", GetType(String))
        finalTablom.Columns.Add("parola", GetType(String))
        Dim primaryKey(0) As DataColumn
        primaryKey(0) = finalTablom.Columns("id")
        finalTablom.PrimaryKey = primaryKey
 

Vatansever

Asistan
Katılım
23 Ağu 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
İnternette çok örnek inceledim sonunda sorunumu çözdüm alttaki kod hatasız işlemi gerçekleştiriyor,
Parameters.Add komutunun internetteki bulabildiğim tüm örneklerini denedim hepsinde hata verdi bu Parameters.Add ve Parameters.AddWithValue arasındaki fark nedir acaba bilen varmı?


Kod:
        For R As Integer = 0 To yeniTablo.Rows.Count - 1
            If yeniTablo.Rows(R).Item(1).ToString = "Kisiler" Then
Dim check = New SqlParameter, isim = New SqlParameter, eposta = New SqlParameter, bilgi = New SqlParameter, grubu = New SqlParameter

                check.DbType = DbType.Int32
                isim.DbType = DbType.String
                eposta.DbType = DbType.String
                bilgi.DbType = DbType.String
                grubu.DbType = DbType.String

                Dim komut1 As New SQLiteCommand()
                If (Cn.State = ConnectionState.Closed) Then Cn.Open()
                komut1.Connection = Cn
                komut1.CommandText = "INSERT INTO Kisiler([check], isim, eposta, bilgi, grubu) VALUES (@check, [MENTION=12320]isim[/MENTION], @eposta, [MENTION=85892]bilgi[/MENTION], @grubu)"
                komut1.Parameters.AddWithValue("@check", 0)
                komut1.Parameters.AddWithValue( [MENTION=12320]isim[/MENTION]", yeniTablo.Rows(R).Item(2).ToString)
                komut1.Parameters.AddWithValue("@eposta", yeniTablo.Rows(R).Item(3).ToString)
                komut1.Parameters.AddWithValue( [MENTION=85892]bilgi[/MENTION]", yeniTablo.Rows(R).Item(4).ToString)
                komut1.Parameters.AddWithValue("@grubu", yeniTablo.Rows(R).Item(5).ToString)
                komut1.ExecuteNonQuery()
                komut1.Dispose()
                Cn.Close()
            Else

            End If
         Next R


:clap:
 
Üst