sonucuna dayanarak java testi tablodaki satır sayısını saymak ve başarılı / başarısız SQL alt sorgu kullanın

oy
1

Aşağıda benim SQL Server tabloları 2 bulunmaktadır.

Taddress

addressId | addressName |
2         | testAddress |

VoIP Adaptor

linkId | clientId | addressId |
1      | 4        | 2         |

Bir rekor taddress var olup olmadığını kontrol etmek için bir SQL alt sorgu kullanan bir java testi yazmaya çalışıyorum.

Örneğin:

SELECT COUNT(*) FROM Taddress
WHERE addressId =
(SELECT addressId FROM Tlink
WHERE clientId = param)

Aşağıda testi çalıştırdığınızda Şu anda, test hep clientId parametre VoIP Adaptor mevcut olmasa bile geçer.

try {
        dbAccessSetUp();
        ResultSet rs = stmt.executeQuery(SELECT COUNT(*) FROM taddress a INNER JOIN tlink l on a.address_id = l.internal_address_id WHERE l.ext_client_id = + this.clientNo);

        if(!rs.next()) {
            fail(Record does not exist in taddress based on ExtClientNo);
        }

        int count = 0;

        while(rs.next()) {              

            count = rs.getInt(1);
            System.out.println(number of count :  + count);
            assertTrue(0 < count);
        } 
        rs.close(); 
    } catch(SQLException se) { 
        se.printStackTrace(); 
        assertEquals(true, false);
    } catch(Exception e) { 
        e.printStackTrace();
        assertEquals(true, false);
    } finally { 
        try { 
            if(stmt!=null) stmt.close();  
        } catch(SQLException se2) {
            assertEquals(true, false);
        } 
        try { 
            if(conn!=null) conn.close(); 
        } catch(SQLException se) {
            se.printStackTrace(); 
            assertEquals(true, false);
        } 
    } 
Oluştur 20/10/2018 saat 14:22
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
0

Yukarıdaki kod örnekleri dayanarak, bu sizin için çalışması gerekir:

try {
        dbAccessSetUp();
        ResultSet rs = stmt.executeQuery("SELECT COUNT(*)FROM taddress A INNER JOIN tlink L ON A.address_id = L.internal_address_id WHERE L.ext_client_id =" + this.clientNo);
        int count=0;
        while(rs.next()) {
            count =  ((Number) rs.getObject(1)).intValue();

        }

        if(count > 0) {
            assertTrue(true);
            System.out.println(count + " record(s) in taddress based on ExtClientNo");
        }
        else {
            fail("No records in taddress");
        }

    }catch(Exception ex) {
        System.out.println(ex.getMessage());
    }

Bu takdirde başarısız olur:

  • senin clientNo için VoIP Adaptor hiçbir eşleşen kayıtları vardır
  • VoIP Adaptor eşleşen bir kayıt yoktur, ancak taddress hiçbir eşleşen kayıtları yoktur

Bu takdirde geçecek:

  • VoIP Adaptor eşleşen bir kayıt yoktur ve eşleşen bir rekor taddress içinde var
Cevap 20/10/2018 saat 18:58
kaynak kullanıcı

oy
0

Sorgunuzla yapın:

SELECT COUNT(*) 
FROM taddress a INNER JOIN tlink l on a.addressid = l.addressID
WHERE l.clientid = @param

Bu 0 ya eğer döner:

  • o param için bir VoIP Adaptor
  • Bu VoIP Adaptor hiçbir taddress

Eğer ilişki bozuldu nerede olduğunu bilmek istiyorsanız:

SELECT COUNT(*) as count_link, COUNT(a.addressid) as count_address 
FROM taddress a RIGHT JOIN tlink l on a.addressid = l.addressID
WHERE l.clientid = @param

sayım olursa olsun geçmesi @param ne zaman> 0 olduğu yönündeki iddianızı ile ilgili olarak, ben görmek istiyorum belirtir bazı ek ayıklama / ekran görüntüsü / çıktı vs

Düzenle

Yani koduyla sorunudur:

Sen sql çalıştırmak ve ardından çağrı if(!rs.hasNext())

Çağrı gerçek getiri rs.next kadar senin resultset, bir satır var, bunu inkâr yüzden testin yanlış dönerse, çalışmaz, ve resultset şimdi sorgudan veri ilk satırına işaret eğer. Verilerin SADECE hat - sen gerektiğini artık veri okumak için ama yok ...

Sonraki diyorsunuz while(rs.hasNext())bu sizin resultset başka bir satır ilerletir, bu yüzden artık sayım verilerine işaret ediyor. Bu çağrı false döndürür ve böylece verilerin daha fazla satır vardır sizin süre döngü gövdesi çalışır asla -sen sonuç kümesinin dışında herhangi bir veri çekme asla senin assert çalıştırmak asla vs vs

Yeniden işe eğer ilk sizin assert () yapmak ve while döngüsü hendek böylece kodunuzu

if(rs.next())
  assert(rs.getInt(1) > 0);

Bu formun bir sayım sorgusu her zaman hiçbir veri var resultset test küçük nokta var, bir satır döndürür. Sorgu çalıştırmak için başarısız olursa bir istisna yerine üretecektir

Cevap 20/10/2018 saat 14:43
kaynak kullanıcı

oy
0

Senin sorgusunda, 1'den fazla satır var kadar hatasız çalışacak Tlinkmasaya, bu nedenle olarak katılmak basit olarak değiştirmek için iyidir

SELECT COUNT(*)
FROM Taddress A INNER JOIN Tlink L ON A.addressId = L.addressId
WHERE L.clientId = Param;

Şimdi, sorgu doğru sonuç döndürmek kabul edersiniz, ama Java kodu söz olarak beklendiği gibi çalışmıyor

Yukarıdaki sorguyu kullanarak bir test çalıştırdığınızda Şu anda, test hep clientId parametre VoIP Adaptor mevcut olmasa bile geçer.

Sorgu yukarıda sadece bir satır (bir değer) döndürür, böylece döngü gerekmez ve bu kod işe yaramaz

while(rs.next()){
    count = rs.getInt(1);
    assertTrue(0 < count);
}

Tüm ihtiyacınız ne değeri sorgu tarafından döndürülen ve daha büyük olmadığını kontrol olsun orada 0ya da değil gibi bir şey

count =  ((Number) rs.getObject(1)).intValue();
int cmp;
if (count > 0)
// Exists;
else 
//Not exists;

Veya

assertTrue(count.equals(0));
Cevap 20/10/2018 saat 14:36
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more