none
如果用字符串拼接更新数据库就可以,如果用参数就不行,弄了一天了没想清楚为什么,代码如下: RRS feed

  • 问题

  •  using (OracleConnection conn = new OracleConnection(strConn))
                    {
                        string str_Cmd_a = "update gzrz set dbfzr='" + txt_Dbfzr.Text.ToString() + "',sn='" + str_Id + "',context='" + str_Nr + "',name_fuze='" + str_Fz + "',name_gongzuo='" + str_Gz + "',time='" + str_Gzsj + "',jishi='" + txt_Jishi.Text.ToString() + "',weixian='" + txt_Weixian.Text.ToString() + "',cuoshi='" + txt_Cuoshi.Text.ToString() + "',zongjie='" + txt_Zongjie.Text.ToString() + "',xiuban='" + txt_Xiuban.Text.ToString() + "',sjyls_xh='" + txt_Sjyls_Xh.Text.ToString() + "' where id=" + int_Zhujian;
                        string str_Cmd = "update gzrz set dbfzr=:dbfzr,sn=:sn,context=:context,name_fuze=:name_fuze,name_gongzuo=:name_gongzuo,time=:time,jishi=:jishi,weixian=:weixian,cuoshi=:cuoshi,zongjie=:zongjie,xiuban=:xiuban,sjyls_xh=:sjyls_xh where id=" + int_Zhujian;
                        conn.Open();
                        using (OracleCommand cmd = new OracleCommand(str_Cmd, conn))
                        {
                            cmd.Parameters.AddWithValue(":dbfzr", txt_Dbfzr.Text.ToString());//当班负责人签字
                            cmd.Parameters.AddWithValue(":sn", str_Id);//日志编号
                            cmd.Parameters.AddWithValue(":context", str_Nr);//日志内容
                            cmd.Parameters.AddWithValue(":name_fuze", str_Fz);//负责人
                            cmd.Parameters.AddWithValue(":name_gongzuo", str_Gz);//工作人员
                            cmd.Parameters.AddWithValue(":time", str_Gzsj);//工时
                            cmd.Parameters.AddWithValue(":jishi", txt_Jishi.Text.ToString());//记事栏
                            cmd.Parameters.AddWithValue(":sjyls_xh", txt_Sjyls_Xh.Text.ToString());//三讲一落实序号
                            cmd.Parameters.AddWithValue(":weixian", txt_Weixian.Text.ToString());//主要危险点
                            cmd.Parameters.AddWithValue(":cuoshi", txt_Cuoshi.Text.ToString());//根据主要危险点采取的措施
                            cmd.Parameters.AddWithValue(":zongjie", txt_Zongjie.Text.ToString());//总结
                            cmd.Parameters.AddWithValue(":xiuban", txt_Xiuban.Text.ToString());//休班加班等情况
                            cmd.Parameters.AddWithValue(":lrr", lb_Lrr.Text.ToString());//录入人
                            
                            if (cmd.ExecuteNonQuery() > 0)
                            {
                                ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('添加成功!');location.href='query.aspx'</script>");
                            }
                        }
                    }
    如上图所示,如果用str_Cmd_a(字符串拼接)就没问题
    如果用str_Cmd(参数)就会报“ORA-01036: 非法的变量名/编号”错误

    今天光搞这个问题了,弄得我巨郁闷,特来求教高手。
    2009年6月1日 14:16

