C# 是否可以更改NHibernate公式绑定变量的格式?

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开头-

我正在处理一个遗留的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开头-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