Oracle
 sql >> Database >  >> RDS >> Oracle

ORA-01008:non tutte le variabili sono vincolate, quando sono tutte vincolate

Questo errore si verifica spesso in caso di ODP.NET. Il problema risiede nel comportamento predefinito di OracleCommand quando si tratta di far corrispondere i parametri di query ai parametri forniti. Per impostazione predefinita, la posizione viene utilizzato il metodo al posto di nome metodo. In pratica ogni parametro aggiunto al comando verrà preso così com'è indipendentemente dal nome, e se fai riferimento a un parametro due volte nel testo della query, devi aggiungere il valore per esso due volte!

Questo comportamento predefinito può essere ignorato impostando BindByName su true su OracleCommad ma in caso di SqlDataSource non hai accesso ad esso e devi fornire i valori più volte nell'ordine corretto:

<asp:SqlDataSource ID="EDTDS" runat="server" ConnectionString="<%$ ConnectionStrings:Camstar %>" ProviderName="<%$ ConnectionStrings:Camstar.ProviderName %>" SelectCommand="select ..."
    <SelectParameters>
        <asp:SessionParameter ConvertEmptyStringToNull="False" Name="startDate" SessionField="startDate" />
        <asp:SessionParameter ConvertEmptyStringToNull="False" Name="startDate" SessionField="startDate" />
        <asp:SessionParameter ConvertEmptyStringToNull="False" Name="endDate"  SessionField="endDate" />
        <asp:SessionParameter ConvertEmptyStringToNull="False" Name="equipID" SessionField="equipID" />
        <asp:SessionParameter ConvertEmptyStringToNull="False" Name="startDate" SessionField="startDate" />
        <asp:SessionParameter ConvertEmptyStringToNull="False" Name="endDate"  SessionField="endDate" />
        <asp:SessionParameter ConvertEmptyStringToNull="False" Name="equipID" SessionField="equipID" />
        <asp:SessionParameter ConvertEmptyStringToNull="False" Name="venmod" SessionField="venmod" />
        <asp:SessionParameter ConvertEmptyStringToNull="False" Name="handType" SessionField="handType" />
        <asp:SessionParameter ConvertEmptyStringToNull="False" Name="handID" SessionField="handID" />
        <asp:SessionParameter ConvertEmptyStringToNull="False" Name="operID" SessionField="operID" />
    </SelectParameters>
</asp:SqlDataSource>

(spero di non averne perso nessuno)

In alternativa puoi considerare di creare il tuo Provider derivato da ODP.NET con BindByName aggiustato.