关于VS.NET的OracleClient类库的两个大BUG,没想到微软支持ORACLE这么差!!!!
第一个:
我在用Asp.NET(C#)写操作Oracle数据库的程序时,如果用OracleClient的时候就会出现一个很奇怪的问题,那就是不管我是用DataSet或是OracleDataReader读出一个表中的数据时,只要有记录在同一字段的时候有重复的情况下,我在DataGird中就看到在第一条记录的时候,想同内容字段的值是完整的,可是如果第二条记录就会发现比前一条相同字段记录少一半。有时有很多一样的时候,一半的后面还有一些随机的字符,可是用oleDB就没有这个问题,感觉这是VS.NET的BUG。情况如下:
id name sex birth
1 xxxxxxxx M 19990303
2 xxxx M 1999
3 xxxxC:| M 1999k;k
就如同上面的样子一样,用oleDB用就可以显示正常。大家有没有这种情况,可以试试看。
第二个:
我发现当操作存储过程的时候,出现问题了。我的存储过程如下:
create or replace procedure gettaskid(taskid out varchar2,tasktype in varchar2) is
v_maxtaskid varchar2(14);
v_currentdate varchar2(8);
begin
select to_char(sysdate,'yyyymmdd') into v_currentdate from dual;
select max(task_id) into v_maxtaskid from d_ent_task where task_type = tasktype and to_char(task_date,'yyyymmdd') = v_currentdate;
if v_maxtaskid is null then
taskid := v_currentdate||'000001';
else
taskid := to_char(to_number(v_maxtaskid) + 1);
end if;
end gettaskid;
功能就是得出一个序号。用以下代码出错怎么也没有用,得出来的值还是上面存储过程if中的值,不会自己加1。
public string ExecProc(string myType)
{
string temp="";
conn=DBConnect.GetConnection();
cmd=conn.CreateCommand();
cmd.Connection=conn;
cmd.CommandText="gettaskid";
cmd.CommandType=System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add("taskid",OracleType.VarChar,14);
cmd.Parameters["taskid"].Direction=ParameterDirection.Output;
cmd.Parameters.Add("tasktype",OracleType.VarChar,2);
cmd.Parameters["tasktype"].Direction=ParameterDirection.Input;
cmd.Parameters["tasktype"].Value="04";
conn.Open();
cmd.ExecuteNonQuery();
temp=(string)cmd.Parameters["taskid"].Value;
conn.Close();
return temp;
}
如果换成OleDb来做就能得出加1后的值。
唉~~~~没想到微软竟对Oracle支持的这么差。