解决方案 »
- 两个一维数组减去一个固定值3,得到的数组怎么保存?
- 取当前日期早一个月的日期???
- 關於生產排程的問題,我已經做一部分功能,請教該如何完善。
- 我用SplitContainer分割窗体,改变大小后,里面的控件的dock不会随之而变,请问为什么,谢谢!
- FTP客户端中执行服务器文件的命令什么?
- 高分求用C#做客户端,C++做服务端的网络编程实例(求源码)
- 求功能齐全的C# DBHelper Class
- DataGridView 绑定List 后不能排序的问题
- 如何用C# 来比较EXCEL表中两列数据的差异?
- 新人求助,关于C#获取路径问题
- WPF加载样式文件
- 提问啊!我在一个页面里有两个按钮,如何控制回车后的按钮
另外没必要使用反射,而且反射也会导致部分功能无法使用,例如这个BindByName在DbCommand里面是不存在的。
如果要解决Oracle 版本号不一致的问题,很容易,修改配置文件的运行时版本号兼容即可。
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess"
publicKeyToken="89B483F429C47342"
culture="neutral" />
<bindingRedirect
oldVersion="2.112.2.0"
newVersion="2.112.1.0"/>
</dependentAssembly>
</assemblyBinding>
<Thread_UseAllCpuGroups enabled="true"/>
<GCCpuGroup enabled="true"/>
<gcServer enabled="true"/>
</runtime>
这是用的11G的客户端,由于10G客户端很多问题,因此不建议使用,而且高版本客户端兼容低版本服务端。
newVersion="2.112.1.0"是11g的64位版本号,而oldVersion="2.112.2.0"是11g的32位版本号,这里oldVersion就用开发用的版本号,而newVersion则使用客户安装的版本号,如果不清楚版本号,可以在注册表里查看,例如使用安装程序在安装时,检测注册表HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\2.112.2.0分支,最后那个就是版本号,动态产生程序配置文件。
因为 oracle x64 和 x86 客户的服务器配置不一定还。就用反射了。
然后我吧 OracleComand 给 DbComand了,因为我那个数据库访问器 是多数据库兼容的,所以就有 基础Command类了,明天试试你那个 runtime config 如果可以,那就不用反射了。省点事还。
我当初用 config 来着,因为不起作用,我就用反射了。
就 refcursor 在用 datareader读的时候有问题。
其他反射都做了。
parameters[0].GetType().GetProperty("OracleDbType").SetValue(parameters[0], Enum.Parse(oracleDbType,"RefCursor"), null);
/// 方法描述:重写父类创建Command对象的方法
/// 异常:ArchStar.Framework.Exceptions.DbHelperException
/// </summary>
/// <param name="dbConnection">数据库连接对象</param>
/// <param name="commandType">命令类型 默认:存储过程</param>
/// <param name="commandText">命令文本</param>
/// <param name="parameters">命令参数</param>
/// <returns>数据库命令对象</returns>
protected override DbCommand CreateDbCommand(DbConnection dbConnection, System.Data.CommandType commandType, StringBuilder commandText, params DbParameter[] parameters)
{
DbCommand cmd = null;
try
{
try
{
if (dbConnection.State != ConnectionState.Open)
dbConnection.Open();
}
catch (InvalidOperationException ex)
{
throw new DbHelperException(ex.Message, ex);
}
cmd = factory.CreateInstance<DbCommand>(ManifestConst.ORACLE_DATAACCESS_CLIENT_ORACLECOMMAND);
cmd.GetType().GetProperty("BindByName").SetValue(cmd, true, null);
using (cmd)
{
cmd.Connection = dbConnection;
cmd.CommandType = commandType;
cmd.CommandText = commandText.ToString();
cmd.CommandTimeout = this.CommandTimeout;
SetDbCommandParameters(cmd, parameters);
}
}
catch (DbException ex)
{
throw new DbHelperException(ex.Message, ex);
}
return cmd;
}
/// 方法描述:重写父类创建Command对象的方法
/// 异常:ArchStar.Framework.Exceptions.DbHelperException
/// </summary>
/// <param name="dbConnection">数据库连接对象</param>
/// <param name="commandType">命令类型 默认:存储过程</param>
/// <param name="commandText">命令文本</param>
/// <param name="parameters">命令参数</param>
/// <returns>数据库命令对象</returns>
protected override DbCommand CreateDbCommand(DbConnection dbConnection, System.Data.CommandType commandType, StringBuilder commandText, params DbParameter[] parameters)
{
DbCommand cmd = null;
try
{
try
{
if (dbConnection.State != ConnectionState.Open)
dbConnection.Open();
}
catch (InvalidOperationException ex)
{
throw new DbHelperException(ex.Message, ex);
}
cmd = factory.CreateInstance<DbCommand>(ManifestConst.ORACLE_DATAACCESS_CLIENT_ORACLECOMMAND);
using (cmd)
{
cmd.Connection = dbConnection;
cmd.CommandType = commandType;
cmd.CommandText = commandText.ToString();
cmd.CommandTimeout = this.CommandTimeout;
SetDbCommandParameters(cmd, parameters);
cmd.GetType().GetProperty("BindByName").SetValue(cmd, true, null);
}
}
catch (DbException ex)
{
throw new DbHelperException(ex.Message, ex);
}
return cmd;
}红色就是绑定的,先加参数已经加进去了。BindBodyName 也设置成 true了。
就是DataReader 还是那个问题。
就是DataReader时候出问题。
我用的 DataReader 也是基础的。
功能描述:公共分页存储过程
编写人:Joe
编写日期:2013年06月27日
版权:Copyright © Archstarcn
*/
CREATE OR REPLACE PACKAGE PACKAGE_COMMONPAGING IS
TYPE DATASET IS REF CURSOR;
PROCEDURE PROCEDURE_COMMONPAGING
(
RESULTS OUT DATASET,--返回的结果集合
TOTALRECORDCOUNT OUT INT,--总记录数
TOTALPAGECOUNT OUT INT, --总页数
PAGEINDEX IN INT,--页索引
PAGESIZE IN INT,--每页的数量
INPUTSQLSTRING IN VARCHAR2,--输入的SQL语句字符串
ORDERBY IN VARCHAR2--要排序的字段名。格式:{Field1 [SortMode(DESC | ASC)]......,n [SortMode(DESC | ASC)]}
);
END PACKAGE_COMMONPAGING;
/
这是包头的类型,
建议你参考下Dapper的处理方式。
提示:IDbCommand的CreateParameter方法可以直接创建参数,这部分完全可以不使用反射。
我换其他的方法调用测试的时候 他提示 所有参数未绑定。BindByName = true了
变量没有空也。
/// 数据库命令参数装载
/// </summary>
/// <param name="dbCommand">数据库命令对象</param>
/// <param name="parameters">数据库命令参数</param>
protected virtual void SetDbCommandParameters(IDbCommand dbCommand, params IDbDataParameter[] parameters)
{
if (dbCommand == null)
return;
if (parameters == null || parameters.Length == 0)
return;
foreach (var param in parameters)
dbCommand.Parameters.Add(param);
}参数在这里加的。
如果正常-->那就是返回类型不是int的,事实上你也无法指定精度,Oracle里面的number类型是非常大的数字,对应的数据类型用Int64都不为过,而且似乎默认是Decimal类型的。
注意:输出参数的数据类型和精度都很重要,对于String类型,必须设置其字符数,默认字符数为1.
就3个参数的一个删除语句还是无法对应。用如下代码
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
<bindingRedirect oldVersion="4.112.0.0-4.112.3.0" newVersion="2.112.1.0"/>
</dependentAssembly>
</assemblyBinding>根本就不起作用。
oldVersion是你Visual Studio里面添加的那个dll的版本号,编译后,exe程序肯定只认那个版本号,为了兼容其它版本号,才需要转换为newVersion,一般情况下,一个项目里面只可能用到一个版本号,除非你引用的其它dll也用到了但是版本号不同的Oracle.DataAccess.dll,完整的写法如下,你可以尝试<bindingRedirect节点多写一次,反正我没试过。
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess"
publicKeyToken="89B483F429C47342"
culture="neutral" />
<bindingRedirect
oldVersion="2.112.2.0"
newVersion="2.112.1.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>