2011-03-10 86 views
0

我必须搜索3个表格中包含的员工详细信息。我已经使用联接查询查询,但它显示了错误,当我按下搜索按钮:错误:sql命令未正确结束

sql command not properly ended 

C#代码:

try { 
    //Search Employee Details 
    Oracle.DataAccess.Client.OracleConnection cn = new Oracle.DataAccess.Client.OracleConnection(); 

    cn.ConnectionString = "user id=system; password=system;"; 
    Oracle.DataAccess.Client.OracleCommand cmd = new Oracle.DataAccess.Client.OracleCommand(); 

    cmd.Connection = cn; 
    //cn = new Oracle.DataAccess.Client.OracleConnection(); 
    cmd.CommandText = " select deposit.loanid, 
          form1.empedoj, 
          form1.empshare, 
          sharecapital.shareint, 
          sharecapital.loandt, 
          sharecapital.loandeduc, 
          sharecapital.dividend, 
          sharecapital.sharetot 
         from form1, 
          deposit, 
          sharecapital 
         where deposit.loanid(+) = sharecapital.loanid = '" + txtlnid.Text.Trim() + "'"; // shows sql command not properly ended 

    Oracle.DataAccess.Client.OracleDataAdapter ada = new Oracle.DataAccess.Client.OracleDataAdapter(cmd); 
    System.Data.DataTable dt = new DataTable(); 
    dt.Clear(); 
    ada.Fill(dt); 

    //Display in Textbox 
    if (dt.Rows.Count > 0) { 
    txtlnid.Text = dt.Rows[0].ItemArray[0].ToString(); 
    admdate.Text = dt.Rows[0].ItemArray[1].ToString(); 
    txtadmamt.Text = dt.Rows[0].ItemArray[2].ToString(); 
    txtadmint.Text = dt.Rows[0].ItemArray[3].ToString(); 
    loandt.Text = dt.Rows[0].ItemArray[4].ToString(); 
    txtlnamt.Text = dt.Rows[0].ItemArray[5].ToString(); 
    txtlnint.Text = dt.Rows[0].ItemArray[6].ToString(); 
    txtsctot.Text = dt.Rows[0].ItemArray[7].ToString(); 
    } 

    if (cn.State == ConnectionState.Closed) { 
    cn.Open(); 
    } 

    string str; 
    str = cmd.ExecuteScalar().ToString(); 

    if (str != null) { 
    MessageBox.Show("Record Found"); 
    } else { 
    MessageBox.Show("ID not Match"); 
    } 
} catch (Exception ex) { 
    MessageBox.Show(ex.Message); 
} 
+1

您的查询没有条件将form1表链接到其他任何人。这不是错误的根源,但是不太可能会返回你想要的结果,因为它产生了一个笛卡尔积。 (+)不赞成使用外部连接语法,特定于Oracle - 您使用的是哪个版本的Oracle? – 2011-03-10 06:16:01

+0

txtlnid.Text.Trim()返回什么? – 2011-03-10 06:16:04

+0

10g我正在使用。实际上在那txtlnid使用通过使用该文本框搜索员工的详细信息 – 2011-03-11 06:40:18

回答

4

你的SQL语句变成

SELECT DEPOSIT.LOANID, 
     FORM1.EMPEDOJ, 
     FORM1.EMPSHARE, 
     SHARECAPITAL.SHAREINT, 
     SHARECAPITAL.LOANDT, 
     SHARECAPITAL.LOANDEDUC, 
     SHARECAPITAL.DIVIDEND, 
     SHARECAPITAL.SHARETOT 
    FROM FORM1, DEPOSIT, SHARECAPITAL 
    WHERE DEPOSIT.LOANID(+) = SHARECAPITAL.LOANID = '" + txtlnid.Text.Trim() + "'"; 

我怀疑它应该是:

SELECT DEPOSIT.LOANID, 
     FORM1.EMPEDOJ, 
     FORM1.EMPSHARE, 
     SHARECAPITAL.SHAREINT, 
     SHARECAPITAL.LOANDT, 
     SHARECAPITAL.LOANDEDUC, 
     SHARECAPITAL.DIVIDEND, 
     SHARECAPITAL.SHARETOT 
    FROM FORM1, DEPOSIT, SHARECAPITAL 
    WHERE DEPOSIT.LOANID(+) = SHARECAPITAL.LOANID 
    AND SHARECAPITAL.LOANID = '" + txtlnid.Text.Trim() + "'"; 

另外,如果没有正确的连接条件,您有3表连接,查询极有可能返回笛卡尔积。

+1

此外,查询是易受SQL注入,并且@OMGPonies提到 - “(+)”加入贬值 – Sathya 2011-03-10 06:21:33

+1

OP - 只是要清楚 - 你不能在SQL中将“X = Y = Z”作为谓词。不幸的是:) – 2011-03-10 06:42:11

+0

我已修改,你说它显示“对象引用未设置为对象的实例” – 2011-03-10 07:33:00

-2

你试过在你的查询字符串的末尾放一个分号吗?

cmd.CommandText = " select deposit.loanid, form1.empedoj, form1.empshare, 
sharecapital.shareint, sharecapital.loandt, sharecapital.loandeduc, 
sharecapital.dividend, sharecapital.sharetot from form1, deposit , 
sharecapital where deposit.loanid(+) = sharecapital.loanid = '" + txtlnid.Text.Trim() + "';"; 
相关问题