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] -
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
SameerThanks 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
RajHi 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, -
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? -
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 membersHi,
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 -
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
-
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
-
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