在执行命令过程中,发生了一个或多个错误。 ORA-00936: missing expression

时间:2021-08-30 22:30:09
用的是Oracle表,提交数据时报错;说是:《在执行命令过程中,发生了一个或多个错误。 ORA-00936: missing expression》缺少表达式,该怎么解决;请大侠们指点!

void Button1_Click(object sender, EventArgs e) 
{
   try
   {
      string Connectstr = "Provider=MSDAORA;user id=bgzdh;data source=zymis;password=bgzdh2005";
      OleDbConnection Connection = new OleDbConnection(Connectstr);
      OleDbCommand Command = new OleDbCommand("INSERT INTO XC_DWTG(TITLE, AUTHOR, AUTH_UNIT, EDITOR, TYPE, MEDIA, POST_DATE, ZY_DATE, YT_DATE, TV_DATE, BS_DATE, REMARK) VALUES (@TITLE,@AUTHOR,@AUTH_UNIT,@EDITOR,@TYPE,@MEDIA,@POST_DATE,@ZY_DATE,@YT_DATE,@TV_DATE,@BS_DATE,@REMARK)",Connection);

      Command.Parameters.Add(new OleDbParameter("@TITLE", System.Data.OleDb.OleDbType.VarWChar, 50));
      Command.Parameters.Add(new OleDbParameter("@AUTHOR", OleDbType.VarChar, 22));
      Command.Parameters.Add(new OleDbParameter("@AUTH_UNIT", OleDbType.VarChar, 50));
      Command.Parameters.Add(new OleDbParameter("@EDITOR", OleDbType.VarChar, 22));
      Command.Parameters.Add(new OleDbParameter("@TYPE", OleDbType.VarChar, 10));
      Command.Parameters.Add(new OleDbParameter("@MEDIA", OleDbType.VarChar, 20));
      Command.Parameters.Add(new OleDbParameter("@POST_DATE", OleDbType.DBDate, 0));
      Command.Parameters.Add(new OleDbParameter("@ZY_DATE", OleDbType.DBDate, 0));
      Command.Parameters.Add(new OleDbParameter("@YT_DATE", OleDbType.DBDate, 0));
      Command.Parameters.Add(new OleDbParameter("@TV_DATE", OleDbType.DBDate, 0));
      Command.Parameters.Add(new OleDbParameter("@BS_DATE", OleDbType.DBDate, 0));
      Command.Parameters.Add(new OleDbParameter("@REMARK", OleDbType.VarChar, 50));

      Command.Parameters["@TITLE"].Value=TextBox1.Text;
      Command.Parameters["@AUTHOR"].Value=TextBox2.Text;
      Command.Parameters["@AUTH_UNIT"].Value=TextBox3.Text;
      Command.Parameters["@EDITOR"].Value=TextBox4.Text;
      Command.Parameters["@TYPE"].Value=DropDownList1.SelectedItem.Text;
      Command.Parameters["@MEDIA"].Value=DropDownList2.SelectedItem.Text;
      Command.Parameters["@POST_DATE"].Value=TextBox5.Text;
      Command.Parameters["@ZY_DATE"].Value=TextBox6.Text;
      Command.Parameters["@YT_DATE"].Value=TextBox7.Text;
      Command.Parameters["@TV_DATE"].Value=TextBox8.Text;
      Command.Parameters["@BS_DATE"].Value=TextBox9.Text;
      Command.Parameters["@REMARK"].Value=TextBox10.Text;

      Connection.Open();
      Command.ExecuteNonQuery();
      Connection.Close();
   }
   catch (System.Data.OleDb.OleDbException ex)
   {
      Response.Write(ex.Message.ToString());
   }
}

11 个解决方案

#1


