关于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支持的这么差。
我在用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支持的这么差。
...全文
相关推荐
百分百解决System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本.rar
完全百分百解决“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本”这个问题 详细操作请看压缩包TXT文档说明……
System.Data.OracleClient.rar
System.Data.OracleClient.dll过时报错[Obsolete],此类不能被继承
System.Data.OracleClient.dll
oracle连接资源,在VS.NET中,进入菜单“项目”——>添加引用——>.NET选项卡,选取System.Data.OracleClient.dll。另:.net4以上.开始不支持ORACLE.所以如果不是必须,你可以把你的项目----程序属性中的目标框架调整到3.5然后在解决方案资源管理器里面右键程序,添加引用.选.NET.中的System.Data.OracleClient
.NET连接Oracle数据库.docx
.NET连接Oracle数据库.docx
DbHelperOra.cs OraDBHelper.cs Oracle访问数据库
Oracle VS2010 数据访问基础类 DbHelperOra.cs OraDBHelper.cs Oracle访问数据库


