2009-01-20 39 views
9

Tôi đang truy vấn dữ liệu từ các chế độ xem có thể thay đổi. Tôi cần phải biết nếu cột tồn tại trước khi tôi làm một crs.get******(). Tôi đã tìm thấy rằng tôi có thể truy vấn siêu dữ liệu như thế này để xem một cột tồn tại trước khi tôi yêu cầu dữ liệu từ nó.Làm cách nào để kiểm tra xem liệu tên cột có tồn tại trong CachedRowSet không?

ResultSetMetaData meta = crs.getMetaData(); 
int numCol = meta.getColumnCount(); 

for (int i = 1; i < numCol+1; i++) 
    if(meta.getColumnName(i).equals("name")) 
     return true; 

Có cách nào đơn giản hơn để kiểm tra xem cột có tồn tại không?

EDIT: Nó phải là cơ sở dữ liệu bất khả tri. Đó là lý do tại sao tôi tham khảo CachedRowSet thay vì cơ sở dữ liệu.

Trả lời

8

Không có một cách đơn giản hơn với các API JDBC chung (ít nhất là không mà tôi biết, hoặc có thể tìm thấy ... Tôi đã có chính xác cùng mã trong bộ công cụ cây nhà lá vườn của tôi.)

(mã của bạn không hoàn thành):

ResultSetMetaData meta = crs.getMetaData(); 
int numCol = meta.getColumnCount(); 

for (int i = 1; i < numCol+1; i++) 
{ 
    if(meta.getColumnName(i).equals("name")) 
    {return true;} 

} 
return false; 

điều đó đang được nói, nếu bạn sử dụng và/hoặc truy vấn SQL độc quyền, cơ sở dữ liệu cụ thể của API, tôi chắc chắn rằng bạn có thể tìm cách thanh lịch hơn để làm điều tương tự. .. nhưng bạn phải viết mã tùy chỉnh cho từng cơ sở dữ liệu bạn cần xử lý. Tôi muốn gắn bó với các API JDBC, nếu tôi là bạn.

Có điều gì đó về giải pháp được đề xuất của bạn khiến bạn nghĩ rằng nó không chính xác? Nó có vẻ đơn giản, đủ để tôi ...

+0

Tôi mới vào cachedRowSet, tôi chỉ tìm ra điều này khi tôi đang viết câu hỏi của mình. Đặt câu hỏi một cách mạch lạc làm tôi nghĩ nó theo những cách khác nhau. Chỉ cần đảm bảo rằng tôi đang đi đúng hướng. – WolfmanDragon

+0

Nếu bạn cần tìm nhiều cột, bạn luôn có thể có trả về «Set » được điền bởi lệnh gọi phương thức 'getColumnName (i)'. Bằng cách này, bạn có thể tham khảo 'set.contains (myCol)' thay vì lặp qua tất cả mọi thứ. – corsiKa

1

Cơ sở dữ liệu nào?

Tôi nghĩ trong Oracle có các bảng nơi các cột được liệt kê.

Tôi không nhớ nếu nó hoạt động cho quan điểm cũng có, nhưng tôi đoán họ làm, đó là một cái gì đó như:

select colum_name from all_views where view_name like 'myview' 

hoặc

select name from all_objects where object_name like 'myview' and object_type='view' 

Tôi không nhớ chính xác cú pháp . Bạn nên có quyền truy cập không gian mặc dù.

Mọi RDBMS sẽ có thứ gì đó tương tự.

Bạn cũng có thể thực hiện các truy vấn

select * from myView where 1 = 0 ; 

Và từ các siêu dữ liệu có được các cột, nếu những gì bạn muốn nó để tránh lấy dữ liệu trước khi biết nếu các cột có mặt.

+0

Nó phải là cơ sở dữ liệu bất khả tri. Tôi chưa bao giờ làm việc với Oracle, nhưng có thể sẽ làm rất sớm. 1 cho một số thông tin tốt về quan điểm của Oracle. – WolfmanDragon

+0

Sau đó chọn * từ myview nơi 1 = 0 nên làm. Làm việc với RsMd mặc dù nhưng nó là khá nhanh. – OscarRyz

1

Không, thực sự không phải là cách tốt hơn. Bạn có thể muốn giải quyết vấn đề. Nếu bạn có thể xác định lại vấn đề, đôi khi nó làm cho giải pháp đơn giản hơn vì sự cố đã thay đổi.

0

CẢNH BÁO: sau bình luận thuần túy từ bộ nhớ mà không cần bất cứ giấy tờ hỗ trợ :)

Nếu tôi nhớ chính xác có một vấn đề bí ẩn mà nuôi luôn cái xấu xí-Trưởng ban khi oracle lưu trữ thực hiện rowset được sử dụng với kết nối tổng hợp. Dường như có một tham chiếu im lặng đến kết nối được giữ trong đối tượng rowset được lưu trong bộ nhớ cache (mặc dù nó được cho là bị ngắt kết nối), nó đóng một kết nối khác sau đó được mở từ nhóm trên bộ sưu tập rác. Vì lý do này, tôi cuối cùng đã từ bỏ và viết lớp đối tượng dữ liệu của riêng tôi (những ngày này tôi muốn trao cho nó vào mùa xuân & hibernate).

7

bạn có thể sử dụng phương pháp tiếp cận ngắn hơn bằng cách sử dụng thực tế là findColumn() sẽ ném SQLException cho InvalidColumName nếu cột không nằm trong CachedRowSet.

ví dụ

try { 
    int foundColIndex = results.findColumn("nameOfColumn"); 
} catch { 
    // do whatever else makes sense 
} 

Có khả năng lạm dụng Exception Handling (mỗi EffectiveJava mục ed 2 57) nhưng nó là một thay thế cho vòng lặp qua tất cả các cột từ dữ liệu meta.

+0

Điều này không giống như một ý tưởng hay. – Khatri

Các vấn đề liên quan