2012-09-19 45 views
3

我可以先說這是我10年內第一個分配的數據庫項目......並且第一次在C#中完成。我「簡單地」試圖使用OleDB將表單數據插入到Oracle表中。ASP.NET C#在Oracle插入過程中缺少表達式錯誤

我不斷收到「ORA-00936:缺少的表達式」。下面是我的代碼...任何想法缺少什麼?

public string getConnString() 
     { 
      //set the connection string from web config file 
      return WebConfigurationManager.ConnectionStrings["ConnString"].ConnectionString; 
     } 

     private void executeInsert(string EventType, string EventSubType, string DeptName, string EventDate, string Duration, string EventName, string EventAdd, string WardNo, string Program, string NumAtt, string StTime, string EndTime, string MngName, string RecKeeper) 
     { 
      OleDbConnection conn = new OleDbConnection(getConnString()); 
      string sql = "INSERT INTO APPS.CLV_EVENT_TRACK (EVENTTYPE, EVENTSUBTYPE, DEPTNAME, EVENTDATE, DURATION, EVENTNAME, EVENTADD, WARDNO, PROGRAM, NUMATT, STARTTIME, ENDTIME, MNGNAME, RECORDKEEPER) VALUES " 
       + "(@EventType, @EventSubType, @DeptName, TO_DATE(@EventDate, 'Month dd, YYYY'), @Duration, @EventName, @EventAdd, @WardNo, @Program, @NumAtt, TO_DATE(@StTime, 'HH:MI:SS PM'), TO_DATE(@EndTime, 'HH:MI:SS PM'), @MngName, @RecKeeper)"; 

      try 
      { 
       conn.Open(); 
       OleDbCommand cmd = new OleDbCommand(sql, conn); 
       OleDbParameter[] param = new OleDbParameter[14]; 
       param[0] = new OleDbParameter("@EventType", OleDbType.VarChar, 25); 
       param[1] = new OleDbParameter("@EventSubType", OleDbType.VarChar, 80); 
       param[2] = new OleDbParameter("@DeptName", OleDbType.VarChar, 240); 
       param[3] = new OleDbParameter("@EventDate", OleDbType.Date); 
       param[4] = new OleDbParameter("@Duration", OleDbType.Numeric); 
       param[5] = new OleDbParameter("@EventName", OleDbType.VarChar, 80); 
       param[6] = new OleDbParameter("@EventAdd", OleDbType.VarChar, 150); 
       param[7] = new OleDbParameter("@WardNo", OleDbType.VarChar, 25); 
       param[8] = new OleDbParameter("@Program", OleDbType.VarChar, 150); 
       param[9] = new OleDbParameter("@NumAtt", OleDbType.Numeric); 
       param[10] = new OleDbParameter("@StTime", OleDbType.Date); 
       param[11] = new OleDbParameter("@EndTime", OleDbType.Date); 
       param[12] = new OleDbParameter("@MngName", OleDbType.VarChar, 150); 
       param[13] = new OleDbParameter("@RecKeeper", OleDbType.VarChar, 150); 

       param[0].Value = EventType; 
       param[1].Value = EventSubType; 
       param[2].Value = DeptName; 
       param[3].Value = EventDate; 
       param[4].Value = Duration; 
       param[5].Value = EventName; 
       param[6].Value = EventAdd; 
       param[7].Value = WardNo; 
       param[8].Value = Program; 
       param[9].Value = NumAtt; 
       param[10].Value = StTime; 
       param[11].Value = EndTime; 
       param[12].Value = MngName; 
       param[13].Value = RecKeeper; 

       for (int i = 0; i < param.Length; i++) 
       { 
        cmd.Parameters.Add(param[i]); 
       } 

       cmd.CommandType = System.Data.CommandType.Text; 
       cmd.ExecuteNonQuery(); 
      } 

      catch (Exception ex) { throw ex; } 

      finally 
      { 
       conn.Close(); 
      } 
     } 

     protected void btnSubmit_Click(object sender, EventArgs e) 
     { 
      var start = DateTime.Parse(txtStTime.Text); 
      var end = DateTime.Parse(txtEndTime.Text); 

      TimeSpan duration = end.Subtract(start); 
      string meetDuration = duration.TotalMinutes.ToString(); 

      executeInsert(rbEventType.SelectedItem.Text, ddVolType.SelectedItem.Text, 
       txtDept.Text, txtEventDate.Text, meetDuration, txtEventName.Text, 
       txtEventAdd.Text, ddWard.SelectedItem.Value, txtSBPlan.Text, txtNumVol.Text, 
       txtStTime.Text, txtEndTime.Text, txtEventMgr.Text, txtRecording.Text); 
     } 