答案

  • cmd.Parameters.AddWithValue("context", str_Nr);//日志内容
    声明参数不对
    cmd.Parameters.AddWithValue(":context", str_Nr);//日志内容
    ---------------------------------------------------------------------
    最不要拼字符串,要拼也要拼成带参数的字符串

    知识改变命运,奋斗成就人生!
    • 已标记为答案 杜宏宇 2009年6月3日 5:42
    2009年6月2日 1:35
    版主
  • 蒋版主当时看到我贴的时候可能情绪过于激动,把这个帖子从asp.net中移了出来,我当时不是因为生气他移我的帖子,而是生气他教训的话,但是很快又恢复了平静,毕竟在单位受气受多了,感觉论坛里的各位还是挺热心的,都是我的老师,老师说学生一两句话是应该的,何况说的不无道理。从根本上都是为了解决我问题的。

    但我认为做技术应该和做人一样,你可以叫“圆滑”,也可以叫“变通”。如果规定太死了恐怕就没人愿意来微软论坛讨论东西了。

    大家都是搞技术的,出来混都不容易。都是为了吃口饭,小弟的帖子让两位如此不高兴,深感歉意。谢谢韦恩卑鄙 和 蒋老师。

    最近领导让把原有系统数据库由sql改为oracle,其实我自己挺喜欢sql的,简单,但是领导说了,不得不做,以前对oracle一窍不通,因为我把存储过程以cmd.parameter.addwithvalue的形式写在了程序中,可以说与asp.net有关,因为cmd.parameters.value这个东西就是asp.net提供的。也可以说它与asp.net无关,因为sql语句参数我用了 :,而不是微软的 @ 。

    呵呵,不多说了,就此结贴吧,希望搞技术的永远团结,不让那些局外的领导者看笑话。也希望微软越走越好,关键是给与我们工作以方便,还有,不要老以版权吓人,吓得我们公司从操作系统到各种办公软件都正版化了,呵呵。。

    asp.net板块是我比较喜欢的一个板块,看帖子数量就知道,还有,我以前的所有问题都在这个板块中得到了解决。我以后还会常来,谢谢大家的支持。

    • 已标记为答案 杜宏宇 2009年6月3日 6:06
    2009年6月3日 6:04