把OleDbCommand Command = new OleDbCommand("INSERT INTO XC_DWTG(TITLE, AUTHOR, AUTH_UNIT, EDITOR, TYPE, MEDIA, POST_DATE, ZY_DATE, YT_DATE, TV_DATE, BS_DATE, REMARK) VALUES (@TITLE,@AUTHOR,@AUTH_UNIT,@EDITOR,@TYPE,@MEDIA,@POST_DATE,@ZY_DATE,@YT_DATE,@TV_DATE,@BS_DATE,@REMARK)",Connection);
放到
Connection.Open();
Command.ExecuteNonQuery();
前面试试,是不是你放的太前了,还没给他赋值呢
然后再检查一下类型是不是匹配

#2


看看类型!

#3


类型应该没问题,我都检查过了

#4


你这上面的取值方式,完全没有根据数据字段的要求转换为相应的格式,这样能写进去吗?
比如象下面这样
Command.Parameters["@POST_DATE"].Value=TextBox5.Text;
就应该写成
Command.Parameters["@POST_DATE"].Value=DateTime.Parse(TextBox5.Text);
其他相应的数据也必须一一进行转换

#5


将    Command.Parameters["@POST_DATE"].Value=TextBox5.Text;
      Command.Parameters["@ZY_DATE"].Value=TextBox6.Text;
      Command.Parameters["@YT_DATE"].Value=TextBox7.Text;
      Command.Parameters["@TV_DATE"].Value=TextBox8.Text;
      Command.Parameters["@BS_DATE"].Value=TextBox9.Text;

应该写成:
      Command.Parameters["@POST_DATE"].Value=DateTime.Parse(TextBox5.Text);
      Command.Parameters["@ZY_DATE"].Value=DateTime.Parse(TextBox6.Text);
      Command.Parameters["@YT_DATE"].Value=DateTime.Parse(TextBox7.Text);
      Command.Parameters["@TV_DATE"].Value=DateTime.Parse(TextBox8.Text);
      Command.Parameters["@BS_DATE"].Value=DateTime.Parse(TextBox9.Text);
后依然是同样的错误

#6


该字符串未被识别为有效的 DateTime
      Command.Parameters["@POST_DATE"].Value=DateTime.Parse(TextBox5.Text);
      Command.Parameters["@ZY_DATE"].Value=DateTime.Parse(TextBox6.Text);
      Command.Parameters["@YT_DATE"].Value=DateTime.Parse(TextBox7.Text);
      Command.Parameters["@TV_DATE"].Value=DateTime.Parse(TextBox8.Text);
      Command.Parameters["@BS_DATE"].Value=DateTime.Parse(TextBox9.Text);
凡是上面列出的日期型的字段的值未被识别为有效的 DateTime,该怎么弄啊?

#7


