这是系统运行过程中获取的sql语句,这里param0和param1都是xml中的StartIndex和EndIndex传入的参数,但是理论上param0和param1应该前面有@符号,才会把实体的值传递给sql语句的参数,所以这个sql语句执行会报错:找不到param0和param1列,其他xml配置文件也都是报错:出现找不到传入参数列问题,除非把#符合改成$符号;但是原来的项目都是#符号,也正常使用。这个项目就不行了……
这个项目特别点是xml配置文件不是嵌入资源,而是通过resource="文件名路径"指定。就是对象的值无法传递给sql语句中的参数,大牛救救我!
不知道ibatis怎么会出现这个问题,大牛靠你了!where  RowID BETWEEN  param0  and  param1   ORDER BY AFUID
 <dynamic prepend="where">
        <isParameterPresent>
          <isNotEmpty prepend="" property="StartIndex">
            <isNotEmpty prepend="and" property="EndIndex">
              RowID BETWEEN #StartIndex# and #EndIndex#
              ORDER BY AFUID
            </isNotEmpty>
          </isNotEmpty>
        </isParameterPresent>
      </dynamic>

解决方案 »

  1.   

    #aaa# between field1 and field2 可以,但是你这种反过来的情况好像不行,用$一样的,做好输入校验,就不怕注入了,或者改成>=和<=
      

  2.   

    现在的问题是,Ibatis中的xml书写的动态sql不能使用#符号,使用就会报出param0列名不存在,只能用$,为什么会这样,哪里需要配置?
      

  3.   

    你换个方式试试,用RowID<![CDATA[>=]]> #StartIndex# and RowID<![CDATA[<=]]>#EndIndex#如果也有问题,那要调试看看这两个参数到底传进去没有
      

  4.   


    好像现在的#符号无法获取对象的值:
              <isNotEmpty>
                <isNotEmpty prepend="and" property="IsAvailable">
                  IsAvailable = #IsAvailable#
                </isNotEmpty>
              </isNotEmpty>这段代码用#符号包括IsAvailable就是报错说param0列不存在,用$包括就可以正常使用,,,
      

  5.   

    你使用 ibatis provider 修改了么? 不同的 provider 会修改参数前缀。比如 Oracle 是 ":", SqlServer 是 "@" providers.config 把对应的provider enabled 设为true,其他false。  <provider
         name="sqlServer2005"
         enabled="true"
         description="Microsoft SQL Server, provider V2.0.0.0 in framework .NET V2.0" 
         assemblyName="System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
         connectionClass="System.Data.SqlClient.SqlConnection" 
         commandClass="System.Data.SqlClient.SqlCommand"
         parameterClass="System.Data.SqlClient.SqlParameter"
         parameterDbTypeClass="System.Data.SqlDbType"
         parameterDbTypeProperty="SqlDbType"
         dataAdapterClass="System.Data.SqlClient.SqlDataAdapter"
         commandBuilderClass=" System.Data.SqlClient.SqlCommandBuilder"
         usePositionalParameters = "false"
         useParameterPrefixInSql = "true"
         useParameterPrefixInParameter = "true" 
         parameterPrefix="@"
         allowMARS="true"
        />