我有一个遗留应用程序(vfp 8),我需要从中提取数据(无插入)。我使用Accnum字段作为主键,它在表中定义为字符11。
出厂配置:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<reflection-optimizer use="false" />
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="dialect">NHibernate.Dialect.GenericDialect</property>
<property name="connection.driver_class">NHibernate.Driver.OleDbDriver</property>
<property name="connection.connection_string">Provider=VFPOLEDB.1;Data Source=C:\Analysis\Quantium\development\RD warehouse\_RDAUWH\Data;Collating Sequence=MACHINE</property>
<property name="show_sql">false</property>
</session-factory>
</hibernate-configuration>
这是我的映射文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="RDLabels"
namespace="RDLabels.Domain">
<class name="CustMast">
<id name="Accnum" column="Accnum" type="string">
<generator class="assigned"/>
</id>
<property name="Fullname" />
<property name="Add" />
<property name="State" />
</class>
</hibernate-mapping>
班级:
public class CustMast
{
private string _accnum;
public virtual string Accnum
{
get { return _accnum; }
set { _accnum = value; }
}
private string _fullname;
public virtual string Fullname
{
get { return _fullname; }
set { _fullname = value; }
}
private string _add;
public virtual string Add
{
get { return _add; }
set { _add = value; }
}
private string _state;
public virtual string State
{
get { return _state; }
set { _state = value; }
}
}
以下是获取记录的代码:
public CustMast GetByAccnum(String accnum)
{
using (ISession session = NHibernateHelper.OpenSession())
{
CustMast custMast = session
.CreateCriteria(typeof(CustMast))
.Add(Restrictions.Eq("Accnum", accnum))
.UniqueResult<CustMast>();
return custMast;
}
}
完整错误是:
NHibernate.Exceptions.GenericADOException : could not execute query
[ SELECT this_.Accnum as Accnum0_0_, this_.Fullname as Fullname0_0_, this_.Add as Add0_0_, this_.State as State0_0_ FROM CustMast this_ WHERE this_.Accnum = ? ]
Name:cp0 - Value:00059337444
[SQL: SELECT this_.Accnum as Accnum0_0_, this_.Fullname as Fullname0_0_, this_.Add as Add0_0_, this_.State as State0_0_ FROM CustMast this_ WHERE this_.Accnum = ?]
----> System.IndexOutOfRangeException : Invalid index 0 for this OleDbParameterCollection with Count=0. - d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:1590
运行NHibernate Profiler,它显示:
WARN:
reflection-optimizer property is ignored out of application configuration file.
WARN:
System.IndexOutOfRangeException: Invalid index 0 for this OleDbParameterCollection with Count=0.
at System.Data.OleDb.OleDbParameterCollection.RangeCheck(Int32 index)
at System.Data.OleDb.OleDbParameterCollection.GetParameter(Int32 index)
at System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item(Int32 index)
at NHibernate.Driver.DriverBase.ExpandQueryParameters(IDbCommand cmd, SqlString sqlString) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Driver\DriverBase.cs:line 235
at NHibernate.AdoNet.AbstractBatcher.ExpandQueryParameters(IDbCommand cmd, SqlString sqlString) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\AdoNet\AbstractBatcher.cs:line 232
at NHibernate.Loader.Loader.PrepareQueryCommand(QueryParameters queryParameters, Boolean scroll, ISessionImplementor session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:line 1152
ERROR:
Invalid index 0 for this OleDbParameterCollection with Count=0.
答案 0 :(得分:2)
每当我向他们传递一个参数时,我都在努力解决我的linq查询同样的错误。如果我没有传递任何参数并且做了session.Query()它们就可以正常工作。
我挣扎了几天,但我找到了这张Nhibernate jira票here。它解释了SQLParameters和Iseries Db2提供程序的明显问题。
我知道您正在使用其他提供商,但您可能只需下载最新的Nhibernate核心源代码,构建它并引用项目中的最新版本即可获益。它解决了我的问题。
答案 1 :(得分:0)
我要尝试的第一件事是在SQL中运行它,看看会发生什么,因为它可能是一个数据问题。
将this_.Accnum选为Accnum0_0_,this_.Fullname为Fullname0_0_, this_.Add为Add0_0_,this_.State为State0_0_ FROM CustMast this_ 在哪里this_.Accnum ='00059337444'
您的数据库中是否将Accnum列定义为字符串类型(varchar,nvarchar等)?
编辑确定下一步是实际确认发送给FoxPro的SQL。您需要设置日志记录(或下载NHProf的试用版)以确定SQL是否正确。你的设置和代码看起来是正确的,但我不是百分之百确定方言的选择,因为这可能会导致你的问题。
Edit2 NHProf错误在我看来,它认为您的Id应该是Int32,因为它看起来正在调用at System.Data.OleDb.OleDbParameterCollection.GetParameter(Int32 index)
。
我认为你需要将它添加到你的映射中: -
<id name="Accnum" column="Accnum" type="string" >
请注意额外的type="string"