在使用odp.net时,有的存储过程我们是希望有返回值的,这个例子中我们需要返回一个string类型的值,在oracle中定义了output参数,
在使用Dataset的可视化编辑后,生成了这样的代码:
代码
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Output" ParameterName="OV_SELECTEDNODEID" Precision="0" ProviderType="Varchar2" Scale="0" Size="32768" SourceColumn="" SourceColumnNullMapping="false" SourceVersion="Current" />
那么由tableAdatper生成的方法就会要求一个out string类型的参数,一切都很完美,编译通过,貌似很快就可以得到数据库的返回值了,
但是,这时候会有一个运行时报错:无法将类型为“Oracle.DataAccess.Types.OracleString”的对象强制转换为类型“System.String”。
那么你会想只好把DbType改为Object,但不幸的是ProviderType是联动的,也会自动变为Object,那么运行时就会报错“绑定的参数无效。”
解决办法就是:手动改DataSet.xsd文件,找到上面那个参数的代码,保持ProviderType类型和数据库匹配,手动将DBType改为Object,
然后在使用的时候这么写:
object obj;
ta.Insert(this.TableName, fatherNodeNumber, out obj, newNodeText, this.sysUser.Name);
newNodeNumber = obj.ToString();
ta.Insert(this.TableName, fatherNodeNumber, out obj, newNodeText, this.sysUser.Name);
newNodeNumber = obj.ToString();
这时候obj的参数类型就是object {Oracle.DataAccess.Types.OracleString},你可以拆箱后使用Value属性获取值,或者直接像我上面那样直接ToString() :)