2016-03-29 20 views
2

Bir Airsoft uygulaması üzerinde çalışıyorum.Java'da sql üzerinden veritabanına kayıtlar nasıl eklenir

SQL'de SQL üzerinden bir MS Access veritabanına kayıt eklemeye çalışıyorum. Aşağıdaki ile, veritabanına bir bağlantı kurmuş:

try 
    { 
     //String Driver = "sun.java.odbc.JdbcOdbcDriver"; 

     Class.forName("net.ucanaccess.jdbc.UcanaccessDriver"); 

     Connection conn = DriverManager.getConnection("jdbc:ucanaccess://" + URL,"",""); 

     Statement stmt = conn.createStatement(); 

     System.out.println("Connection Established!"); 

     ResultSet rs = stmt.executeQuery("SELECT * FROM AirsoftGunRentals"); 
     tblRent.setModel(DbUtils.resultSetToTableModel(rs)); 


    } 
    catch(Exception ex) 
    { 
     JOptionPane.showMessageDialog(null, "Error"); 
    } 

benim MS veritabanına erişim Ucanaccess kullanıyorum. Veritabanını okuyor ve bir JTable'a gösteriyor. Ancak, tablo eklemek, silmek ve güncellemek için üç JButton oluşturmam gerekiyor. Ekleme düğmesine basmayı denedim ve bir kayıt eklemeyi denedim, ancak çöküyor ve bana hata veriyor.

try 
    { 
     //String Driver = "sun.java.odbc.JdbcOdbcDriver"; 
     Class.forName("net.ucanaccess.jdbc.UcanaccessDriver"); 
     Connection conn = DriverManager.getConnection("jdbc:ucanaccess://" + URL,"",""); 

     Statement stmt = conn.createStatement(); 

     System.out.println("Connection Established!"); 

     String Query= "INSERT INTO AirsoftGunRentals(NameOfGun, Brand, TypeOfGuns, NumberOfMagazines,Extras,NumberAvailable,UnitRent)"+ 
      "VALUES('"+pName+"','"+pBrand+"','"+pTypeOfGun+"','"+pNumMags+"','"+pExtras+"','"+pNumberAvail+"','"+pRent+"');"; 

     ResultSet rs = stmt.executeQuery(Query); 

     JOptionPane.showMessageDialog(null, "Success!"); 


    } 
    catch(Exception ex) 
    { 
     JOptionPane.showMessageDialog(null, "Error"); 
    } 

Sonuç için umuduyla üçünü denedim. Ama hala büyük hatalar alıyorum. Düğmeler arasındaki tek fark, birinin eklediği, bir silmeyi ve bir tabloyu güncelleştirmesidir. Öte yandan, kod aynıdır, eksi değişkenler.

+3

Hangi hatalar? Tüm özel durum yığın izini gönderin. Ve hazırlanmış ifadeleri kullanın. (http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html) –

cevap

0

MS Access DB'ye kayıt ekleme, silme ve güncelleştirme hakkında bir cevap bulmayı başardım. Bağlantıyı bildirdikten sonra, hazırladığım beyanı bulduğum şey budur. Elimden gelenin en iyisini açıklamaya çalışacağım. Ben tek tek bu değerleri kullanarak eklemek zorunda:

(pstmt = prepped Açıklama Değişken)

pstmt.setWhatever (1, Değişken);

Ve şimdi iyi çalışıyor. Kayıtları silmek ve güncelleştirmek için aynı yöntemi kullanırım.

Bu temel sorgu biçimi şöyledir:

Yaylı SQLInsert = "Tbl değerlere INSERT (NULL,,,,??)";

Açıklamadaki NULL, tablodaki oton sayısıdır. ve .setWhatever() cümlesi, soru işaretlerini veri türleriyle değiştirir. Böylece veritabanını manipüle ediyor.

Katkılarınız için herkese teşekkür ederiz. Çok yardımcı oldu ve bu bölümü çok daha anlaşılabilir hale getirdi.

0

