2013-07-18 49 views
-1

我有列表框中的表名來檢查相同的表是否有相同的列。例如Foreach循環在Rich文本框中查看結果,但僅查看第一個查詢結果。

listBox3有EMPLOYEE表名我的查詢必須檢查EMPLOYEE表是否有不同的列。

此查詢的工作方式如下:userA具有Employee表,UserB具有Employee表。比較兩個用戶的Employee表後,我得到了richTextBox1上的Alter語句。

取決於我的EMPLOYEE表我想看看下面的結果;

alter table EMPLOYEE add description VARCHAR2(15);

alter table EMPLOYEE add CITY VARCHAR2(10);

但僅看到:

ALTER TABLE EMPLOYEE添加描述VARCHAR2(15);

foreach (string Items in listBox3.Items) 
        { 
         using (OracleCommand crtCommand = new OracleCommand("with src as(select src.table_name src_table_name, src.column_name src_col_name, src.data_type src_data_type, src.data_length src_data_len, src.data_precision src_data_precision, src.data_scale src_data_scale, src.nullable src_nullable,decode(T.Constraint_Type,'P', 'Primary Key','U','Unique','') as src_cons from all_tab_columns src left join (select Cc.Column_Name,Uc.Constraint_Type from user_cons_columns cc, user_constraints uc where Cc.Constraint_Name = Uc.Constraint_Name and Cc.Table_Name = Uc.Table_Name) t on T.Column_Name = Src.Column_Name where table_name = '" + Items + "' and owner='" + txtSrcUserID.Text + "'), tgt as(select tgt.table_name tgt_table_name, tgt.column_name tgt_col_name, tgt.data_type tgt_data_type, tgt.data_length tgt_data_len, tgt.data_precision tgt_data_precision, tgt.data_scale tgt_data_scale, tgt.nullable tgt_nullable, decode(T.Constraint_Type,'P', 'Primary Key','U','Unique','') as tgt_cons from all_tab_columns tgt left join (select Cc.Column_Name,Uc.Constraint_Type from user_cons_columns cc, user_constraints uc where Cc.Constraint_Name = Uc.Constraint_Name and Cc.Table_Name = Uc.Table_Name) t on T.Column_Name = tgt.Column_Name where table_name = '"+Items+"' and owner='" + txtDesUserID.Text + "'), col_details as(select src.src_table_name, nvl(tgt.tgt_table_name, first_value(tgt_table_name) over(order by tgt_table_name nulls last)) tgt_table_name, src.src_col_name, src.src_data_type, src.src_data_len, src.src_data_precision, src.src_data_scale, src.src_nullable,src_cons, tgt.tgt_col_name, tgt.tgt_data_type, tgt.tgt_data_len, tgt.tgt_data_precision, tgt.tgt_data_scale, tgt.tgt_nullable,tgt_cons from src full outer join tgt on (src.src_col_name = tgt.tgt_col_name))select * from (select case when tgt_data_type != src_data_type or tgt_data_len != src_data_len or tgt_data_precision != src_data_precision or tgt_data_scale != src_data_scale or tgt_nullable != src_nullable then 'alter table ' || tgt_table_name || ' modify ' || tgt_col_name || ' ' || src_data_type || ' ' || case when src_data_type in ('DATE') then null else case when src_data_type in ('VARCHAR', 'VARCHAR2') then ' (' ||nvl(to_char(src_data_len), ' ') || ') 'else decode(nvl(src_data_precision, -1), -1, null, nvl(to_char(src_data_precision), ' ') || ', ' || nvl(to_char(src_data_scale), ' ') || ')') end end || case when tgt_nullable = 'Y' then ' null ' else ' not null ' end || tgt_cons when tgt_col_name is null then 'alter table ' || tgt_table_name || ' add ' || src_col_name || ' ' || ' ' || ' ' || src_data_type || ' ' || case when src_data_type in ('DATE') then null else case when src_data_type in ('VARCHAR', 'VARCHAR2')then '('|| nvl(to_char(src_data_len), ' ') || ') ' else decode(nvl(src_data_precision, -1), -1, null, nvl(to_char(src_data_precision), ' ') || ', ' || nvl(to_char(src_data_scale), ' ') || ')')end end || tgt_cons when src_col_name is null then 'alter table '|| tgt_table_name ||' drop '||tgt_col_name end alter_statement from col_details) where alter_statement is not null", conn1)) 
         { 
          var result = crtCommand.ExecuteScalar(); 

          if (result != null) 
          { 
           richTextBox1.AppendText(Environment.NewLine); 
           richTextBox1.AppendText(result.ToString() + ";"); 
           richTextBox1.AppendText(Environment.NewLine); 
          } 
          else 
          { 
           continue; 
          } 

         } 
       } 

回答

0

您可以使用OracleDataReader像下面顯示的結果,如果你有更多的記錄,從查詢回來,也從來不在SQL中使用內嵌參數,最好使用參數化查詢,以避免SQL注入攻擊。

using (OracleCommand crtCommand = new OracleCommand(sql, Con)) 
using (OracleDataReader reader = cmd.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 

     if(!reader.IsDBNull(0)) 
       richTextBox1.AppendLine(reader[0].ToString(); + ";"); 

    } 
} 
+0

是存在的結果爲空值可我也繼續檢查下一個表列表框中與此查詢/ – user2593362

+0

我meaned繼續檢查與此代碼 – user2593362

+0

您可以檢查空像'reader.IsDBNull( 0)'如果這返回true,那麼你有空值 – Damith