全部回复

  •  using (OracleConnection conn = new OracleConnection(strConn))
    
                    {
    
                        string str_Cmd_a = "update gzrz set dbfzr='" + txt_Dbfzr.Text.ToString() + "',sn='" + str_Id + "',context='" + str_Nr + "',name_fuze='" + str_Fz + "',name_gongzuo='" + str_Gz + "',time='" + str_Gzsj + "',jishi='" + txt_Jishi.Text.ToString() + "',weixian='" + txt_Weixian.Text.ToString() + "',cuoshi='" + txt_Cuoshi.Text.ToString() + "',zongjie='" + txt_Zongjie.Text.ToString() + "',xiuban='" + txt_Xiuban.Text.ToString() + "',sjyls_xh='" + txt_Sjyls_Xh.Text.ToString() + "' where id=" + int_Zhujian;
    
                        string str_Cmd = "update gzrz set dbfzr=:dbfzr,sn=:sn,context=:context,name_fuze=:name_fuze,name_gongzuo=:name_gongzuo,time=:time,jishi=:jishi,weixian=:weixian,cuoshi=:cuoshi,zongjie=:zongjie,xiuban=:xiuban,sjyls_xh=:sjyls_xh where id=" + int_Zhujian;
    
                        conn.Open();
    
                        using (OracleCommand cmd = new OracleCommand(str_Cmd, conn))
    
                        {
    
                            cmd.Parameters.AddWithValue(":dbfzr", txt_Dbfzr.Text.ToString());//当班负责人签字
    
                            cmd.Parameters.AddWithValue(":sn", str_Id);//日志编号
    
                            cmd.Parameters.AddWithValue(":context", str_Nr);//日志内容
    
                            cmd.Parameters.AddWithValue(":name_fuze", str_Fz);//负责人
    
                            cmd.Parameters.AddWithValue(":name_gongzuo", str_Gz);//工作人员
    
                            cmd.Parameters.AddWithValue(":time", str_Gzsj);//工时
    
                            cmd.Parameters.AddWithValue(":jishi", txt_Jishi.Text.ToString());//记事栏
    
                            cmd.Parameters.AddWithValue(":sjyls_xh", txt_Sjyls_Xh.Text.ToString());//三讲一落实序号
    
                            cmd.Parameters.AddWithValue(":weixian", txt_Weixian.Text.ToString());//主要危险点
    
                            cmd.Parameters.AddWithValue(":cuoshi", txt_Cuoshi.Text.ToString());//根据主要危险点采取的措施
    
                            cmd.Parameters.AddWithValue(":zongjie", txt_Zongjie.Text.ToString());//总结
    
                            cmd.Parameters.AddWithValue(":xiuban", txt_Xiuban.Text.ToString());//休班加班等情况
    
                            cmd.Parameters.AddWithValue(":lrr", lb_Lrr.Text.ToString());//录入人
    
                            
    
                            if (cmd.ExecuteNonQuery() > 0)
    
                            {
    
                                ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('添加成功!');location.href='query.aspx'</script>");
    
                            }
    
                        }
    
                    }
    
    
    如上图所示,如果用str_Cmd_a(字符串拼接)就没问题
    如果用str_Cmd(参数)就会报“ORA-01036: 非法的变量名/编号”错误

    今天光搞这个问题了,弄得我巨郁闷,特来求教高手。

    cmd.Parameters.AddWithValue(":lrr", lb_Lrr.Text.ToString());//录入人
    这个参数貌似是多的
    帮你找到方法了:sql语句中的参数要加:但在添加参数时参数名字前面不要加“:”,而应该直接写字符串类型的参数名字
    也就是说想这种 cmd.Parameters.AddWithValue(":zongjie", txt_Zongjie.Text.ToString());应该改为 cmd.Parameters.AddWithValue("zongjie", txt_Zongjie.Text.ToString());//总结
    努力着就不会放弃!.net技术交流群 33083877http://hi.baidu.com/1987raymond
    2009年6月1日 14:29
    版主
  • 还是不行,不是这里的问题。我在insert的时候全部用的 cmd.Parameters.AddWithValue(":zongjie", txt_Zongjie.Text.ToString());就没问题,以下是全部代码,希望有高手能指点。
     protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
            {
                int int_Zhujian = int.Parse(Request.QueryString[0]);
                string id_User = Session["id"].ToString();
                if (e.CommandName == "edit")
                {
                    RepeaterItem ri = e.Item;
                    TextBox txt_Dbfzr = ri.FindControl("txt_Dbfzr") as TextBox;//当班负责人
                    TextBox txt_Sjyls_Xh = ri.FindControl("txt_Sjyls_Xh") as TextBox;//三讲一落实序号
                    TextBox txt_Weixian = ri.FindControl("txt_Weixian") as TextBox;//危险点
                    TextBox txt_Cuoshi = ri.FindControl("txt_Cuoshi") as TextBox;//措施
                    TextBox txt_Zongjie = ri.FindControl("txt_Zongjie") as TextBox;//总结
                    TextBox txt_Jishi = ri.FindControl("txt_Jishi") as TextBox;//记事栏
                    TextBox txt_Xiuban = ri.FindControl("txt_Xiuban") as TextBox;//休班加班情况
                    Label lb_Lrr = ri.FindControl("lb_Lrr") as Label;//录入人
                    string str_Id = ""; string str_Nr = ""; string str_Fz = ""; string str_Gz = ""; string str_Gzsj = "";
                    for (int i = 1; i < 19; i++)
                    {
                        TextBox txt_No = ri.FindControl("no" + i) as TextBox;
                        TextBox txt_Context = ri.FindControl("context" + i) as TextBox;
                        TextBox txt_Fz = ri.FindControl("name_fuze" + i) as TextBox;
                        TextBox txt_Gz = ri.FindControl("name_gongzuo" + i) as TextBox;
                        TextBox txt_Sj = ri.FindControl("time" + i) as TextBox;
                        str_Id = str_Id + txt_No.Text.ToString() + "\r\n";//序号
                        str_Nr = str_Nr + txt_Context.Text.ToString() + "\r\n";//内容
                        str_Fz = str_Fz + txt_Fz.Text.ToString() + "\r\n";//负责人
                        str_Gz = str_Gz + txt_Gz.Text.ToString() + "\r\n";//工作人员
                        str_Gzsj = str_Gzsj + txt_Sj.Text.ToString() + "\r\n";//工作时间
                    }
                    using (OracleConnection conn = new OracleConnection(strConn))
                    {
                        string str_Cmd_a = "update gzrz set dbfzr='" + txt_Dbfzr.Text.ToString() + "',sn='" + str_Id + "',context='" + str_Nr + "',name_fuze='" + str_Fz + "',name_gongzuo='" + str_Gz + "',time='" + str_Gzsj + "',jishi='" + txt_Jishi.Text.ToString() + "',weixian='" + txt_Weixian.Text.ToString() + "',cuoshi='" + txt_Cuoshi.Text.ToString() + "',zongjie='" + txt_Zongjie.Text.ToString() + "',xiuban='" + txt_Xiuban.Text.ToString() + "',sjyls_xh='" + txt_Sjyls_Xh.Text.ToString() + "',lrr='"+lb_Lrr.Text.ToString()+"' where id=" + int_Zhujian;
                        string str_Cmd = "update gzrz set dbfzr=:dbfzr,sn=:sn,context=:context,name_fuze=:name_fuze,name_gongzuo=:name_gongzuo,time=:time,jishi=:jishi,weixian=:weixian,cuoshi=:cuoshi,zongjie=:zongjie,xiuban=:xiuban,sjyls_xh=:sjyls_xh,lrr=:lrr where id=" + int_Zhujian;
                        conn.Open();
                        using (OracleCommand cmd = new OracleCommand(str_Cmd, conn))
                        {
                            cmd.Parameters.AddWithValue(":dbfzr", txt_Dbfzr.Text.ToString());//当班负责人签字
                            cmd.Parameters.AddWithValue(":sn", str_Id);//日志编号
                            cmd.Parameters.AddWithValue("context", str_Nr);//日志内容
                            cmd.Parameters.AddWithValue(":name_fuze", str_Fz);//负责人
                            cmd.Parameters.AddWithValue(":name_gongzuo", str_Gz);//工作人员
                            cmd.Parameters.AddWithValue(":time", str_Gzsj);//工时
                            cmd.Parameters.AddWithValue(":jishi", txt_Jishi.Text.ToString());//记事栏
                            cmd.Parameters.AddWithValue(":sjyls_xh", txt_Sjyls_Xh.Text.ToString());//三讲一落实序号
                            cmd.Parameters.AddWithValue(":weixian", txt_Weixian.Text.ToString());//主要危险点
                            cmd.Parameters.AddWithValue(":cuoshi", txt_Cuoshi.Text.ToString());//根据主要危险点采取的措施
                            cmd.Parameters.AddWithValue(":zongjie", txt_Zongjie.Text.ToString());//总结
                            cmd.Parameters.AddWithValue(":xiuban", txt_Xiuban.Text.ToString());//休班加班等情况
                            cmd.Parameters.AddWithValue(":lrr", lb_Lrr.Text.ToString());//录入人
                            
    
                            if (cmd.ExecuteNonQuery() > 0)
                            {
                                ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('添加成功!');location.href='query.aspx'</script>");
                            }
                        }
                    }
                }
            }
    2009年6月1日 15:30
  • ASP.Net类库不支持Oracle,你必须引用ADO.Net的ODBC/OLDDB数据提供者或者或者Oracle自己的数据提供者才可能访问Oracle数据库,所以你应该发在ADO.Net或者Oracle自己的数据提供者论坛。

    在提问之前想想你需要的是哪方面的帮助,而不是盲目的把开发中碰到的所有问题发在同一个论坛。

    MSMVP VC++
    2009年6月1日 15:49
    版主
  • cmd.Parameters.AddWithValue("context", str_Nr);//日志内容
    声明参数不对
    cmd.Parameters.AddWithValue(":context", str_Nr);//日志内容
    ---------------------------------------------------------------------
    最不要拼字符串,要拼也要拼成带参数的字符串

    知识改变命运,奋斗成就人生!
    • 已标记为答案 杜宏宇 2009年6月3日 5:42
    2009年6月2日 1:35
    版主
  • ASP.Net类库不支持Oracle,你必须引用ADO.Net的ODBC/OLDDB数据提供者或者或者Oracle自己的数据提供者才可能访问Oracle数据库,所以你应该发在ADO.Net或者Oracle自己的数据提供者论坛。

    在提问之前想想你需要的是哪方面的帮助,而不是盲目的把开发中碰到的所有问题发在同一个论坛。

    MSMVP VC++

    orz ..  一直支持的好哇。。。。 OracleCommand 类型都在代码里面了,,,,


    紫柔版主的头像真叫萌得一个不行啊。。。。
    2009年6月2日 5:05
  • 如果你说System.Web支持OracleCommand类,把System.Data从项目中去掉试试看。
    用户自己添加的代码支持不能算asp.net类库的支持。

    MSMVP VC++
    2009年6月2日 14:20
    版主

  • 你要觉得 system.web 以外都不是asp.net 成员 为什么不把system去掉  把system.xml去掉呢?





    紫柔版主的头像真叫萌得一个不行啊。。。。
    2009年6月3日 1:48
  • 不是觉得,是常识。如果你在asp.net程序中不引用System.Data.dll就无法支持OracleCommand类的话,对OracleCommand类的支持就不在asp.net中。
    注意Visual Studio的项目模板默认会引用多个类库,这并不代表项目模板中引用的一个类库是另一个类库的一部分。他们之间的关系是平行的,不是从属关系。

    MSMVP VC++
    2009年6月3日 2:40
    版主
  • 请把您的回帖修改成

    ASP.Net类库不支持任何数据库

    而且 oracle  在.net 有单独的 .net data provider for oracle,   根本不需要OLEDB 和ODBC provider      这也是某种程度的常识

      好心提醒您得到的是"没有常识"的评价的话, 也许从开始就不应该对您有所谦让才对
    2009年6月3日 3:32
  • 不是觉得,是常识。如果你在asp.net程序中不引用System.Data.dll就无法支持OracleCommand类的话,对OracleCommand类的支持就不在asp.net中。
    注意Visual Studio的项目模板默认会引用多个类库,这并不代表项目模板中引用的一个类库是另一个类库的一部分。他们之间的关系是平行的,不是从属关系。

    MSMVP VC++

    MSDN 是服务开发者的论坛
    开发者有很多方面  你不能让每一个开发者都具有整体的清晰脉络  他只知道自己在做什么的时候遇到了问题 
    如果真的达到知道到哪里问的程度 或许问题根本就不需要问专家了

    也许作为问题归档  我们需要把问题转移到各个区域, 但是这个步骤绝对不是在问题的到答案之前  更不应该教训用户应该在哪里发表帖子!

    首先我们是服务用户的  其次才是管理信息
    紫柔版主的头像真叫萌得一个不行啊。。。。
    2009年6月3日 3:38
  • 一个新用户 在还不知道“我的主题”功能的时候 辛辛苦苦在aspnet 版码好了字  第二天来看发现不在自己发的版里了   该有多无助
    一个初学者 在问了问题还没有得到解答的时候  先被人讲了一堆大道理  该是什么心情?

    实在忍不住了  说得有点多


    紫柔版主的头像真叫萌得一个不行啊。。。。
    2009年6月3日 3:44
  • http://community.csdn.net/IndexPage/SmartQuestion.aspx#forum
    建立一个社区不是回答的问题越多越好,而是让用户尽快能搜索到答案。你的意见是让那些走错路的人在错误的路上继续走而且占用别人的道?

    MSMVP VC++
    2009年6月3日 3:47
    版主
  • 也许作为问题归档  我们需要把问题转移到各个区域, 但是这个步骤绝对不是在问题的到答案之前  更不应该教训用户应该在哪里发表帖子!

    说得够清楚了吧


    常年BS csdn的人非常多  我就是一个


    紫柔版主的头像真叫萌得一个不行啊。。。。
    2009年6月3日 3:53
  • 我提醒这个用户是因为这个用户和你一样分不清仔细挑选论坛的重要性,经常把帖子发到和需要帮助方面无关的论坛。这不光会浪费提问者的时间在回复准确率较低的论坛,也会浪费巡逻论坛的志愿者的时间在阅读和他们感兴趣的技术无关的帖子上,更会降低搜索的准确度,浪费以后碰见同样问题的人搜索答案的时间。

    指引用户到正确的论坛是版主职责的一部分。不要误导用户,使他们误认为在错误的论坛也可以得到同样的帮助。滥用论坛尽管有时会得到更快的回答,但是抢占了其他用户的资源,同时得到的帮助的准确率也不高。如果更多用户被误导到错误的论坛,他们损失的比单个用户得到的帮助更大。


    MSMVP VC++
    2009年6月3日 4:08
    版主
  • 我提醒这个用户是因为这个用户和你一样分不清仔细挑选论坛的重要性,经常把帖子发到和需要帮助方面无关的论坛。这不光会浪费提问者的时间在回复准确率较低的论坛,也会浪费巡逻论坛的志愿者的时间在阅读和他们感兴趣的技术无关的帖子上,更会降低搜索的准确度,浪费以后碰见同样问题的人搜索答案的时间。

    指引用户到正确的论坛是版主职责的一部分。不要误导用户,使他们误认为在错误的论坛也可以得到同样的帮助。



    MSMVP VC++

    麻烦您履行以下 c#版的职责

    http://social.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/db1f3727-3421-481a-bc0b-e1ecae3390cd
    http://social.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/c6cd7d94-e5bb-4070-8034-9f4787e787b9
    http://social.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/8ae63b3d-7b29-4b19-9346-c5fe6b5e6113
    http://social.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/f9130e4a-29b1-45d3-af07-ee313bb10ee7
    http://social.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/c86741de-735d-4f10-8937-08a0dc59f991

    这才头两页 除恶务尽
    按照这个逻辑 c#版应该和 WF版并列幽灵版才对 vb还有vb6撑着 c#不瘦身到vb版80%的厚度实在不够和谐

    就此打住 我也不愿意再多说 “转错版”的废话了
    紫柔版主的头像真叫萌得一个不行啊。。。。
    2009年6月3日 4:15
  • 举个例子,你想为每个人免费提供出租车服务,所以在公共汽车站等客人,免费公共汽车服务比你的稳定,但是你似乎认为好事要做到底,就算用户来错了车站你也把人送到,而且是送到家而不是送到车站,结果公共汽车站的人越来越多,很多人都不是冲公共汽车而是冲你的免费出租车服务来的。公共汽车司机发现坐正确公共汽车的人越来越少,就干脆减少公共汽车的发车频率,来对车站的人发现本来车站就挤,现在车又少了,就干脆不等了。结果就是车站上一大堆来错了车站的人,而你不是总能熟悉每个人的目的地,绕圈子是常有的事,不光浪费你的汽油,也浪费了坐车的人的时间。其实进错了车站的话,正确的公共汽车站问问人就可以找到,也有很多乘客在别人来错车站指出正确的路线,这一切本来可以避免的。



    MSMVP VC++
    • 已标记为答案 杜宏宇 2009年6月3日 6:05
    • 取消答案标记 杜宏宇 2009年6月3日 6:05
    2009年6月3日 4:51
    版主
  • 蒋版主当时看到我贴的时候可能情绪过于激动,把这个帖子从asp.net中移了出来,我当时不是因为生气他移我的帖子,而是生气他教训的话,但是很快又恢复了平静,毕竟在单位受气受多了,感觉论坛里的各位还是挺热心的,都是我的老师,老师说学生一两句话是应该的,何况说的不无道理。从根本上都是为了解决我问题的。

    但我认为做技术应该和做人一样,你可以叫“圆滑”,也可以叫“变通”。如果规定太死了恐怕就没人愿意来微软论坛讨论东西了。

    大家都是搞技术的,出来混都不容易。都是为了吃口饭,小弟的帖子让两位如此不高兴,深感歉意。谢谢韦恩卑鄙 和 蒋老师。

    最近领导让把原有系统数据库由sql改为oracle,其实我自己挺喜欢sql的,简单,但是领导说了,不得不做,以前对oracle一窍不通,因为我把存储过程以cmd.parameter.addwithvalue的形式写在了程序中,可以说与asp.net有关,因为cmd.parameters.value这个东西就是asp.net提供的。也可以说它与asp.net无关,因为sql语句参数我用了 :,而不是微软的 @ 。

    呵呵,不多说了,就此结贴吧,希望搞技术的永远团结,不让那些局外的领导者看笑话。也希望微软越走越好,关键是给与我们工作以方便,还有,不要老以版权吓人,吓得我们公司从操作系统到各种办公软件都正版化了,呵呵。。

    asp.net板块是我比较喜欢的一个板块,看帖子数量就知道,还有,我以前的所有问题都在这个板块中得到了解决。我以后还会常来,谢谢大家的支持。

    • 已标记为答案 杜宏宇 2009年6月3日 6:06
    2009年6月3日 6:04