OracleParameter.ArrayBindSize is invalid

Hi,
Getting "OracleParameter.ArrayBindSize is invalid" error while using 'ArrayBindCount' method.
We are getting this error while using VARCHAR2 as an OUT parameter in the stored procedure.
'ArrayBindCount' works when we return NUMBER as an OUT parameter.
Stored Procedure Implementation
CREATE OR REPLACE PACKAGE SP_TEST_PA AS
PROCEDURE SP_TEST_PR(i_str_flg IN VARCHAR2,
o_str_err_code OUT VARCHAR2,
o_num_status OUT NUMBER) ;
END SP_TEST_PA;
CREATE OR REPLACE PACKAGE BODY SP_TEST_PA AS
PROCEDURE SP_TEST_PR(i_str_flg IN VARCHAR2,
o_str_err_code OUT VARCHAR2,
o_num_status OUT NUMBER) AS
BEGIN
     o_str_err_code := 'SUCCESS';
     o_num_status := 0;
EXCEPTION
WHEN OTHERS THEN
     o_str_err_code := 'ERROR';
o_num_status := 1;
END SP_TEST_PR;
END SP_TEST_PA ;
VB.NET Code Implementation
Imports Oracle.DataAccess.Client
Dim lOCon As OracleConnection
Dim lOCmd As OracleCommand
Dim lOPRFlag As New OracleParameter("i_str_flg", OracleDbType.Varchar2, ParameterDirection.Input)
Dim lOPRErrorCode As New OracleParameter("o_str_err_code", OracleDbType.Varchar2, ParameterDirection.Output)
Dim lOPRStatus As New OracleParameter("o_num_status", OracleDbType.Decimal, ParameterDirection.Output)
Dim lIntArrayCount As Integer
Dim lArrFlag() As String = New String() {"N"}
Dim lArrErrCode() As String = New String() {"Y"} ' Default Value
Dim lArrStatus() As Integer = New Integer() {0} ' Default Value
Dim lStrProcedureName As String = "SP_TEST_PA.SP_TEST_PR"
Try
' Assign the values to the parameter
lOPRFlag.Value = lArrFlag
lOPRErrorCode.Value = lArrErrCode
lOPRStatus.Value = lArrStatus
' Set the ArrayCount for command to max. number of rows in the preceding arrays
lIntArrayCount = lArrStatus.Length
lOCon = New OracleConnection(CommonFunctionality.GetDBConnectionString)
lOCon.Open()
lOCmd = New OracleCommand(lStrProcedureName, lOCon)
lOCmd.CommandType = CommandType.StoredProcedure
' Bind the Length
lOCmd.ArrayBindCount = lIntArrayCount
lOCmd.Parameters.Add(lOPRFlag)
lOCmd.Parameters.Add(lOPRErrorCode)
lOCmd.Parameters.Add(lOPRStatus)
lOCmd.ExecuteNonQuery()
Catch ex As Exception
Finally
' Clean-up Activities
If Not (lOCmd Is Nothing) Then
lOCmd.Connection.Close()
lOCmd.Dispose()
End If
lOCmd = Nothing
If Not (lOCon Is Nothing) Then
If lOCon.State <> ConnectionState.Closed Then
lOCon.Close()
End If
lOCon.Dispose()
End If
lOCon = Nothing
End Try
Pl. help us.
Thanks & Regards,
Aditya from India

It does not look like you've set the ArrayBindSize property as required:
"For binding a PL/SQL Associative Array, whose elements are of a variable-length element type, as an InputOutput , Out, or ReturnValue parameter, this property must be set properly."
- Oracle Data Provider for .NET Library, OracleParameter.ArrayBindSize
If you go to the ODP.NET home page and scroll to the bottom, you can get a sample download of 2 chapters from Pro .NET Oracle Programming (as of 16 JUN 2005). The ODP.NET home page can be found here:
http://www.oracle.com/technology/tech/windows/odpnet/index.html
Chapter 5 (which is part of the sample chapters) discusses working with PL/SQL and PLSQLAssociativeArray.
- Mark

