ASP.NET C#Oracle插入期间缺少表达式错误

ASP.NET C#Oracle插入期间缺少表达式错误,c#,asp.net,oledb,C#,Asp.net,Oledb,首先,请允许我说这是我10年来第一个指定的数据库项目。。。第一次用C#做。我“只是”尝试使用OleDB将表单数据插入到Oracle表中 我一直收到“ORA-00936:缺少表达”。下面是我的代码。。。知道少了什么吗 public string getConnString() { //set the connection string from web config file return WebConfigurationManage

首先,请允许我说这是我10年来第一个指定的数据库项目。。。第一次用C#做。我“只是”尝试使用OleDB将表单数据插入到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);
        }

这是一个多么好的教训啊。显然,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();
        }

您在哪一行得到该错误?OleDbParameter[]param=new-OleDbParameter[14];实际为OLEDB参数[]参数=新的OLEDB参数[13];由于数组是基于0的..?您是否尝试过直接在Oracle DB工具中执行该SQL语句(即不通过C#执行)。我认为问题在于您的SQL语句不正确。通过使用一些不同的参数构造,您可以大大减少代码量。i、 e:myCommand.Parameters.Add(“@name”,value)。使用像PetaPoco这样的微型ORM应该可以避免大量与数据库相关的代码麻烦。你试过删除to§DATE()转换吗?简:我在抛出异常的catch中遇到了这个错误。流行音乐播音员如果我将OleDb参数减少到13,那么我将收到一个索引超出范围错误,因为最大索引将小于列表本身。该死,OleDb问号!我怎么没早点想到呢?恭喜!顺便问一下,为什么不使用Oracle本机驱动程序(OracleClient命名空间)?OleDb的使用是某些多数据库兼容性要求所必需的吗?我在选择驱动程序时发现,根据Visual Studio 2010,它已被弃用。
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();
        }