对不起!是我搞错了,楼主的写入方式没有问题,我上面说的是运用存储过程写的时候才那样的.
但我记得,ORACLE写入的时候,不应该是如下啊
("INSERT INTO XC_DWTG(TITLE, AUTHOR, AUTH_UNIT, EDITOR, TYPE, MEDIA, POST_DATE, ZY_DATE, YT_DATE, TV_DATE, BS_DATE, REMARK) VALUES (@TITLE,@AUTHOR,@AUTH_UNIT,@EDITOR,@TYPE,@MEDIA,@POST_DATE,@ZY_DATE,@YT_DATE,@TV_DATE,@BS_DATE,@REMARK)"
后面值部分的@号,应是:号.
然后赋值部分
Command.Parameters["@BS_DATE"].Value=TextBox9.Text;
里面的@号就可以去除了.
还有时间里面的Command.Parameters.Add(new OleDbParameter("@BS_DATE", OleDbType.DBDate, 0));,最后面的长度把它去了吧.

#8


Connection.Open();

放的太后了

#9


搞错了,应该是你的connection字符串有问题

#10


我的string Connectstr = "Provider=msdaora;user id=bgzdh;data source=zymis;password=bgzdh2005"; 有什么不对吗?
在Page_Load里连接到oracle是没问题的呀;就是初始化页面中的一些控件时从库里提出数据来初始化的,初始化控件是好好的,怎么会Connectstr 有问题啊?

#11


终于自己解决了;问题的关键在于Oracle日期转换函数(将字符串转换为日期: to_date('2005-04-29','yyyy-mm-dd'))。
 将字符串格式化为日期型格式时用 Convert.ToDateTime(TextBox5.Text).ToString("yyyy-MM-dd")。

代码如下:

void Button1_Click(object sender, EventArgs e) {
  string Connectstr = "Provider=msdaora;user id=bgzdh;data source=zymis;password=bgzdh2005";
  OleDbConnection Connection = new OleDbConnection(Connectstr);
  string tit="",aut="",aun="",edt="",typ="",med="",posD="",zyD="",ytD="",tvD="",bsD="",rem="";
  tit=TextBox1.Text;
  aut=TextBox2.Text;
  aun=TextBox3.Text;
  edt=TextBox4.Text;
  typ=DropDownList1.SelectedItem.Text;
  med=DropDownList2.SelectedItem.Text;
  posD=TextBox5.Text;
  zyD=TextBox6.Text;
  ytD=TextBox7.Text;
  tvD=TextBox8.Text;
  bsD=TextBox9.Text;
  rem=TextBox10.Text;

  OleDbCommand Command = new OleDbCommand("INSERT INTO XC_DWTG(TITLE, AUTHOR, AUTH_UNIT, EDITOR, TYPE, MEDIA, POST_DATE, ZY_DATE, YT_DATE, TV_DATE, BS_DATE, REMARK) VALUES ('"+tit+"','"+aut+"','"+aun+"','"+edt+"','"+typ+"','"+med+"',to_date('"+posD+"','yyyy-mm-dd'),to_date('"+zyD+"','yyyy-mm-dd'),to_date('"+ytD+"','yyyy-mm-dd'),to_date('"+tvD+"','yyyy-mm-dd'),to_date('"+bsD+"','yyyy-mm-dd'),'"+rem+"')",Connection);
  Connection.Open();
  Command.ExecuteNonQuery();
  Connection.Close();
}
非常感谢各位高人的指点!

#1


把OleDbCommand Command = new OleDbCommand("INSERT INTO XC_DWTG(TITLE, AUTHOR, AUTH_UNIT, EDITOR, TYPE, MEDIA, POST_DATE, ZY_DATE, YT_DATE, TV_DATE, BS_DATE, REMARK) VALUES (@TITLE,@AUTHOR,@AUTH_UNIT,@EDITOR,@TYPE,@MEDIA,@POST_DATE,@ZY_DATE,@YT_DATE,@TV_DATE,@BS_DATE,@REMARK)",Connection);
放到
Connection.Open();
Command.ExecuteNonQuery();
前面试试,是不是你放的太前了,还没给他赋值呢
然后再检查一下类型是不是匹配

#2


看看类型!

#3


类型应该没问题,我都检查过了

#4


你这上面的取值方式,完全没有根据数据字段的要求转换为相应的格式,这样能写进去吗?
比如象下面这样
Command.Parameters["@POST_DATE"].Value=TextBox5.Text;
就应该写成
Command.Parameters["@POST_DATE"].Value=DateTime.Parse(TextBox5.Text);
其他相应的数据也必须一一进行转换

#5


将    Command.Parameters["@POST_DATE"].Value=TextBox5.Text;
      Command.Parameters["@ZY_DATE"].Value=TextBox6.Text;
      Command.Parameters["@YT_DATE"].Value=TextBox7.Text;
      Command.Parameters["@TV_DATE"].Value=TextBox8.Text;
      Command.Parameters["@BS_DATE"].Value=TextBox9.Text;

应该写成:
      Command.Parameters["@POST_DATE"].Value=DateTime.Parse(TextBox5.Text);
      Command.Parameters["@ZY_DATE"].Value=DateTime.Parse(TextBox6.Text);
      Command.Parameters["@YT_DATE"].Value=DateTime.Parse(TextBox7.Text);
      Command.Parameters["@TV_DATE"].Value=DateTime.Parse(TextBox8.Text);
      Command.Parameters["@BS_DATE"].Value=DateTime.Parse(TextBox9.Text);
后依然是同样的错误

#6


该字符串未被识别为有效的 DateTime
      Command.Parameters["@POST_DATE"].Value=DateTime.Parse(TextBox5.Text);
      Command.Parameters["@ZY_DATE"].Value=DateTime.Parse(TextBox6.Text);
      Command.Parameters["@YT_DATE"].Value=DateTime.Parse(TextBox7.Text);
      Command.Parameters["@TV_DATE"].Value=DateTime.Parse(TextBox8.Text);
      Command.Parameters["@BS_DATE"].Value=DateTime.Parse(TextBox9.Text);
凡是上面列出的日期型的字段的值未被识别为有效的 DateTime,该怎么弄啊?

#7


对不起!是我搞错了,楼主的写入方式没有问题,我上面说的是运用存储过程写的时候才那样的.
但我记得,ORACLE写入的时候,不应该是如下啊
("INSERT INTO XC_DWTG(TITLE, AUTHOR, AUTH_UNIT, EDITOR, TYPE, MEDIA, POST_DATE, ZY_DATE, YT_DATE, TV_DATE, BS_DATE, REMARK) VALUES (@TITLE,@AUTHOR,@AUTH_UNIT,@EDITOR,@TYPE,@MEDIA,@POST_DATE,@ZY_DATE,@YT_DATE,@TV_DATE,@BS_DATE,@REMARK)"
后面值部分的@号,应是:号.
然后赋值部分
Command.Parameters["@BS_DATE"].Value=TextBox9.Text;
里面的@号就可以去除了.
还有时间里面的Command.Parameters.Add(new OleDbParameter("@BS_DATE", OleDbType.DBDate, 0));,最后面的长度把它去了吧.

#8


Connection.Open();

放的太后了

#9


搞错了,应该是你的connection字符串有问题

#10


我的string Connectstr = "Provider=msdaora;user id=bgzdh;data source=zymis;password=bgzdh2005"; 有什么不对吗?
在Page_Load里连接到oracle是没问题的呀;就是初始化页面中的一些控件时从库里提出数据来初始化的,初始化控件是好好的,怎么会Connectstr 有问题啊?

#11


终于自己解决了;问题的关键在于Oracle日期转换函数(将字符串转换为日期: to_date('2005-04-29','yyyy-mm-dd'))。
 将字符串格式化为日期型格式时用 Convert.ToDateTime(TextBox5.Text).ToString("yyyy-MM-dd")。

代码如下:

void Button1_Click(object sender, EventArgs e) {
  string Connectstr = "Provider=msdaora;user id=bgzdh;data source=zymis;password=bgzdh2005";
  OleDbConnection Connection = new OleDbConnection(Connectstr);
  string tit="",aut="",aun="",edt="",typ="",med="",posD="",zyD="",ytD="",tvD="",bsD="",rem="";
  tit=TextBox1.Text;
  aut=TextBox2.Text;
  aun=TextBox3.Text;
  edt=TextBox4.Text;
  typ=DropDownList1.SelectedItem.Text;
  med=DropDownList2.SelectedItem.Text;
  posD=TextBox5.Text;
  zyD=TextBox6.Text;
  ytD=TextBox7.Text;
  tvD=TextBox8.Text;
  bsD=TextBox9.Text;
  rem=TextBox10.Text;

  OleDbCommand Command = new OleDbCommand("INSERT INTO XC_DWTG(TITLE, AUTHOR, AUTH_UNIT, EDITOR, TYPE, MEDIA, POST_DATE, ZY_DATE, YT_DATE, TV_DATE, BS_DATE, REMARK) VALUES ('"+tit+"','"+aut+"','"+aun+"','"+edt+"','"+typ+"','"+med+"',to_date('"+posD+"','yyyy-mm-dd'),to_date('"+zyD+"','yyyy-mm-dd'),to_date('"+ytD+"','yyyy-mm-dd'),to_date('"+tvD+"','yyyy-mm-dd'),to_date('"+bsD+"','yyyy-mm-dd'),'"+rem+"')",Connection);
  Connection.Open();
  Command.ExecuteNonQuery();
  Connection.Close();
}
非常感谢各位高人的指点!