Similar Messages

  • 'ArrayBindSize is invalid' calling DBMS_DESCRIBE.DESCRIBE_PROCEDURE

    I'm trying to call DBMS_DESCRIBE.DESCRIBE_PROCEDURE to get a listing of all of the parameters for a stored procedure. I'm having trouble getting the parameters created properly. Most of the params are declared as one of the following:
    overload OUT NUMBER_TABLE,
    argument_name OUT VARCHAR2_TABLE,
    I've been using the following code (overload, for example):
    m_Command.Parameters.Add("overload", OracleDbType.Double, 200, DBNull.Value, ParameterDirection.Output);
    m_Command.Parameters[n].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    m_Command.Parameters[n].ArrayBindSize = ???;
    I've tried setting ArrayBindSize to several different values, but I always seem to get the following error message "OracleParameter.ArrayBindSize is invalid".
    Thoughts?
    Also, in ADO, you used to be able to call Command.Refresh, which would populate the Parameters object for you (slow as it may have been). Is there anything similar available for ODP?
    Any help would be greatly appreciated.

    The DBMS_DESCRIBE.DESCRIBE_PROCEDURE contains Nested Table type parameters. Since ODP.NET does not support Nested Table type, it is not possible to execute the DBMS_DESCRIBE.DESCRIBE_PROCEDURE at this time. The Nested Table, VArray, Object supports will be evaluated in the near future.
    Thanks
    Martha

  • Oracle.ManagedDataAccess and ArrayBindSize

    Hello,
    I am trying to upgrade Asp.net web application ODAC 32 bit component  from ODAC 11 to Oracle.MagagedDataAccess. The below code worked fine with ODAC 11 but it throws "System.InvalidOperationException: OracleParameter.ArrayBindSize is invalid" exception when I use ManagedDataAccess
    OracleParameter paramWebRef = new OracleParameter("newwebreference", OracleDbType.Varchar2, 30, new object[order_id_.Count], ParameterDirection.Output); 
    paramWebRef.ArrayBindSize = new int[order_id_.Count].Initialize(30);
    paramWebRef.ArrayBindStatus = new OracleParameterStatus[order_id_.Count].Initialize(OracleParameterStatus.Success);
    Am I missing any other properties or methods which I should use while using Managed DataAccess ?

    i am using parameter array binding and setting the size and status.
                    OracleParameter paramFound = new OracleParameter("found", OracleDbType.Int32, new object[company_id_.Count], ParameterDirection.Output);
                    paramFound.ArrayBindStatus = new OracleParameterStatus[company_id_.Count].Initialize(OracleParameterStatus.Success);
                    paramFound.ArrayBindSize = new int[company_id_.Count()];
    When I run the above lines of code, ExecuteNonQuery not returning any values. Verified the stored procedure using Toad, it returns "1" for the "found" column but in C# code its
    just 0 (OracleDecimal[])paramFound.Value)[i]

  • ODP ArrayBindSize

    My Oracle Package Procedure signature is
    PROCEDURE Get_Object_Details(
    p_ObjectID IN VARCHAR2,
    p_FullLoad IN VARCHAR2,
    p_PropName OUT gt_PropNames,
    p_PropValue OUT gt_PropValues,
    gt_PropNames,gt_PropValues etc. are of type table and definition is as follows.
    TYPE gt_PropNames IS TABLE OF VARCHAR2(50)INDEX BY BINARY_INTEGER;
    I want to execute the Procdure from my .NET application using ODP.
    Sample Code which i am using is :
    string strConnString = "User Id=xyz;Password=xyz;Data
    Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = Abc)(PORT = 1521)))(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = EX_SID)));";
    OracleParameter param_ObjectID = new
    OracleParameter("p_ObjectID",OracleDbType.Int32);
    param_ObjectID.Direction = ParameterDirection.Input;
    param_ObjectID.Value = Convert.ToInt32(6);
    OracleParameter strFullLoad = new
    OracleParameter("p_FullLoad",OracleDbType.Varchar2);
    strFullLoad.Direction = ParameterDirection.Input;
    strFullLoad.Value = "T";
    OracleParameter p_PropName = new
    OracleParameter("p_PropName",OracleDbType.Varchar2);
    p_PropName.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    p_PropName.Direction = ParameterDirection.Output;
    p_PropName.Size = 1000;
    OracleParameter p_PropValue = new OracleParameter("p_PropValue",
    OracleDbType.Varchar2);
    p_PropValue.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    p_PropValue.Direction = ParameterDirection.Output;
    p_PropValue.Size = 1000;
    OracleParameter[] param =
    {param_ObjectID,strFullLoad,p_PropName,p_PropValue};
    try
    OracleHelper.ExecuteNonQuery(strConnString,CommandType.StoredProcedure,"PKG1.Procedure1",param);
    catch(Exception ee)
    MessageBox.Show(ee.Message.ToString());
    But is giving any Error. The Error is OracleParameter.ArrayBindSize is invalid.
    I don't want to Set this property at design time. Because.. it is dynamic.
    Please Post same sample code.

    I am guessing you got this working already but here it is just in case somebody else could use it.
              // allows one to build a variable sized array
              private static OracleParameter BuildAssociativeArray(
                   string paramName
                   ,OracleDbType paramType
                   ,object[] values
                   ,int bindSize
                   ,ParameterDirection paramDirection
                   ,bool skipNullItems)
                   int                    paramSize = 0;
                   object[]     paramValues;
                   // set the parameter size and load up the parameter values and bind size
                   if (!skipNullItems)
                        paramSize = values.Length;
                   else
                        for (int i = 0; i < values.Length; i++)
                             if (values[i] != null)
                                  paramSize++;
                             else
                                  break; // stop at first null
                   paramValues = new object[paramSize];
                   int[] bindArray = new int[paramSize];
                   for (int i = 0; i < paramSize; i++)
                        paramValues[i] = values;
                        bindArray[i] = bindSize;
                   // create the parm now
                   OracleParameter parm = new OracleParameter(
    paramName
                        , paramType
                        , paramValues.Length == 0 ? (object)DBNull.Value : paramValues
                        , paramDirection);
                   parm.Size = paramSize;
                   parm.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
                   if (paramSize != 0)
                        parm.ArrayBindSize = bindArray;
                   else
                   return parm;
    and here is a sample of it being called
                        parmValues = new string[ArrayLen];
                        for (int i = 0; i < parmValues.Length; i++)
                             if (contact.ShippingAddress[i] == null)
                                  parmValues[i] = null;
                             else
                                  parmValues[i] = contact.ShippingAddress[i].ZIP5;
                        parms.Add(BuildAssociativeArray("p_ship_zip_5_code"
                             , OracleDbType.Char
                             , parmValues
                             , 5
                             , ParameterDirection.Input
                             , false));
    Regards,
    Mike

  • PL/SQL array bind output variable

    I've been trying to learn how to pass an array to an pl/sql script. Getting the data into the db seems to be working fine, but I would like to know if there was a problem inserting the data. More specifically, I would like to know THE SPECIFIC ROW that caused the problem.
    pl/sql code:
    create or replace procedure pp (
              v_out      out number,
              v_listtype in repair_codes.listtype%type,
    v_repaircode in repair_codes.repaircode%type
    is
    begin
    insert into repair_codes (listtype, repaircode) values (v_listtype,v_repaircode);
         v_out:=1;
    commit;
         --just setting up test variable for now     
    end;
    vb.code:
    Dim cmd As New OracleCommand("pp", dbConn)
    cmd.CommandType = CommandType.StoredProcedure
    cmd.ArrayBindCount = 3
    Dim al(2) As String
    Dim ar(2) As String
    al(0) = "JOE1"
    al(1) = "JOE2"
    al(2) = "JOE3"
    ar(0) = "TEST1"
    ar(1) = "TEST2"
    ar(2) = "TEST3456789"
    Dim out As New OracleParameter("v_out", OracleDbType.Varchar2, 20)
    out.Direction = ParameterDirection.Output
    cmd.Parameters.Add(out)
    Dim listtype As New OracleParameter("v_listtype", OracleDbType.Varchar2)
    listtype.Value = al
    cmd.Parameters.Add(listtype)
    Dim repaircode As New OracleParameter("v_repaircode", OracleDbType.Varchar2)
    repaircode.Value = ar
    cmd.Parameters.Add(repaircode)
    dbConn.Open()
    Try
    cmd.ExecuteNonQuery()
    Catch ex As OracleException ' catches only Oracle errors
    ex = ex
    Select Case ex.Number
    Case 1
    MessageBox.Show("Error attempting to insert duplicate data.")
    Case 12545
    MessageBox.Show("The database is unavailable.")
    Case Else
    MessageBox.Show("Database error: " & ex.Message.ToString())
    Dim wha = ex.Errors(0).ArrayBindIndex 'always '0'
    End Select
    Finally
    dbConn.Close()
    End Try
    error:
    OracleParameter.ArrayBindSize is invalid
    Code above will work if I remove everything about the 'output' variable
    To test I would like to put in data for a column that is too large, have all other rows inserted, but return the row that had bad data. Thanks for any thoughts on this-

    I have a similar issue, i.e. the pl/sql table type as out parameter is causing probleml in one API related to Oracle Applications. I have singled this problem out by creating wrappers and testing them against BPEL process. Now as soon as I put an out parameter with pl/sql table in my wrapper, I start getting errors. Why the invoke even care about what is in output while calling the API? How can I get rid of it. I am not able to pin point where exactly you made the changes. Could you please share some more info or possibly share the BAD and GOOD code.
    We will probably get away with this by creating just a wrapper that would have NO out parameter as PL/SQL table as I don't think we need it anyway.
    Still want to know what is the issue here as we would like to avoid any custom wrapper creation?
    Shobhit
    Message was edited by:
    Shobhit.Kapila

  • Returing array from PL/SQL procedure

    Hi,
    I am trying to return array from PL/SQL procedure. Heres is the code. I am getting an error "OracleParameter.ArrayBindSize is invalid ".
    Will anybody let me know what is wrong in following code. or does anybody have code to return PL/SQL array using VB.NET.
    oCommand.CommandText = "MyPack.TestVarchar2"
    oCommand.CommandType = CommandType.StoredProcedure
    Dim id As Integer = 10
    Dim deptname As String()
    Dim oParam1 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter("id", Oracle.DataAccess.Client.OracleDbType.Int32)
    Dim oParam2 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter("deptname", Oracle.DataAccess.Client.OracleDbType.Varchar2)
    oParam1.Direction = ParameterDirection.Input
    oParam2.Direction = ParameterDirection.Output
    oParam1.CollectionType = Oracle.DataAccess.Client.OracleCollectionType.None
    oParam2.CollectionType = Oracle.DataAccess.Client.OracleCollectionType.PLSQLAssociativeArray
    oParam1.Value = id
    oParam2.Value = ""
    oParam1.Size = 10
    oParam2.Size = 20
    oCommand.Parameters.Add(oParam1)
    oCommand.Parameters.Add(oParam2)
    oCommand.ExecuteNonQuery()
    Thanks
    Sameer

    Thanks Arnold for the reply..
    Yes, I am trying to get result set in array which is unknow to me (No of rows return by the query). For the test I will pre-define the result set so that I will able to set ArrayBindSize.
    I have read C# example but when I try to write it in VB.NET it gives me syntax error when I try to set the ArrayBindSize.
    oParam.ArrayBindSize = new int[3]{15,23,13} // individual max size of 3 outputsWill you please let me know how to set ArrayBindSize (VB.NET) because I am new to this..
    There is an example at otn "How to: Bind an Array to an ODP.NET Database Command" which does multiple INSERTs in one trip to database. This works fine. I need to do same for the SELECT statement which will return me multiple rows. I do not mean refCursor. If I use refCursor, it will make soft parse which I am trying to avoid using this Array techniq.
    Thanks
    Sameer

  • Using UPDATE...RETURNING...INTO...

    I am trying to use the UPDATE statement with the RETURNING clause:
    string sSql = "UPDATE ... RETURNING x, y INTO :ix, sy";
    ExecuteNonQuery(); // No use for me :(
    // I want to do this:
    OracleDataReader oReader = ExecuteReader();
    Will this work?
    TIA
    Raj

    Hi David,
    Let me try to explain.
    I have an application that does some batch processing. I need to look for rows in the MY_EXPORT table matching this criteria:
    WHERE ENTERPRISE_KEY IN ('ABC','XYZ')
    AND SYSTEM_NAME = 'PUBLISH'
    AND STATUS = '__READY_FOR_LOAD'
    AND ROWNUM < (iDocumentsPerSession + 1)
    /*RETURNING EXPORT_KEY INTO :ExportKey*/
    Assume these are the columns in the table:
    ENTERPRISE_KEY, SYSTEM_NAME, STATUS and EXPORT_KEY(PK)
    For testing: I set iDocumentsPerSession=50. So, I set the ArrayBindCount also to 50. I know there are 50 rows in the table that WILL get updated (ROWNUM < 51). When the update is done without the RETURNING clause it does update exactly 50 rows.
    In real-time: One session of this app will process only 50 or less rows. I pick the rows in __READY_FOR_LOAD status and update them to __BEING_LOADED status. Then I process those rows - which is why I need to get PK of the rows that just got updated. So, in real-time, I wont know exactly how many rows will get updated (it could be 50 or less or none) - so I cant set the ArrayBindCount to an exact value - I can set it to the maximum.
    When I dont set ArrayBindCount I get: "ORA-03106: fatal two-task communication protocol error". If I set ArrayBindCount=50 (for testing, I know 50 rows will get updated) I get this:
    {"OracleParameter.ArrayBindSize is invalid" }
    [System.InvalidOperationException]: {System.InvalidOperationException}
    System.Object: {System.InvalidOperationException}
    _className: null
    _COMPlusExceptionCode: -532459699
    _exceptionMethod: <undefined value>
    _exceptionMethodString: null
    _helpURL: null
    _HResult: -2146233079
    _innerException: { }
    _message: "OracleParameter.ArrayBindSize is invalid"
    _remoteStackIndex: 0
    _remoteStackTraceString: null
    _source: null
    _stackTrace: {System.Array}
    _stackTraceString: null
    _xcode: -532459699
    _xptrs: 0
    HelpLink: null
    HResult: -2146233079
    InnerException: { }
    Message: "OracleParameter.ArrayBindSize is invalid"
    Source: "Oracle.DataAccess"
    StackTrace: " at Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()\r\n at ....Load.DataProvider.Get...(Boolean bReloadFailedOrders) in c:\\documents and settings\\...\\my documents\\visual studio projects\\...\\dataprovider.cs:line 385"
    TargetSite: {System.Reflection.RuntimeMethodInfo}
    TIA
    Raj

  • Working with OracleParameters - Any Help?

    Hi,
    I created a stored procedure with 3 IN parameters(out of 2 are single value,3rd one is pl/sql table) and 1 OUT Parameter (of PLSQL Table Return type).
    I want take the SP results in VB.NET. i used plsql associative arrays, but i am getting error as
    'OracleParameter.Value is Invalid.'
    How to set parameter.size for the Output value.. I don't know exactly how many rows will be retrieved.
    How to use oracleparametercollection.
    How to return cursors from the plsql table.( gone through the asktom article. but i am unable to follow it. getting error as expression is of wrong type.)
    Here the stored procedure that i have written which is a wrapper for another procedure( and that procedure working properly in oracle).
    PL/SQL Procedure
    procedure Storage_Charges_with_prd(LotNo IN Number,CurrDate IN Date,m_prd IN products_table_t,charges_table out storage_charges_table) is
         m_products pkg_coldstorage.products_type;
         type curProducts is REF CURSOR ;
         cv_products curProducts;     
         -- type strgchgs is table of storage_charges_rec index by binary_integer;
         --charges_table storage_charges_table;
         prd_table products_table_t;
         m_SNo Number:=1;
         output_cursor SYS_REFCURSOR;
    BEGIN
         For m_SNo in 1..m_prd.Count
         LOOP
              prd_table(m_SNo):=m_prd(m_SNo);
         END LOOP;
    charges_table:= pkg_coldstorage.CALCULATE_STORAGE_CHARGES1(Lotno,CurrDate,prd_table);
         --return charges_table;
    dbms_output.put_line('Charges Table Row Count In - Storage Charges with Product Procedure ' ||charges_table.count);
    -- Open output_cursor For Select * From table(charges_table );
    END Storage_Charges_with_prd;
    in VB.NET - the Codings are
    Dim mLotno, mCurrDate, SNo, Transid, ProductId, UnitId, ProductName, Unit_Name, Calculation_Method, Season_start_date, season_end_date, labour, Storage_Rate, Seasonal_Storage_Rate As New OracleParameter()
    mLotno.OracleDbType = OracleDbType.Decimal
    mCurrDate.OracleDbType = OracleDbType.Date
    mLotno.Value = LotNo
    mCurrDate.Value = CurrDate
    mLotno.Size = 1
    mCurrDate.Size = 1
    SNo.CollectionType = OracleCollectionType.PLSQLAssociativeArray
    Transid.CollectionType = OracleCollectionType.PLSQLAssociativeArray
    ProductId.CollectionType = OracleCollectionType.PLSQLAssociativeArray
    UnitId.CollectionType = OracleCollectionType.PLSQLAssociativeArray
    ProductName.CollectionType = OracleCollectionType.PLSQLAssociativeArray
    Unit_Name.CollectionType = OracleCollectionType.PLSQLAssociativeArray
    Calculation_Method.CollectionType = OracleCollectionType.PLSQLAssociativeArray
    Season_start_date.CollectionType = OracleCollectionType.PLSQLAssociativeArray
    season_end_date.CollectionType = OracleCollectionType.PLSQLAssociativeArray
    labour.CollectionType = OracleCollectionType.PLSQLAssociativeArray
    Storage_Rate.CollectionType = OracleCollectionType.PLSQLAssociativeArray
    Seasonal_Storage_Rate.CollectionType = OracleCollectionType.PLSQLAssociativeArray
    SNo.Direction = ParameterDirection.Input
    Transid.Direction = ParameterDirection.Input
    ProductId.Direction = ParameterDirection.Input
    ProductName.Direction = ParameterDirection.Input
    Unit_Name.Direction = ParameterDirection.Input
    Calculation_Method.Direction = ParameterDirection.Input
    Season_start_date.Direction = ParameterDirection.Input
    season_end_date.Direction = ParameterDirection.Input
    labour.Direction = ParameterDirection.Input
    Storage_Rate.Direction = ParameterDirection.Input
    Seasonal_Storage_Rate.Direction = ParameterDirection.Input
    SNo.OracleDbType = OracleDbType.Decimal
    Transid.OracleDbType = OracleDbType.Decimal
    ProductId.OracleDbType = OracleDbType.Decimal
    ProductName.OracleDbType = OracleDbType.Varchar2
    Unit_Name.OracleDbType = OracleDbType.Varchar2
    Calculation_Method.OracleDbType = OracleDbType.Decimal
    Season_start_date.OracleDbType = OracleDbType.Date
    season_end_date.OracleDbType = OracleDbType.Date
    labour.OracleDbType = OracleDbType.Decimal
    Storage_Rate.OracleDbType = OracleDbType.Decimal
    Seasonal_Storage_Rate.OracleDbType = OracleDbType.Decimal
    Dim msno(ProductRates.Rows.Count) As Decimal
    Dim mtransid(ProductRates.Rows.Count) As Decimal
    Dim mproductid(ProductRates.Rows.Count) As Decimal
    Dim mproductname(ProductRates.Rows.Count) As String
    Dim munit_name(ProductRates.Rows.Count) As String
    Dim mcalculation_method(ProductRates.Rows.Count) As Decimal
    Dim mseason_start_date(ProductRates.Rows.Count) As Date
    Dim mseason_end_date(ProductRates.Rows.Count) As Date
    Dim mlabour(ProductRates.Rows.Count) As Decimal
    Dim mstorage_rate(ProductRates.Rows.Count) As Decimal
    Dim mseasonal_storage_rate(ProductRates.Rows.Count) As Decimal
    For i As Integer = 0 To ProductRates.Rows.Count - 1
    msno(i) = ProductRates.Rows(i).Item("SNo")
    mtransid(i) = ProductRates.Rows(i).Item("transid")
    mproductid(i) = ProductRates.Rows(i).Item("Productid")
    mproductname(i) = ProductRates.Rows(i).Item("ProductName")
    munit_name(i) = ProductRates.Rows(i).Item("Unit_Name")
    mcalculation_method(i) = ProductRates.Rows(i).Item("Calculation_Method")
    mseason_start_date(i) = ProductRates.Rows(i).Item("Season_start_date")
    mseason_end_date(i) = ProductRates.Rows(i).Item("season_end_date")
    mlabour(i) = ProductRates.Rows(i).Item("labour")
    mstorage_rate(i) = ProductRates.Rows(i).Item("Storage_Rate")
    mseasonal_storage_rate(i) = ProductRates.Rows(i).Item("Seasonal_storage_rate")
    Next
    SNo.Value = msno
    Transid.Value = mtransid
    ProductId.Value = mproductid
    ProductName.Value = mproductname
    Unit_Name.Value = munit_name
    Calculation_Method.Value = mcalculation_method
    Season_start_date.Value = mseason_start_date
    season_end_date.Value = mseason_end_date
    labour.Value = mlabour
    Storage_Rate.Value = mstorage_rate
    Seasonal_Storage_Rate.Value = mseasonal_storage_rate
    '-- Set the Size
    SNo.Value = ProductRates.Rows.Count
    Transid.Value = ProductRates.Rows.Count
    ProductId.Value = ProductRates.Rows.Count
    ProductName.Value = ProductRates.Rows.Count
    Unit_Name.Value = ProductRates.Rows.Count
    Calculation_Method.Value = ProductRates.Rows.Count
    Season_start_date.Value = ProductRates.Rows.Count
    season_end_date.Value = ProductRates.Rows.Count
    labour.Value = ProductRates.Rows.Count
    Storage_Rate.Value = ProductRates.Rows.Count
    Seasonal_Storage_Rate.Value = ProductRates.Rows.Count
    ''-- Set the Array Bind Size For Unitname, Productname
    'Dim arr1(ProductRates.Rows.Count) As Integer
    'Dim arr2(ProductRates.Rows.Count) As Integer
    'For i As Integer = 0 To ProductRates.Rows.Count - 1
    ' arr1(i) = 50
    ' arr2(i) = 50
    'Next i
    'ProductName.ArrayBindSize = arr1
    'Unit_Name.ArrayBindSize = arr2
    Dim daStorageCharges As New OracleDataAdapter("pkg_coldstorage.storage_charges_with_prd", DbCn)
    daStorageCharges.SelectCommand.CommandType = CommandType.StoredProcedure
    With daStorageCharges.SelectCommand.Parameters
    .Add(mLotno)
    .Add(mCurrDate)
    .Add(SNo)
    .Add(Transid)
    .Add(ProductId)
    .Add(ProductName)
    .Add(Unit_Name)
    .Add(Calculation_Method)
    .Add(Season_start_date)
    .Add(season_end_date)
    .Add(labour)
    .Add(Storage_Rate)
    .Add(Seasonal_Storage_Rate)
    End With
    Dim oSNo, oTransID, oTransDate, oProductID, oProductName, oUnitID, oUnitName, oQtyIn, oQtyOut, _
    oBalanceQty, oWtIn, oWtOut, oBalanceWt, oLabour, oLabourAmount, oStorageRate, oStorageAmount, oTotal As New OracleParameter
    oSNo.OracleDbType = OracleDbType.Decimal
    oTransID.OracleDbType = OracleDbType.Decimal
    oTransDate.OracleDbType = OracleDbType.Date
    oProductID.OracleDbType = OracleDbType.Decimal
    oProductName.OracleDbType = OracleDbType.Varchar2
    oUnitID.OracleDbType = OracleDbType.Decimal
    oUnitName.OracleDbType = OracleDbType.Varchar2
    oQtyIn.OracleDbType = OracleDbType.Decimal
    oQtyOut.OracleDbType = OracleDbType.Decimal
    oBalanceQty.OracleDbType = OracleDbType.Decimal
    oWtIn.OracleDbType = OracleDbType.Decimal
    oWtOut.OracleDbType = OracleDbType.Decimal
    oBalanceWt.OracleDbType = OracleDbType.Date
    oLabour.OracleDbType = OracleDbType.Decimal
    oLabourAmount.OracleDbType = OracleDbType.Decimal
    oStorageRate.OracleDbType = OracleDbType.Decimal
    oStorageAmount.OracleDbType = OracleDbType.Decimal
    oTotal.OracleDbType = OracleDbType.Decimal
    oSNo.Direction = ParameterDirection.Output
    oTransID.Direction = ParameterDirection.Output
    oTransDate.Direction = ParameterDirection.Output
    oProductID.Direction = ParameterDirection.Output
    oProductName.Direction = ParameterDirection.Output
    oUnitID.Direction = ParameterDirection.Output
    oUnitName.Direction = ParameterDirection.Output
    oQtyIn.Direction = ParameterDirection.Output
    oQtyOut.Direction = ParameterDirection.Output
    oBalanceQty.Direction = ParameterDirection.Output
    oWtIn.Direction = ParameterDirection.Output
    oWtOut.Direction = ParameterDirection.Output
    oBalanceWt.Direction = ParameterDirection.Output
    oLabour.Direction = ParameterDirection.Output
    oLabourAmount.Direction = ParameterDirection.Output
    oStorageRate.Direction = ParameterDirection.Output
    oStorageAmount.Direction = ParameterDirection.Output
    oTotal.Direction = ParameterDirection.Output
    'Dim prdarr() As Integer
    'Dim unitarr() As Integer
    'for i as Integer = 0 to
    'Next i
    With daStorageCharges.SelectCommand.Parameters
    .Add(oSNo)
    .Add(oTransID)
    .Add(oTransDate)
    .Add(oProductID)
    .Add(oProductName)
    .Add(oUnitID)
    .Add(oUnitName)
    .Add(oQtyIn)
    .Add(oQtyOut)
    .Add(oBalanceQty)
    .Add(oWtIn)
    .Add(oWtOut)
    .Add(oBalanceWt)
    .Add(oLabour)
    .Add(oLabourAmount)
    .Add(oStorageRate)
    .Add(oStorageAmount)
    .Add(oTotal)
    End With
    'Dim a As OracleParameterCollection
    Dim dtstoragecharges As New DataTable
    daStorageCharges.Fill(dtstoragecharges)
    tried with reader but unable.
    please provide any example. so that i will use it.
    Please provide any help
    Thanks in Advance
    Mohan Raj K.

    @Eric
    I am a pl/sql noob, but I did manage to retrieve a ref_cursor via .net as follows:
    CREATE or REPLACE PACKAGE myVars AS
    TYPE CommonCurTyp is REF CURSOR;
    --my test server is 8i need to define cursor in a package
    END;
    CREATE OR REPLACE PROCEDURE jtest(
                        v_repaircur OUT myVars.CommonCurTyp
    IS
    BEGIN
    OPEN v_repaircur FOR
    SELECT * FROM BLAH;
    END;
    --vb.net code:
    dbConn.Open()
    Dim selectCommand As New OracleCommand("jtest", dbConn)
    selectCommand.CommandType = CommandType.StoredProcedure
    selectCommand.Parameters.Add(New OracleParameter("v_repaircur", OracleDbType.RefCursor)).Direction = ParameterDirection.Output
    Dim adapter As New OracleDataAdapter(selectCommand)
    adapter.TableMappings.Add("Table", "repair_codes")
    Dim ds As New DataSet
    adapter.Fill(ds) 'boom! here's yer dataset
    dbConn.Close()
    with some minor hacking, you should be able to get it, HTH

  • How can I pass an empty array to a parameter of type PLSQLAssociativeArray

    How can I pass an empty array to a parameter of type PLSQLAssociativeArray in VB? I defined the parameter like this
    Dim myArray() as String = new String() {}
    Dim myPara as new Oracle.DataAccess.Client.OracleCollectionType.PLSQLAssociativeArray
    myPara = 0
    myPara.Value = myArray
    When I execute my stored procedure giving the above parameter, I got error saying OracleParameter.Value is invalid.
    I have tried to give it the DBNull.Value, but it doesn't work either.
    Note: everything works fine as long as myArray has some item in there. I just wonder how I can make it works in case I have nothing.
    Thank you,

    How can I pass an empty array to a parameter of type PLSQLAssociativeArray in VB? I defined the parameter like this
    Dim myArray() as String = new String() {}
    Dim myPara as new Oracle.DataAccess.Client.OracleCollectionType.PLSQLAssociativeArray
    myPara = 0
    myPara.Value = myArray
    When I execute my stored procedure giving the above parameter, I got error saying OracleParameter.Value is invalid.
    I have tried to give it the DBNull.Value, but it doesn't work either.
    Note: everything works fine as long as myArray has some item in there. I just wonder how I can make it works in case I have nothing.
    Thank you,

  • Insertion of Blank fails with error 01400 on ODP 9.2.0.4.0 using Parameter

    Hi everybody,
    I have a problem on inserting a blank string into a NOT NULL VARCHAR2 field by using a parameter on Oracle Data Provider for .NET (Version 9.2.0.4.0). It is possible to insert any strings with non-blank characters using a parameter and it is possible to insert blank strings using SQLPlusWorksheet, so it must be a problem of using ODP.
    It seems to me when using parameters, strings are trimmed in some way, therefore a blank string is handled like an empty string is handled like NULL.
    However, we need to insert blank strings and we really want to use parameters because of the performance gain.
    Does anybody know how to handle blank strings with parameters or is it impossible because of a bug?
    Thanks,
    Rainer
    Additional Information:
    * TABLE STRUCTURE *
    CREATE TABLE GLOBALTYPE
         GT_ID VARCHAR2 (36) NOT NULL,
         GT_NR NUMBER (5, 0) NOT NULL,
         GT_NOTE VARCHAR2 (255),
         GT_CREA DATE,
         GT_MOD DATE,
         GT_OWNER VARCHAR2 (36),
         GT_EXPORTDB VARCHAR2 (50) NOT NULL,
         GT_EXPORTDATE DATE NOT NULL,
         GT_IMPORTDB VARCHAR2 (50) NOT NULL,
         GT_IMPORTDATE DATE NOT NULL,
         GT_NAME VARCHAR2 (40) NOT NULL
    * COMMAND BEING EXECUTED *
    {Oracle.DataAccess.Client.OracleCommand}
    [Oracle.DataAccess.Client.OracleCommand]: {Oracle.DataAccess.Client.OracleCommand}
    CommandText: "INSERT INTO GlobalType (GT_ID, GT_NR, GT_NOTE, GT_CREA, GT_MOD, GT_OWNER, GT_EXPORTDB, GT_EXPORTDATE, GT_IMPORTDB, GT_IMPORTDATE, GT_NAME) VALUES (:GT_ID, :GT_NR, :GT_NOTE, :GT_CREA, :GT_MOD, :GT_OWNER, :GT_EXPORTDB, :GT_EXPORTDATE, :GT_IMPORTDB, :GT_IMPORTDATE, :GT_NAME)"
    CommandTimeout: 0
    CommandType: Text
    Connection: {Oracle.DataAccess.Client.OracleConnection}
    Parameters: {Oracle.DataAccess.Client.OracleParameterCollection}
    Transaction: {Oracle.DataAccess.Client.OracleTransaction}
    UpdatedRowSource: Both
    * PARAMETER HAVING BLANK STRING *
    {Oracle.DataAccess.Client.OracleParameter}
    ArrayBindSize: Nothing
    ArrayBindStatus: Nothing
    CollectionType: None
    DbType: String
    Direction: Input
    IsNullable: False
    Offset: 0
    OracleDbType: Varchar2
    ParameterName: ":GT_EXPORTDB"
    Precision: 0
    Scale: 0
    Size: 1
    SourceColumn: ""
    SourceVersion: Current
    Status: Success
    Value: " " {String}
    * EXCEPTION WHEN RUNNING ExecuteNonQuery ON COMMAND
    {Oracle.DataAccess.Client.OracleException}
    [Oracle.DataAccess.Client.OracleException]: {Oracle.DataAccess.Client.OracleException}
    HelpLink: Nothing
    InnerException: Nothing
    Message: "ORA-01400: Einfügen von NULL in ("TEST"."GLOBALTYPE"."GT_EXPORTDB") nicht möglich"
    Source: "Oracle Data Provider for .NET"
    StackTrace: " at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure)
    at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, String procedure, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src)
    at Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()

    I have same problem.
    I have 10.2 provider installed and I need to insert string.Empty in "VARCHAR2(200) NOT NULL" column:
    Here is the code:
    using (OracleConnection connection = GrinderHlp.OpenConnection(ConnectionString))
    using (OracleCommand command = connection.CreateCommand())
    command.CommandText = @"INSERT INTO dz_hist_data (par_value, time_stamp, quality, updated_when, g_time_stamp, obj_id, par_id, stat_aggr)
    VALUES (:Value, :Time, :Quality, CURRENT_TIMESTAMP, :GTime, :ObjId, :ParId, :AggId)";
    OracleParameter p1 = command.Parameters.Add("Value", OracleDbType.Varchar2, 50, ParameterDirection.Input);
    OracleParameter p2 = command.Parameters.Add("Time", OracleDbType.Date, ParameterDirection.Input);
    OracleParameter p3 = command.Parameters.Add("Quality", OracleDbType.Int16, ParameterDirection.Input);
    OracleParameter p6 = command.Parameters.Add("GTime", OracleDbType.Date, ParameterDirection.Input);
    OracleParameter p0 = command.Parameters.Add("ObjId", OracleDbType.Int32, ParameterDirection.Input);
    OracleParameter p4 = command.Parameters.Add("ParId", OracleDbType.Int32, ParameterDirection.Input);
    OracleParameter p5 = command.Parameters.Add("AggId", OracleDbType.Int32, ParameterDirection.Input);
    p0.Value = 15004;
    p1.Value = "";
    p2.Value = DateTime.Now;
    p3.Value = 192;
    p4.Value = 1974;
    p5.Value = 3;
    p6.Value = DateTime.UtcNow;
    command.ExecuteNonQuery();
    The code fails with ORA-01400.
    I tried to use OracleDbType.Char, .NChar and NVarchar2 instead of OracleDbType.Varchar2 and result was the same.
    Here is the table structure:
    CREATE TABLE dz_hist_data
    (obj_id NUMBER(16,0) NOT NULL,
    par_value VARCHAR2(200) NOT NULL,
    time_stamp DATE NOT NULL,
    quality NUMBER(3,0),
    updated_when DATE NOT NULL,
    par_id NUMBER(16,0) NOT NULL,
    stat_aggr NUMBER NOT NULL,
    diff_value NUMBER,
    diff_ts DATE,
    new_data CHAR(1) DEFAULT '1',
    param_cond_id NUMBER,
    g_time_stamp DATE
    Can you help me?

  • Wrong number or types of parameters after upgrading to ODP 11.2.0.1.1 Beta

    Hi,
    I have the below Oracle procedure with two parameters , the first one i IS TABLE OF number INDEX BY BINARY_INTEGER, and the second one is of type Ref cursor of predifned RECORD type.
    PROCEDURE Proc1(p_proj_comp_no_list IN core_util.ref_t,
    p_proj_comp_post_query_cursor OUT t_proj_comp_post_query_cursor
    ) IS
    This has been working fine while we were using DEVART Oracle drivers. however, as soon we move to ODP 11.2.0.1.1 Beta version we get the below error while executing the procedure via ODP.
    {"ORA-06550: line 1, column 7:\nPLS-00306: wrong number or types of arguments in call to 'PROJ_COMP_POST_QUERY'\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored"}
    Below is the debug watch result of the two parameters of the COMMAND being executed.
    Best Regards,
    Prabhakar
    +          *base     {P_PROJ_COMP_NO_LIST}     System.Data.Common.DbParameter {Oracle.DataAccess.Client.OracleParameter}*
              ArrayBindSize     null     int[]
              ArrayBindStatus     null     Oracle.DataAccess.Client.OracleParameterStatus[]
              CollectionType     None     Oracle.DataAccess.Client.OracleCollectionType
              DbType     String     System.Data.DbType
              Direction     Input     System.Data.ParameterDirection
              IsNullable     false     bool
              Offset     0     int
              OracleDbType     Long     Oracle.DataAccess.Client.OracleDbType
              OracleDbTypeEx     Long     Oracle.DataAccess.Client.OracleDbType
              ParameterName     "P_PROJ_COMP_NO_LIST"     string
              Precision     0     byte
              Scale     0     byte
              Size     1     int
              SourceColumn     ""     string
              SourceColumnNullMapping     false     bool
              SourceVersion     Current     System.Data.DataRowVersion
              Status     Success     Oracle.DataAccess.Client.OracleParameterStatus
              UdtTypeName     ""     string
    +          Value     {long[1]}     object {long[]}
    +          Static members          
    +          Non-Public members          
    -          [1]     {P_PROJ_COMP_POST_QUERY_CURSOR}     object {Oracle.DataAccess.Client.OracleParameter}
    +          *base     {P_PROJ_COMP_POST_QUERY_CURSOR}     System.Data.Common.DbParameter {Oracle.DataAccess.Client.OracleParameter}*
              ArrayBindSize     null     int[]
              ArrayBindStatus     null     Oracle.DataAccess.Client.OracleParameterStatus[]
              CollectionType     None     Oracle.DataAccess.Client.OracleCollectionType
              DbType     Object     System.Data.DbType
              Direction     Output     System.Data.ParameterDirection
              IsNullable     false     bool
              Offset     0     int
              OracleDbType     RefCursor     Oracle.DataAccess.Client.OracleDbType
              OracleDbTypeEx     RefCursor     Oracle.DataAccess.Client.OracleDbType
              ParameterName     "P_PROJ_COMP_POST_QUERY_CURSOR"     string
              Precision     0     byte
              Scale     0     byte
              Size     0     int
              SourceColumn     ""     string
              SourceColumnNullMapping     false     bool
              SourceVersion     Current     System.Data.DataRowVersion
              Status     Success     Oracle.DataAccess.Client.OracleParameterStatus
              UdtTypeName     ""     string
    +          Value     {}     object {System.DBNull}
    +          Static members          
    +          Non-Public members

    Hi,
    Can you please show the actual code that creates and appends the parameters instead, along with cmd.commandtext?
    Thanks
    Greg
    Edited by: gdarling on Jun 30, 2010 11:54 AM
    Also note that unless you're using Oracle Developer Tools for VS to generate the code, this would probably be more appropriate in the ODP forum:
    ODP.NET

  • How to pass empty PL/SQL collection?

    I can pass an array as PL/SQL associative array into PL/SQL procedure/block.
    It works perfectly.
    But i can't pass empty array (e.g. new decimal[] {} ) as value - exception raised:
    System.InvalidOperationException:
    "OracleParameter.Value is invalid"
    I can receive empty collection FROM pl/sql, but can i pass empty collection TO pl/sql?

    Unfortunately, there are no any suitable workaround for this problem in thread mentioned above.
    Workaround given by Greg in the thread:
    You can get around it in the meantime by using
    Param1.Value = new string[1]{null};
    Param1.Size=0;Why is that not suitable?
    - Mark

  • Update problem from a dataset

    I'm having a problem updating a row on a backend database using a dataset which contains the datacolumns as parameters with a TableMapping object. I'm using this in conjunction with the ODT.net tool.
    I've used this technique hundreds of times with a SQL Server backend, with no problems whatsoever. I'm not doing anything different.
    Here is the SQL I'm executing:
    <code>
    PROCEDURE proc_prUpdate
              p_CALLID IN CALL.CALLID%TYPE,
              p_STARTTIME IN CALL.STARTTIME%TYPE,
              p_STANDARD IN CALL.STANDARD%TYPE,
              p_DURATION IN CALL.DURATION%TYPE,
              p_VOYCALLID IN CALL.VOYCALLID%TYPE,
              p_LESID IN CALL.LESID%TYPE,
              p_SERVICETYPE IN CALL.SERVICETYPE%TYPE,
              p_MESCATEGORY IN CALL.MESCATEGORY%TYPE,
              p_MOBILE IN CALL.MOBILE%TYPE,
              p_REGIONID IN CALL.REGIONID%TYPE,
              p_TXCHANNEL IN CALL.TXCHANNEL%TYPE,
              p_RXCHANNEL IN CALL.RXCHANNEL%TYPE,
              p_SPOTBEAM IN CALL.SPOTBEAM%TYPE,
              p_TERMINALID IN CALL.TERMINALID%TYPE,
              p_RETURNID IN CALL.RETURNID%TYPE,
              p_TELEPHONENUMBER IN CALL.TELEPHONENUMBER%TYPE,
              p_PID IN CALL.PID%TYPE,
              p_TIMEDURATION IN CALL.TIMEDURATION%TYPE,
              p_LESNAME IN CALL.LESNAME%TYPE,
              p_MESNAME IN CALL.MESNAME%TYPE,
              p_CITY IN CALL.CITY%TYPE,
              p_COUNTRY IN CALL.COUNTRY%TYPE,
              p_TARGETID IN CALL.TARGETID%TYPE,
              p_MESID IN CALL.MESID%TYPE,
              p_DBSERVERID IN CALL.DBSERVERID%TYPE
         AS
         BEGIN
              update CALL set      
              STARTTIME = p_STARTTIME, STANDARD = p_STANDARD, DURATION = p_DURATION, VOYCALLID = p_VOYCALLID, LESID = p_LESID, SERVICETYPE = p_SERVICETYPE, MESCATEGORY = p_MESCATEGORY, MOBILE = p_MOBILE, REGIONID = p_REGIONID, TXCHANNEL = p_TXCHANNEL, RXCHANNEL = p_RXCHANNEL, SPOTBEAM = p_SPOTBEAM, TERMINALID = p_TERMINALID, RETURNID = p_RETURNID, TELEPHONENUMBER = p_TELEPHONENUMBER, PID = p_PID, TIMEDURATION = p_TIMEDURATION, LESNAME = p_LESNAME, MESNAME = p_MESNAME, CITY = p_CITY, COUNTRY = p_COUNTRY, TARGETID = p_TARGETID, MESID = p_MESID, DBSERVERID = p_DBSERVERID
              where CALLID = p_CALLID;
         END;
    </code>
    The following is in the generated code for the DataAdapter. Here are all the parameters for the update command:
    <code>
    Dim OracleParameter29 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter30 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter31 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter32 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter33 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter34 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter35 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter36 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter37 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter38 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter39 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter40 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter41 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter42 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter43 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter44 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter45 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter46 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter47 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter48 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter49 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter50 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter51 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter52 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter53 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParamete
    </code>
    The following is the code for the parameter list in the generated code:
    <code>
    Me.updateOracleCommand1.CommandText = "CALL_PKG.PROC_PRUPDATE"
    Me.updateOracleCommand1.CommandType = System.Data.CommandType.StoredProcedure
    Me.updateOracleCommand1.Connection = Me.oracleConnection1
    OracleParameter29.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Decimal
    OracleParameter29.ParameterName = "P_CALLID"
    OracleParameter29.SourceColumn = "P_CALLID"
    OracleParameter30.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Date
    OracleParameter30.ParameterName = "P_STARTTIME"
    OracleParameter30.SourceColumn = "P_STARTTIME"
    OracleParameter31.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter31.ParameterName = "P_STANDARD"
    OracleParameter31.SourceColumn = "P_STANDARD"
    OracleParameter32.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Decimal
    OracleParameter32.ParameterName = "P_DURATION"
    OracleParameter32.SourceColumn = "P_DURATION"
    OracleParameter33.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Decimal
    OracleParameter33.ParameterName = "P_VOYCALLID"
    OracleParameter33.SourceColumn = "P_VOYCALLID"
    OracleParameter34.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Char
    OracleParameter34.ParameterName = "P_LESID"
    OracleParameter34.SourceColumn = "P_LESID"
    OracleParameter35.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter35.ParameterName = "P_SERVICETYPE"
    OracleParameter35.SourceColumn = "P_SERVICETYPE"
    OracleParameter36.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Decimal
    OracleParameter36.ParameterName = "P_MESCATEGORY"
    OracleParameter36.SourceColumn = "P_MESCATEGORY"
    OracleParameter37.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter37.ParameterName = "P_MOBILE"
    OracleParameter37.SourceColumn = "P_MOBILE"
    OracleParameter38.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter38.ParameterName = "P_REGIONID"
    OracleParameter38.SourceColumn = "P_REGIONID"
    OracleParameter39.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Char
    OracleParameter39.ParameterName = "P_TXCHANNEL"
    OracleParameter39.SourceColumn = "P_TXCHANNEL"
    OracleParameter40.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Char
    OracleParameter40.ParameterName = "P_RXCHANNEL"
    OracleParameter40.SourceColumn = "P_RXCHANNEL"
    OracleParameter41.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Decimal
    OracleParameter41.ParameterName = "P_SPOTBEAM"
    OracleParameter41.SourceColumn = "P_SPOTBEAM"
    OracleParameter42.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Decimal
    OracleParameter42.ParameterName = "P_TERMINALID"
    OracleParameter42.SourceColumn = "P_TERMINALID"
    OracleParameter43.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Char
    OracleParameter43.ParameterName = "P_RETURNID"
    OracleParameter43.SourceColumn = "P_RETURNID"
    OracleParameter44.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter44.ParameterName = "P_TELEPHONENUMBER"
    OracleParameter44.SourceColumn = "P_TELEPHONENUMBER"
    OracleParameter45.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Char
    OracleParameter45.ParameterName = "P_PID"
    OracleParameter45.SourceColumn = "P_PID"
    OracleParameter46.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter46.ParameterName = "P_TIMEDURATION"
    OracleParameter46.SourceColumn = "P_TIMEDURATION"
    OracleParameter47.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter47.ParameterName = "P_LESNAME"
    OracleParameter47.SourceColumn = "P_LESNAME"
    OracleParameter48.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter48.ParameterName = "P_MESNAME"
    OracleParameter48.SourceColumn = "P_MESNAME"
    OracleParameter49.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter49.ParameterName = "P_CITY"
    OracleParameter49.SourceColumn = "P_CITY"
    OracleParameter50.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter50.ParameterName = "P_COUNTRY"
    OracleParameter50.SourceColumn = "P_COUNTRY"
    OracleParameter51.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Decimal
    OracleParameter51.ParameterName = "P_TARGETID"
    OracleParameter51.SourceColumn = "P_TARGETID"
    OracleParameter52.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Char
    OracleParameter52.ParameterName = "P_MESID"
    OracleParameter52.SourceColumn = "P_MESID"
    OracleParameter53.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Decimal
    OracleParameter53.ParameterName = "P_DBSERVERID"
    OracleParameter53.SourceColumn = "P_DBSERVERID"
    Me.updateOracleCommand1.Parameters.Add(OracleParameter29)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter30)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter31)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter32)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter33)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter34)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter35)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter36)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter37)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter38)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter39)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter40)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter41)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter42)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter43)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter44)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter45)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter46)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter47)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter48)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter49)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter50)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter51)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter52)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter53)
    </code>
    Here is the code I'm running to try the update:
    <code>
    OracleDataAdapter1.TableMappings.Add("Table", "CALL")
    OracleDataAdapter1.UpdateCommand.Parameters.Item(0).Value = Call11._Call.Item(0).CALLID
    OracleDataAdapter1.UpdateCommand.Parameters.Item(2).Value = Call11._Call.Item(0).STANDARD
    Call11._Call.Item(0).STARTTIME = DataGrid1.Item(0, 1)
    Call11._Call.Item(0).STANDARD = DataGrid1.Item(0, 2)
    Call11._Call.Item(0).DURATION = DataGrid1.Item(0, 3)
    Call11._Call.Item(0).LESID = DataGrid1.Item(0, 4)
    Call11._Call.Item(0).SERVICETYPE = DataGrid1.Item(0, 5)
    Call11._Call.Item(0).MESCATEGORY = DataGrid1.Item(0, 6)
    Call11._Call.Item(0).MOBILE = DataGrid1.Item(0, 7)
    Call11._Call.Item(0).REGIONID = DataGrid1.Item(0, 8)
    Call11._Call.Item(0).MESID = DataGrid1.Item(0, 22)
    Call11._Call.Item(0).CALLID = Convert.ToInt32(TextBox1.Text)
    OracleDataAdapter1.Update(Call11)
    </code>
    I shouldn't need to add the above lines:
    <code>
    OracleDataAdapter1.UpdateCommand.Parameters.Item(0).Value = Call11._Call.Item(0).CALLID
    OracleDataAdapter1.UpdateCommand.Parameters.Item(2).Value = Call11._Call.Item(0).STANDARD
    </code>
    , but I added them to show you the value of the parms going in.
    When debugging, the following is my output:
    ?Call11._Call.Item(0).RowState
    Modified
    ?Call11._Call.Rows.Count
    1
    You can see that the rowstate is set to "Modified" and the rowcount is 1
    ?OracleDataAdapter1.UpdateCommand.Parameters.Item(0).Value
    8612967 {Long}
    [Long]: 8612967 {Long}
    ?OracleDataAdapter1.UpdateCommand.Parameters.Item(2).Value
    "B" {String}
    String: "B"
    The above, are the values of the first & third parms before the "Update" statement is executed.
    ?OracleDataAdapter1.UpdateCommand.Parameters.Item(0).Value
    {System.DBNull}
    [System.DBNull]: {System.DBNull}
    ?OracleDataAdapter1.UpdateCommand.Parameters.Item(2).Value
    {System.DBNull}
    [System.DBNull]: {System.DBNull}
    The above are the values of the first & third parms after the "Update" statement is executed.
    <code>
    OracleDataAdapter1.Update(Call11)
    </code>
    Notice the values are NULL. why???
    Below, is the value of my TableMapping object:
    ?OracleDataAdapter1.TableMappings.Count
    1
    ?OracleDataAdapter1.TableMappings.Item(0)
    {System.Data.Common.DataTableMapping}
    ColumnMappings: {System.Data.Common.DataColumnMappingCollection}
    DataSetTable: "CALL"
    SourceTable: "Table"
    The datatable name of the strongly typed dataset I am using is "CALL".
    When I change the update statement from:
    <code>
    OracleDataAdapter1.Update(Call11)
    </code>
    to
    <code>
    OracleDataAdapter1.UpdateCommand.ExecuteNonQuery()
    </code>
    the update works (using the latter), but returns a -1 for the records affected (-1 typically means the command can't decipher the action of the command that just took place).
    I might add that I successfully executed a similiar "update" the same way via a dataset prior to what I'm trying to do here.
    Why isn't the backend datasource being updated? I do not get any errors during the update statement execpt for the -1 for the records affected?

    I shortened the package spec to the following:
    <code>
    PROCEDURE proc_prUpdate
              p_CALLID IN CALL.CALLID%TYPE,
              p_STANDARD IN CALL.STANDARD%TYPE
    </code>
    I shortened the package body to the following:
    <code>
    PROCEDURE proc_prUpdate
              p_CALLID IN CALL.CALLID%TYPE,
              p_STANDARD IN CALL.STANDARD%TYPE
         AS
         BEGIN
              update CALL set      
              STANDARD = p_STANDARD
              where CALLID = p_CALLID;
         END;
    </code>
    When I execute the update statement from the associated data adapter, it updates the db correctly, but still gives me a -1 for the records affected.
    When I execute the exact same sql with the record inside a strongly typed dataset, it doesn't update and I still get the -1 for the records affected.
    While debugging, the following output is shown for the parameter list:
    ?daORA.UpdateCommand.Parameters.Item(0)
    {Oracle.DataAccess.Client.OracleParameter}
    ArrayBindSize: Nothing
    ArrayBindStatus: Nothing
    CollectionType: None
    DbType: Decimal
    Direction: Input
    IsNullable: False
    Offset: 0
    OracleDbType: Decimal
    ParameterName: "P_CALLID"
    Precision: 0
    Scale: 0
    Size: 0
    SourceColumn: "P_CALLID"
    SourceVersion: Original
    Status: Success
    Value: 8612967 {Long}
    ?daORA.UpdateCommand.Parameters.Item(1)
    {Oracle.DataAccess.Client.OracleParameter}
    ArrayBindSize: Nothing
    ArrayBindStatus: Nothing
    CollectionType: None
    DbType: String
    Direction: Input
    IsNullable: False
    Offset: 0
    OracleDbType: Varchar2
    ParameterName: "P_STANDARD"
    Precision: 0
    Scale: 0
    Size: 0
    SourceColumn: "P_STANDARD"
    SourceVersion: Current
    Status: Success
    Value: "c" {String}
    ?ds.Tables(0).Rows(0).RowState
    Modified
    Two questions:
    Even though it updates successfully in the first iteration, how come I get the -1 for the records affected?
    In the second iteration, how come it is not updating the backend datasource and how come I still get the -1 for the records affected? You can see that the rowstate is set to modified.
    Is there a problem with the ODP.Net data provider not being able to update a backend datasource with values inside of a datatable during a "da.update" statement?
    With MS SQL Server data provider, it updates the data flawlessly when I put the tables inside of a MS SQL Server.

  • Update problem from a dataset with ODT.

    I'm having a problem updating a row on a backend database using a dataset which contains the datacolumns as parameters with a TableMapping object. I'm using this in conjunction with the ODT.net tool.
    I've used this technique hundreds of times with a SQL Server backend, with no problems whatsoever. I'm not doing anything different.
    Here is the SQL I'm executing:
    <code>
    PROCEDURE proc_prUpdate
              p_CALLID IN CALL.CALLID%TYPE,
              p_STARTTIME IN CALL.STARTTIME%TYPE,
              p_STANDARD IN CALL.STANDARD%TYPE,
              p_DURATION IN CALL.DURATION%TYPE,
              p_VOYCALLID IN CALL.VOYCALLID%TYPE,
              p_LESID IN CALL.LESID%TYPE,
              p_SERVICETYPE IN CALL.SERVICETYPE%TYPE,
              p_MESCATEGORY IN CALL.MESCATEGORY%TYPE,
              p_MOBILE IN CALL.MOBILE%TYPE,
              p_REGIONID IN CALL.REGIONID%TYPE,
              p_TXCHANNEL IN CALL.TXCHANNEL%TYPE,
              p_RXCHANNEL IN CALL.RXCHANNEL%TYPE,
              p_SPOTBEAM IN CALL.SPOTBEAM%TYPE,
              p_TERMINALID IN CALL.TERMINALID%TYPE,
              p_RETURNID IN CALL.RETURNID%TYPE,
              p_TELEPHONENUMBER IN CALL.TELEPHONENUMBER%TYPE,
              p_PID IN CALL.PID%TYPE,
              p_TIMEDURATION IN CALL.TIMEDURATION%TYPE,
              p_LESNAME IN CALL.LESNAME%TYPE,
              p_MESNAME IN CALL.MESNAME%TYPE,
              p_CITY IN CALL.CITY%TYPE,
              p_COUNTRY IN CALL.COUNTRY%TYPE,
              p_TARGETID IN CALL.TARGETID%TYPE,
              p_MESID IN CALL.MESID%TYPE,
              p_DBSERVERID IN CALL.DBSERVERID%TYPE
         AS
         BEGIN
              update CALL set      
              STARTTIME = p_STARTTIME, STANDARD = p_STANDARD, DURATION = p_DURATION, VOYCALLID = p_VOYCALLID, LESID = p_LESID, SERVICETYPE = p_SERVICETYPE, MESCATEGORY = p_MESCATEGORY, MOBILE = p_MOBILE, REGIONID = p_REGIONID, TXCHANNEL = p_TXCHANNEL, RXCHANNEL = p_RXCHANNEL, SPOTBEAM = p_SPOTBEAM, TERMINALID = p_TERMINALID, RETURNID = p_RETURNID, TELEPHONENUMBER = p_TELEPHONENUMBER, PID = p_PID, TIMEDURATION = p_TIMEDURATION, LESNAME = p_LESNAME, MESNAME = p_MESNAME, CITY = p_CITY, COUNTRY = p_COUNTRY, TARGETID = p_TARGETID, MESID = p_MESID, DBSERVERID = p_DBSERVERID
              where CALLID = p_CALLID;
         END;
    </code>
    The following is in the generated code for the DataAdapter. Here are all the parameters for the update command:
    <code>
    Dim OracleParameter29 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter30 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter31 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter32 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter33 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter34 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter35 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter36 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter37 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter38 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter39 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter40 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter41 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter42 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter43 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter44 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter45 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter46 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter47 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter48 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter49 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter50 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter51 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter52 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter
    Dim OracleParameter53 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParamete
    </code>
    The following is the code for the parameter list in the generated code:
    <code>
    Me.updateOracleCommand1.CommandText = "CALL_PKG.PROC_PRUPDATE"
    Me.updateOracleCommand1.CommandType = System.Data.CommandType.StoredProcedure
    Me.updateOracleCommand1.Connection = Me.oracleConnection1
    OracleParameter29.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Decimal
    OracleParameter29.ParameterName = "P_CALLID"
    OracleParameter29.SourceColumn = "P_CALLID"
    OracleParameter30.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Date
    OracleParameter30.ParameterName = "P_STARTTIME"
    OracleParameter30.SourceColumn = "P_STARTTIME"
    OracleParameter31.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter31.ParameterName = "P_STANDARD"
    OracleParameter31.SourceColumn = "P_STANDARD"
    OracleParameter32.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Decimal
    OracleParameter32.ParameterName = "P_DURATION"
    OracleParameter32.SourceColumn = "P_DURATION"
    OracleParameter33.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Decimal
    OracleParameter33.ParameterName = "P_VOYCALLID"
    OracleParameter33.SourceColumn = "P_VOYCALLID"
    OracleParameter34.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Char
    OracleParameter34.ParameterName = "P_LESID"
    OracleParameter34.SourceColumn = "P_LESID"
    OracleParameter35.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter35.ParameterName = "P_SERVICETYPE"
    OracleParameter35.SourceColumn = "P_SERVICETYPE"
    OracleParameter36.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Decimal
    OracleParameter36.ParameterName = "P_MESCATEGORY"
    OracleParameter36.SourceColumn = "P_MESCATEGORY"
    OracleParameter37.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter37.ParameterName = "P_MOBILE"
    OracleParameter37.SourceColumn = "P_MOBILE"
    OracleParameter38.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter38.ParameterName = "P_REGIONID"
    OracleParameter38.SourceColumn = "P_REGIONID"
    OracleParameter39.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Char
    OracleParameter39.ParameterName = "P_TXCHANNEL"
    OracleParameter39.SourceColumn = "P_TXCHANNEL"
    OracleParameter40.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Char
    OracleParameter40.ParameterName = "P_RXCHANNEL"
    OracleParameter40.SourceColumn = "P_RXCHANNEL"
    OracleParameter41.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Decimal
    OracleParameter41.ParameterName = "P_SPOTBEAM"
    OracleParameter41.SourceColumn = "P_SPOTBEAM"
    OracleParameter42.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Decimal
    OracleParameter42.ParameterName = "P_TERMINALID"
    OracleParameter42.SourceColumn = "P_TERMINALID"
    OracleParameter43.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Char
    OracleParameter43.ParameterName = "P_RETURNID"
    OracleParameter43.SourceColumn = "P_RETURNID"
    OracleParameter44.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter44.ParameterName = "P_TELEPHONENUMBER"
    OracleParameter44.SourceColumn = "P_TELEPHONENUMBER"
    OracleParameter45.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Char
    OracleParameter45.ParameterName = "P_PID"
    OracleParameter45.SourceColumn = "P_PID"
    OracleParameter46.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter46.ParameterName = "P_TIMEDURATION"
    OracleParameter46.SourceColumn = "P_TIMEDURATION"
    OracleParameter47.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter47.ParameterName = "P_LESNAME"
    OracleParameter47.SourceColumn = "P_LESNAME"
    OracleParameter48.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter48.ParameterName = "P_MESNAME"
    OracleParameter48.SourceColumn = "P_MESNAME"
    OracleParameter49.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter49.ParameterName = "P_CITY"
    OracleParameter49.SourceColumn = "P_CITY"
    OracleParameter50.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
    OracleParameter50.ParameterName = "P_COUNTRY"
    OracleParameter50.SourceColumn = "P_COUNTRY"
    OracleParameter51.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Decimal
    OracleParameter51.ParameterName = "P_TARGETID"
    OracleParameter51.SourceColumn = "P_TARGETID"
    OracleParameter52.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Char
    OracleParameter52.ParameterName = "P_MESID"
    OracleParameter52.SourceColumn = "P_MESID"
    OracleParameter53.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Decimal
    OracleParameter53.ParameterName = "P_DBSERVERID"
    OracleParameter53.SourceColumn = "P_DBSERVERID"
    Me.updateOracleCommand1.Parameters.Add(OracleParameter29)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter30)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter31)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter32)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter33)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter34)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter35)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter36)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter37)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter38)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter39)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter40)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter41)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter42)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter43)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter44)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter45)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter46)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter47)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter48)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter49)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter50)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter51)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter52)
    Me.updateOracleCommand1.Parameters.Add(OracleParameter53)
    </code>
    Here is the code I'm running to try the update:
    <code>
    OracleDataAdapter1.TableMappings.Add("Table", "CALL")
    OracleDataAdapter1.UpdateCommand.Parameters.Item(0).Value = Call11._Call.Item(0).CALLID
    OracleDataAdapter1.UpdateCommand.Parameters.Item(2).Value = Call11._Call.Item(0).STANDARD
    Call11._Call.Item(0).STARTTIME = DataGrid1.Item(0, 1)
    Call11._Call.Item(0).STANDARD = DataGrid1.Item(0, 2)
    Call11._Call.Item(0).DURATION = DataGrid1.Item(0, 3)
    Call11._Call.Item(0).LESID = DataGrid1.Item(0, 4)
    Call11._Call.Item(0).SERVICETYPE = DataGrid1.Item(0, 5)
    Call11._Call.Item(0).MESCATEGORY = DataGrid1.Item(0, 6)
    Call11._Call.Item(0).MOBILE = DataGrid1.Item(0, 7)
    Call11._Call.Item(0).REGIONID = DataGrid1.Item(0, 8)
    Call11._Call.Item(0).MESID = DataGrid1.Item(0, 22)
    Call11._Call.Item(0).CALLID = Convert.ToInt32(TextBox1.Text)
    OracleDataAdapter1.Update(Call11)
    </code>
    I shouldn't need to add the above lines:
    <code>
    OracleDataAdapter1.UpdateCommand.Parameters.Item(0).Value = Call11._Call.Item(0).CALLID
    OracleDataAdapter1.UpdateCommand.Parameters.Item(2).Value = Call11._Call.Item(0).STANDARD
    </code>
    , but I added them to show you the value of the parms going in.
    When debugging, the following is my output:
    ?Call11._Call.Item(0).RowState
    Modified
    ?Call11._Call.Rows.Count
    1
    You can see that the rowstate is set to "Modified" and the rowcount is 1
    ?OracleDataAdapter1.UpdateCommand.Parameters.Item(0).Value
    8612967 {Long}
    [Long]: 8612967 {Long}
    ?OracleDataAdapter1.UpdateCommand.Parameters.Item(2).Value
    "B" {String}
    String: "B"
    The above, are the values of the first & third parms before the "Update" statement is executed.
    ?OracleDataAdapter1.UpdateCommand.Parameters.Item(0).Value
    {System.DBNull}
    [System.DBNull]: {System.DBNull}
    ?OracleDataAdapter1.UpdateCommand.Parameters.Item(2).Value
    {System.DBNull}
    [System.DBNull]: {System.DBNull}
    The above are the values of the first & third parms after the "Update" statement is executed.
    <code>
    OracleDataAdapter1.Update(Call11)
    </code>
    Notice the values are NULL. why???
    Below, is the value of my TableMapping object:
    ?OracleDataAdapter1.TableMappings.Count
    1
    ?OracleDataAdapter1.TableMappings.Item(0)
    {System.Data.Common.DataTableMapping}
    ColumnMappings: {System.Data.Common.DataColumnMappingCollection}
    DataSetTable: "CALL"
    SourceTable: "Table"
    The datatable name of the strongly typed dataset I am using is "CALL".
    When I change the update statement from:
    <code>
    OracleDataAdapter1.Update(Call11)
    </code>
    to
    <code>
    OracleDataAdapter1.UpdateCommand.ExecuteNonQuery()
    </code>
    the update works (using the latter), but returns a -1 for the records affected (-1 typically means the command can't decipher the action of the command that just took place).
    I might add that I successfully executed a similiar "update" the same way via a dataset prior to what I'm trying to do here.
    Why isn't the backend datasource being updated? I do not get any errors during the update statement execpt for the -1 for the records affected?

    I shortened the package spec to the following:
    <code>
    PROCEDURE proc_prUpdate
              p_CALLID IN CALL.CALLID%TYPE,
              p_STANDARD IN CALL.STANDARD%TYPE
    </code>
    I shortened the package body to the following:
    <code>
    PROCEDURE proc_prUpdate
              p_CALLID IN CALL.CALLID%TYPE,
              p_STANDARD IN CALL.STANDARD%TYPE
         AS
         BEGIN
              update CALL set      
              STANDARD = p_STANDARD
              where CALLID = p_CALLID;
         END;
    </code>
    When I execute the update statement from the associated data adapter, it updates the db correctly, but still gives me a -1 for the records affected.
    When I execute the exact same sql with the record inside a strongly typed dataset, it doesn't update and I still get the -1 for the records affected.
    While debugging, the following output is shown for the parameter list:
    ?daORA.UpdateCommand.Parameters.Item(0)
    {Oracle.DataAccess.Client.OracleParameter}
    ArrayBindSize: Nothing
    ArrayBindStatus: Nothing
    CollectionType: None
    DbType: Decimal
    Direction: Input
    IsNullable: False
    Offset: 0
    OracleDbType: Decimal
    ParameterName: "P_CALLID"
    Precision: 0
    Scale: 0
    Size: 0
    SourceColumn: "P_CALLID"
    SourceVersion: Original
    Status: Success
    Value: 8612967 {Long}
    ?daORA.UpdateCommand.Parameters.Item(1)
    {Oracle.DataAccess.Client.OracleParameter}
    ArrayBindSize: Nothing
    ArrayBindStatus: Nothing
    CollectionType: None
    DbType: String
    Direction: Input
    IsNullable: False
    Offset: 0
    OracleDbType: Varchar2
    ParameterName: "P_STANDARD"
    Precision: 0
    Scale: 0
    Size: 0
    SourceColumn: "P_STANDARD"
    SourceVersion: Current
    Status: Success
    Value: "c" {String}
    ?ds.Tables(0).Rows(0).RowState
    Modified
    Two questions:
    Even though it updates successfully in the first iteration, how come I get the -1 for the records affected?
    In the second iteration, how come it is not updating the backend datasource and how come I still get the -1 for the records affected? You can see that the rowstate is set to modified.
    Is there a problem with the ODP.Net data provider not being able to update a backend datasource with values inside of a datatable during a "da.update" statement?
    With MS SQL Server data provider, it updates the data flawlessly when I put the tables inside of a MS SQL Server.

  • INM_EX_INITIATIVE_STATUS - RETRIEVE_ACTIVITIES implementation

    Gentlemen,
    I looking for a example implementation of method RETRIEVE_ACTIVITIES of BADI INM_EX_INITIATIVE_STATUS.
    Did anyone of you implemented it? Could you share the code, please?
    Currently I'm using status text as a way to identify status, but I don't think its a good idea.
    Thanks.

    It does not look like you've set the ArrayBindSize property as required:
    "For binding a PL/SQL Associative Array, whose elements are of a variable-length element type, as an InputOutput , Out, or ReturnValue parameter, this property must be set properly."
    - Oracle Data Provider for .NET Library, OracleParameter.ArrayBindSize
    If you go to the ODP.NET home page and scroll to the bottom, you can get a sample download of 2 chapters from Pro .NET Oracle Programming (as of 16 JUN 2005). The ODP.NET home page can be found here:
    http://www.oracle.com/technology/tech/windows/odpnet/index.html
    Chapter 5 (which is part of the sample chapters) discusses working with PL/SQL and PLSQLAssociativeArray.
    - Mark

Maybe you are looking for

  • Wrong document URL for content server

    Hi, In my code I'm getting the url of an image by using the function: CALL FUNCTION 'CVAPI_DOC_VIEW'    EXPORTING      PF_DOKAR               = it_objectlinks-documenttype      PF_DOKNR               = it_objectlinks-documentnumber      PF_DOKVR     

  • Disjointed rollover problem

    Hi everyone.. I am trying to create a slideshow using disjointed rollovers. I have several (16 so far) thumbnail images and want to display fullsize images in one common area. The problem: as I add more images, the earlier ones become blocked from vi

  • In-ear bud replacement?

    I purchased the i-pod in-ear headphones in april of this year and the left one has fallen apart already. Are these replaceable? I still have the receipt and everything.

  • Math power function in script logic

    Hello all! Can anybody help me how  I can do math "power" function in BPC 5.1 Script Logic? Thanks

  • IMac vs the new Mac Pro for video editing in FCPX?

    Hi. I am currently using a macbook air for all my editing and rendering of videos in FCPX. The editing process is reasonably smooth when dealing with shorter clips, but when I tried to edit multicam clips, things started to slow down. Also,  the rend