UPDATE代碼:

public string getConnString() 
     { 
      //set the connection string from web config file 
      return WebConfigurationManager.ConnectionStrings["ConnString"].ConnectionString; 
     } 

     private void executeInsert(string EventType, string EventSubType, string DeptName, string EventDate, string Duration, string EventName, string EventAdd, string WardNo, string Program, string NumAtt, string StTime, string EndTime, string MngName, string RecKeeper) 
     { 

      OleDbConnection conn = new OleDbConnection(getConnString()); 
      string sql = "INSERT INTO APPS.CLV_EVENT_TRACK (EVENTTYPE, EVENTSUBTYPE, DEPTNAME, EVENTDATE, DURATION, EVENTNAME, EVENTADD, WARDNO, PROGRAM, NUMATT, STARTTIME, ENDTIME, MNGNAME, RECORDKEEPER) VALUES " 
       + "(@EventType, @EventSubType, @DeptName, TO_DATE(@EventDate, 'Month dd, YYYY'), @Duration, @EventName, @EventAdd, @WardNo, @Program, @NumAtt, TO_DATE(@StTime, 'HH:MI:SS PM'), TO_DATE(@EndTime, 'HH:MI:SS PM'), @MngName, @RecKeeper)"; 

      try 
      { 
       conn.Open(); 
       using (OleDbCommand cmd = conn.CreateCommand()) 
       { 
        cmd.CommandText = sql; 

        cmd.Parameters.AddRange(new OleDbParameter[] 
        { 
         new OleDbParameter("@EventType", EventType), 
         new OleDbParameter("@EventSubType", EventSubType), 
         new OleDbParameter("@DeptName", DeptName), 
         new OleDbParameter("@EventDate", EventDate), 
         new OleDbParameter("@Duration", Duration), 
         new OleDbParameter("@EventName", EventName), 
         new OleDbParameter("@EventAdd", EventAdd), 
         new OleDbParameter("@WardNo", WardNo), 
         new OleDbParameter("@Program", Program), 
         new OleDbParameter("@NumAtt", NumAtt), 
         new OleDbParameter("@StTime", StTime), 
         new OleDbParameter("@EndTime", EndTime), 
         new OleDbParameter("@MngName", MngName), 
         new OleDbParameter("@RecKeeper", RecKeeper) 
        }); 

        cmd.ExecuteNonQuery(); 
       } 
      } 

      catch (Exception ex) { throw ex; } 

      finally 
      { 
       conn.Close(); 
      } 
     } 

     protected void btnSubmit_Click(object sender, EventArgs e) 
     { 

      var start = DateTime.Parse(txtStTime.Text); 
      var end = DateTime.Parse(txtEndTime.Text); 

      TimeSpan duration = end.Subtract(start); 
      string meetDuration = duration.TotalMinutes.ToString(); 

      executeInsert(rbEventType.SelectedItem.Text, ddVolType.SelectedItem.Text, 
       txtDept.Text, txtEventDate.Text, meetDuration, txtEventName.Text, 
       txtEventAdd.Text, ddWard.SelectedItem.Value, txtSBPlan.Text, txtNumVol.Text, 
       txtStTime.Text, txtEndTime.Text, txtEventMgr.Text, txtRecording.Text); 
     } 