Öncelikle bu gibi tırnak işaretleri önce boşluk ekleyin:

 String Query= "INSERT INTO AirsoftGunRentals(NameOfGun, Brand, TypeOfGuns, NumberOfMagazines,Extras,NumberAvailable,UnitRent) "+ 
     " VALUES('"+pName+"','"+pBrand+"','"+pTypeOfGun+"','"+pNumMags+"','"+pExtras+"','"+pNumberAvail+"','"+pRent+"');"; 

Ve yerine stmt.executeUpdate(Query); kullanın: sorguları ekinizin, güncellemede stmt.executeQuery(Query); ve silme. Seçtiğiniz sorgular için saklayabilirsiniz.

+0

Ah. Şimdi görüyorum. Yani ifade arasındaki boşluklar düz bir SQL ifadesi olarak okur? İronik olarak, bu kodu da yığından aldım. – GipsyD

1

Brahim'den bahsedildiği gibi, verileri her eklediğinizde/eklediğinizde veya sildiğinizde stmt.executeUpdate(Query)'u kullanmalısınız. Ayrıca, bu belirli sorguda, String birleştirmeniz (satırın sonuna bakın) göz önüne alındığında, ")" ile büyük olasılıkla hatalı biçimlendirilmiş bir soruna neden olan "VALUES" arasında boşluk yoktur.

Ancak, ben çok tür kullanım senaryoları ile deneyimli değilseniz kodunuzdan görebilirsiniz ve tüm cehennem sonları projenizde gevşek önce birşeyler göstermeniz eklemek istiyorum:

  • Kullanım PreparedStatementStatement yerine ve SQL Injection'ı önlemek için değişkenleri yer tutucularla değiştirin. Burada kullandığınız kod, SQL enjeksiyonuna aşırı derecede yatkındır - herhangi bir kullanıcının herhangi bir değişken üzerinde herhangi bir kontrolü varsa, bu, tam bir veritabanı dökümü (hırsızlık), verilerin imha edilmesine (vandalizm) veya hatta makineye neden olabilir diğer koşullar yerine getirilirse devralınır. Statement sınıfını asla kullanmamanız için iyi bir öneride bulunmaktan daha iyidir.
  • Java Sözleşmelerine saygı gösterin (veya tutarlı olun). Örneğinizde, diğer tüm değişkenler String query yerine, küçük harfle (Java Sözleşmelerinde olduğu gibi) başlarken, diğer tüm değişkenler String Query'u tanımlarsınız. Fazla mesai, bu tür küçük hatalar (bir yapıyı bozmayacak), classnames değişkenleri ile değişkenleri karıştırmaktan kaynaklanan hatalara yol açacaktır :)

Bu harika dile hakimiyet için yolda iyi şanslar!

+0

Aslında bu bir okul projesi için, ve sadece bir kez kullanmak zorundayız. HİÇ! Hızlı olanı, executeUpdate() yan tümcesini kullanırsanız, döküm için bir sonuç kümesine mi ihtiyacınız olacak? Yoksa bağımsız bir hat mı? Yardım için teşekkürler. Şimdi görev hakkında daha açık bir bakış açısı sunuyor. – GipsyD

+0

Javadoc durumları gibi executeUpdate() deyiminin dönüş değeriyle ilgili olarak, bir tamsayı döndürülür: 'ya (1) SQL Veri Manipülasyon Dili (DML) ifadeleri için satır sayısı veya (2) döndüren SQL deyimleri için satır sayısı Eğer 42 satırları güncellemek için bir executeUpdate() kullanırsanız Yani, SQL enjeksiyonu ile ilgili olarak 42 – niilzon

+0

dönecektir hiçbir şey' ben kalite ve güvenli kod kariyere hazırlamak için güvenli kodlamak için alışkanlığını almanızı tavsiye :) Bunun yanı sıra, bazı sınıf arkadaşlarınız muhtemelen aynı hatayı yaptılar - bu, enjeksiyonun (iyi niyetli/iyi huylu bir modada) sınıfta gösterilmesi için eğlenceli olabilir :) Güvenlik büyük bir konudur ve ezici bir şekilde daha da fazla olacaktır kodun günlük hayatımızda her yerde koşmak, sınıf arkadaşlarınız arasında farkındalık yaratmak için iyi bir örnektir. Bunu düşünmene izin vereceğim :) – niilzon

İlgili konular