C# 是否可以更改NHibernate公式绑定变量的格式?
我正在处理一个遗留的SQLBase数据库,并试图与NHibernate建立一个新项目 一个大问题是SQLBase希望SQL中的绑定变量的格式。格式必须明确C# 是否可以更改NHibernate公式绑定变量的格式?,c#,nhibernate,format,oledb,sqlbase,C#,Nhibernate,Format,Oledb,Sqlbase,我正在处理一个遗留的SQLBase数据库,并试图与NHibernate建立一个新项目 一个大问题是SQLBase希望SQL中的绑定变量的格式。格式必须明确 INSERT INTO ... VALUES (:1,:2,:3); SELECT ... FROM TABLE WHERE ID=:1 AND NAME=:2; 现在,NHibernate对绑定变量使用“:p0,:p1,…”格式,这在SQLBase中给出了一个“无效的程序绑定变量”SQL异常 问题是数字前的“p”,而且参数必须以0开头-
INSERT INTO ... VALUES (:1,:2,:3);
SELECT ... FROM TABLE WHERE ID=:1 AND NAME=:2;
现在,NHibernate对绑定变量使用“:p0,:p1,…”格式,这在SQLBase中给出了一个“无效的程序绑定变量”SQL异常
问题是数字前的“p”,而且参数必须以0开头-SQLBase必须具有以1开头的参数
是否有任何方法可以配置/更改NHibernate以删除绑定变量中的“p”,并从1而不是0开始?在我的类映射中,我可以使用sql insert、sql update和sql delete映射更改insert、update和delete参数的格式,但我发现更改SELECT参数的唯一方法是在映射中写入大量命名查询
显然,这不是首选的方式。有没有更好的方法来更改绑定变量的生成方式?我已经制作了自己的驱动程序(继承自OleDbDriver)和方言(继承自genericquatel),并做了一些更改,使SQLBase首先能够工作
我也试过设置
private static string ToParameterName(int index)
{
return "p" + index;
}
返回字符串。为空,但无效。但是,即使这会从参数中删除“p”前缀,我仍然存在从0开始而不是从1开始的问题
有没有机会改变这种行为或NHibernate
编辑:我现在还尝试更改一些其他参数函数:
string ISqlParameterFormatter.GetParameterName(int index)
{
int ret = index + 1;
return (NamedPrefix + ret);
}
private void SetCommandParameters(IDbCommand cmd, SqlType[] sqlTypes)
{
for (int i = 0; i < sqlTypes.Length; i++)
{
int ret = i + 1;
string paramName = ret.ToString();
IDbDataParameter dbParam = GenerateParameter(cmd, paramName, sqlTypes[i]);
cmd.Parameters.Add(dbParam);
}
}
protected override void InitializeParameter(IDbDataParameter dbParam, string name, SqlType sqlType)
{
if (sqlType == null)
{
throw new QueryException(String.Format("No type assigned to parameter '{0}'", name));
}
name = name.Remove(0, 1);
dbParam.ParameterName = (Int32.Parse(name) + 1).ToString();
dbParam.DbType = sqlType.DbType;
}
string ISqlParameterFormatter.GetParameterName(int-index)
{
int-ret=指数+1;
退货(名称为REFIX+ret);
}
私有void SetCommandParameters(IDbCommand cmd,SqlType[]sqlTypes)
{
for(int i=0;i
通过这些更改,SQL参数是“:1,:2”等等,但它也破坏了绑定-现在这些参数根本没有附加到查询中:(
Edit2:以下是完整的驱动程序和方言代码:
namespace NHSQLBase
{
public class SQLBaseDriver : OleDbDriver, ISqlParameterFormatter
{
public override bool UseNamedPrefixInSql
{
get
{
return true;
}
}
public override bool UseNamedPrefixInParameter
{
get
{
return false;
}
}
public override string NamedPrefix
{
get
{
return ":";
}
}
private static string ToParameterName(int index)
{
return (index + 1).ToString();
}
string ISqlParameterFormatter.GetParameterName(int index)
{
int ret = index + 1;
return (NamedPrefix + ret);
}
private void SetCommandParameters(IDbCommand cmd, SqlType[] sqlTypes)
{
for (int i = 0; i < sqlTypes.Length; i++)
{
int ret = i + 1;
string paramName = ret.ToString();
IDbDataParameter dbParam = GenerateParameter(cmd, paramName, sqlTypes[i]);
cmd.Parameters.Add(dbParam);
}
}
protected override void InitializeParameter(IDbDataParameter dbParam, string name, SqlType sqlType)
{
if (sqlType == null)
{
throw new QueryException(String.Format("No type assigned to parameter '{0}'", name));
}
name = name.Remove(0, 1);
dbParam.ParameterName = (Int32.Parse(name) + 1).ToString();
dbParam.DbType = sqlType.DbType;
}
}
public class SQLBaseDialect : GenericDialect
{
public override string ForUpdateString
{
get
{
return " ";
}
}
public override bool ForUpdateOfColumns
{
get
{
return true;
}
}
public override string GetForUpdateString(string aliases)
{
return " for update of " + aliases;
}
public override bool SupportsOuterJoinForUpdate
{
get
{
return false;
}
}
public override bool SupportsParametersInInsertSelect
{
get
{
return false;
}
}
}
}
public class SQLBaseDialect : GenericDialect
{
public override string ForUpdateString
{
get { return " "; }
}
public override bool ForUpdateOfColumns
{
get { return true; }
}
public override string GetForUpdateString(string aliases)
{
return " for update of " + aliases;
}
public override bool SupportsOuterJoinForUpdate
{
get { return false; }
}
public override bool SupportsParametersInInsertSelect
{
get { return false; }
}
}
名称空间NHSQLBase
{
公共类SQLBaseDriver:OleDbDriver,ISqlParameterFormatter
{
公共重写bool UseNamedPrefixInSql
{
得到
{
返回true;
}
}
公共覆盖布尔UseNamedPrefixin参数
{
得到
{
返回false;
}
}
公共重写字符串NamedPrefix
{
得到
{
返回“:”;
}
}
私有静态字符串TopParameterName(int索引)
{
return(索引+1).ToString();
}
字符串ISqlParameterFormatter.GetParameterName(int索引)
{
int-ret=指数+1;
退货(名称为REFIX+ret);
}
私有void SetCommandParameters(IDbCommand cmd,SqlType[]sqlTypes)
{
for(int i=0;i
经过一点尝试和错误后,我认为我已经找到了问题的根源。主要问题似乎是由SQLBaseDriver
继承自OleDbDriver
引起的。一旦将其更改为ReflectionBasedDriver
,并且正确填充了构造函数,我就能够执行插入操作,没有任何问题
请参阅下面的驱动程序和方言的工作版本
需要注意的一点是,SQLBase的.Net数据提供程序dll Gupta.SQLBase.data.dll必须与NHibernate.dll位于同一文件夹中才能工作
public class SQLBaseDriver : NHibernate.Driver.ReflectionBasedDriver
{
public SQLBaseDriver()
: base("Gupta.SQLBase.Data",
"Gupta.SQLBase.Data.SQLBaseConnection",
"Gupta.SQLBase.Data.SQLBaseCommand")
{
}
public override bool UseNamedPrefixInSql
{
get { return true; }
}
public override bool UseNamedPrefixInParameter
{
get { return false; }
}
public override string NamedPrefix
{
get { return ":"; }
}
}
方言代码:
namespace NHSQLBase
{
public class SQLBaseDriver : OleDbDriver, ISqlParameterFormatter
{
public override bool UseNamedPrefixInSql
{
get
{
return true;
}
}
public override bool UseNamedPrefixInParameter
{
get
{
return false;
}
}
public override string NamedPrefix
{
get
{
return ":";
}
}
private static string ToParameterName(int index)
{
return (index + 1).ToString();
}
string ISqlParameterFormatter.GetParameterName(int index)
{
int ret = index + 1;
return (NamedPrefix + ret);
}
private void SetCommandParameters(IDbCommand cmd, SqlType[] sqlTypes)
{
for (int i = 0; i < sqlTypes.Length; i++)
{
int ret = i + 1;
string paramName = ret.ToString();
IDbDataParameter dbParam = GenerateParameter(cmd, paramName, sqlTypes[i]);
cmd.Parameters.Add(dbParam);
}
}
protected override void InitializeParameter(IDbDataParameter dbParam, string name, SqlType sqlType)
{
if (sqlType == null)
{
throw new QueryException(String.Format("No type assigned to parameter '{0}'", name));
}
name = name.Remove(0, 1);
dbParam.ParameterName = (Int32.Parse(name) + 1).ToString();
dbParam.DbType = sqlType.DbType;
}
}
public class SQLBaseDialect : GenericDialect
{
public override string ForUpdateString
{
get
{
return " ";
}
}
public override bool ForUpdateOfColumns
{
get
{
return true;
}
}
public override string GetForUpdateString(string aliases)
{
return " for update of " + aliases;
}
public override bool SupportsOuterJoinForUpdate
{
get
{
return false;
}
}
public override bool SupportsParametersInInsertSelect
{
get
{
return false;
}
}
}
}
public class SQLBaseDialect : GenericDialect
{
public override string ForUpdateString
{
get { return " "; }
}
public override bool ForUpdateOfColumns
{
get { return true; }
}
public override string GetForUpdateString(string aliases)
{
return " for update of " + aliases;
}
public override bool SupportsOuterJoinForUpdate
{
get { return false; }
}
public override bool SupportsParametersInInsertSelect
{
get { return false; }
}
}
这可能是一个愚蠢的评论,但您是否尝试过为TopParameterName返回(索引+1).ToString()?唉,尝试更改TopParametern