+0

在哪一行,你得到這個錯誤? – Thousand

+0

也不應該OleDbParameter [] param = new OleDbParameter [14]; 實際上是OleDbParameter [] param = new OleDbParameter [13]; 由於數組是基於0 ..? – MethodMan

+0

您是否嘗試過直接在Oracle DB Tools中執行該SQL語句(即不通過C#)。我認爲這個問題是你的SQL語句不正確。 –

回答

2

一個教訓,學到什麼。顯然一個ORACLE參數必須以「?」的形式出現

所以,我的最終代碼......實際上成功地插入一條記錄:

public string getConnString() 
     { 
      //set the connection string from web config file 
      return WebConfigurationManager.ConnectionStrings["ConnString"].ConnectionString; 
     } 

     private void executeInsert()  
     { 
      OleDbConnection conn = new OleDbConnection(getConnString()); 
      string sql = "INSERT INTO APPS.CLV_EVENT_TRACK (EVENTTYPE, EVENTSUBTYPE, DEPTNAME, EVENTDATE, DURATION, EVENTNAME, EVENTADD, WARDNO, PROGRAM, NUMATT, STARTTIME, ENDTIME, MNGNAME, RECORDKEEPER) "; 
      sql += "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; 

      try 
      { 
       var start = DateTime.Parse(txtStTime.Text); 
       var end = DateTime.Parse(txtEndTime.Text); 

       TimeSpan duration = end.Subtract(start); 
       string meetDuration = duration.TotalMinutes.ToString(); 

       conn.Open(); 
       using (OleDbCommand cmd = conn.CreateCommand()) 
       { 
        cmd.CommandText = sql; 
        cmd.Parameters.Add("?", OleDbType.VarChar).Value = rbEventType.SelectedItem.Text; 
        cmd.Parameters.Add("?", OleDbType.VarChar).Value = ddVolType.SelectedItem.Text; 
        cmd.Parameters.Add("?", OleDbType.VarChar).Value = txtDept.Text; 
        cmd.Parameters.Add("?", OleDbType.Date).Value = txtEventDate.Text; 
        cmd.Parameters.Add("?", OleDbType.Numeric).Value = meetDuration; 
        cmd.Parameters.Add("?", OleDbType.VarChar).Value = txtEventName.Text; 
        cmd.Parameters.Add("?", OleDbType.VarChar).Value = txtEventAdd.Text; 
        cmd.Parameters.Add("?", OleDbType.VarChar).Value = ddWard.SelectedItem.Value; 
        cmd.Parameters.Add("?", OleDbType.VarChar).Value = txtSBPlan.Text; 
        cmd.Parameters.Add("?", OleDbType.Numeric).Value = txtNumVol.Text; 
        cmd.Parameters.Add("?", OleDbType.Date).Value = txtStTime.Text; 
        cmd.Parameters.Add("?", OleDbType.Date).Value = txtEndTime.Text; 
        cmd.Parameters.Add("?", OleDbType.VarChar).Value = txtEventMgr.Text; 
        cmd.Parameters.Add("?", OleDbType.VarChar).Value = txtRecording.Text; 

        cmd.ExecuteNonQuery(); 
       } 
      } 

      catch (Exception ex) { throw ex; } 

      finally 
      { 
       conn.Close(); 
      } 
     } 

     protected void btnSubmit_Click(object sender, EventArgs e) 
     { 
      executeInsert(); 
     } 
+0

Dang,OleDb問號!我怎麼沒有早點想到它?恭喜!順便說一下,爲什麼不使用Oracle本地驅動程序(OracleClient命名空間)?使用OleDb是否需要多個數據庫兼容性要求? – Larry

+0

我看到,當我選擇驅動程序時,根據Visual Studio 2010,它已被棄用。 – Psykopup