开发oracle+c#程序小心得,与大家分享

来源:互联网 发布:csgo优化调节画面设置 编辑:程序博客网 时间:2024/04/28 22:18

近日,本人开发了信息上报系统,期间属于二把刀,遇到许多问题不知如何是好,最终还是摸着石头过河,有的靠开发delphi程序的经验蒙,有的靠"强大的意识流"~~~(狂鄙视,这句是我那个倒霉师侄最爱吹嘘他自己星际水平高的一句了)实际是靠web浏览大家的文章.终于按时开发完成了. 在此对好好在互联网上无私提供信息的版主表示赞赏!! 对不懂装懂胡写乱写,抄袭别人的版主表示强烈鄙视!按张博的话讲,真该给b一个大boliu!   好了 言归正传,下面把我遇到的十来个问题给大家共享一下,希望大家批评指正:

 

 (1): 服务器上如果客户端没有安装frameworks,则不能运行 

   MessageBox.Show("您没有输入填报人 填报时间 文档号 企业名称,请填写这些内容"); 

    可以将其改为:         Response.Write("<script language='JavaScript'> alert('您没有输入填报人 填报时间 文档号 企业名称,请填写这些内容');</script>");

 (2):提交数据到access不能成功,报:操作必须使用一个可更新的查询 此种情况是access数据库的访问权限问题,解决办法: 远程桌面上去,到数据库的文件夹,右键点击该文件夹,增加该文件夹对everyone的读写权限.

    (3):出现了oracle的dataaccess 同时存在于@@ 和@@的错误,通过查找web,web都提示是aspx页有引用同一个cs文件造成的,查看一遍,发现没有,又有人说是webconfing里面设置问题,发现 <assemblies>        <add assembly="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>        <add assembly="System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>        <add assembly="Oracle.DataAccess, Version=10.1.0.400, Culture=neutral, PublicKeyToken=89B483F429C47342"/>      </assemblies>    这几句,并且version肯定是低的,将这几句移除,一切正常.       

 

   (4).开发.net程序datagrid gridview 动态添加数据集参数 连接A标签.

datagrid: 

<asp:TemplateColumn   HeaderText="短信催办">             <ItemTemplate>               <a   target=_blank href='sm.aspx?id=<%# DataBinder.Eval(Container.DataItem,"短信")%>'<>短信催办</a>        </ItemTemplate>        

gridview:   

     <asp:TemplateField><ItemTemplate>  <a   href='../comnapp/ShowDoc.aspx?type=1&id=<%# DataBinder.Eval(Container.DataItem,"flow_id")%>&pname=<%# Server.UrlEncode(DataBinder.Eval(Container.DataItem,"上报人").ToString())%>&cname=<%# Server.UrlEncode(DataBinder.Eval(Container.DataItem,"上报公司").ToString())%> '<>查看</a></ItemTemplate></asp:TemplateField>

 然后在这个控件的PageIndexChanged事件里增加: 

this.ImageDataGrid.CurrentPageIndex = e.NewPageIndex;       

  DataBind();

(5) 传递中文参数问题:      

  <asp:TemplateField><ItemTemplate>

  <a   href='../comnapp/ShowDoc.aspx?type=1&id=<%# DataBinder.Eval(Container.DataItem,"flow_id")%>&pname=<%# Server.UrlEncode(DataBinder.Eval(Container.DataItem,"上报人").ToString())%>&cname=<%# Server.UrlEncode(DataBinder.Eval(Container.DataItem,"上报公司").ToString())%> '<>查看</a></ItemTemplate></asp:TemplateField>

 

发送方必须用<%# Server.UrlEncode(DataBinder.Eval(Container.DataItem,"上报人").ToString())%>

接收方必须用:     tman.Value = Server.UrlDecode(Request.QueryString["pname"]);

 

(6) 至于clob的问题,并不是像某些论坛说的那样,必须用stream 和byte[],因为我们只是存字符串,因而存的时候:  OracleParameter paramrem = new OracleParameter("rem", OracleDbType.Clob);            paramrem.Value = tx2.Text;//tx2是一个textarea <asp:TextBox   ID="tx2"   runat="server"  Height="133px"  TextMode="MultiLine"></asp:TextBox>                        paramrem.Direction = ParameterDirection.Input; cmd.Parameters.Add(paramrem);

而取的时候:       tx1.Text = odr.GetOracleString(2).ToString();      

          tx2.Text = odr.GetOracleString(3).ToString(); 即可,并不需要什么odr.getoracleclob(2); 

   (7) 不要惊奇于单击按钮结果会重走一遍page_load,  加上  if (Page.IsPostBack) return; 限制即可; 

 

  (8) 开发时可先做demo,然后将html拷贝到aspx文件(当然,第一句保留),c#要访问的控件可以右键改为  作为服务器端控件即可,别忘了在这个html的body后包上<form runat="server"></form> 

 

 (9)dropdlist的SelectedIndexChanged事件可以当作delphi的dblc控件的onclick事件,但是要  这个dropdownlist控件 启用autoposback; 

 

  (10)前台用的多选人的列表,可以用CheckBoxList捆绑sqlsource实现,  其值可以进行for循环成一个string:     //生成传到后台处理的负责办理人员的字符串    protected string asemblyuser()    {        int i;     

   string s = "";   

     for (i = 0; i <= cb1.Items.Count - 1; i++)    

    {            if (cb1.Items[i].Selected)            {      

          if (s == "") s += cb1.Items[i].Value;           

     else s += "," + cb1.Items[i].Value;            }        }     

   return s;         

   最后后台处理:    后台需要建立:   

CREATE OR REPLACE TYPE y_nt_number is table of NUMBER;       

 

     create or replace function f_in_number(p_in varchar2) return y_nt_number deterministic is p_out  y_nt_number; i      binary_integer := 0; pt_old binary_integer := 0;begin  if p_in is null then  p_out := y_nt_number(null);  goto returnout; end if;  p_out := y_nt_number(0); for pt in 1 .. (length(p_in)) loop  if substr(p_in, pt, 1) != ',' then   goto endloop;  end if;  if (i <> 0) then   p_out.extend;  end if;  i := i + 1;  p_out(i) := to_number(substrb(p_in, pt_old + 1, pt - pt_old - 1), '9999999999');  pt_old := pt;  <<endloop>>  null; end loop;  if (i = 0) then  p_out(i + 1) := to_number(substrb(p_in, pt_old + 1, length(p_in) - pt_old), '9999999999'); else  p_out.extend;  p_out(i + 1) := to_number(substrb(p_in, pt_old + 1, length(p_in) - pt_old), '9999999999'); end if; <<returnout>> return p_out;end;

 

具体应用实例:  参数: inlist  in varchar2, 

for i in (select * from table(cast(f_in_number(inlist) as y_nt_number))) loop   insert into info_relation_t (info_id, user_id, sts) values (inid, i.column_value, 'A');  end loop; 

    (11)梅花雨控件很好用,但要用utf8格式保存的版本才行,否则会报错; 

 

    (12)弹出窗口显示提示信息可以用如下写法:    Page.RegisterStartupScript("mydialog", "<script language='javascript'>alert('用户名或密码不正确!')</script>");