【发布时间】:2019-05-08 12:53:00
【问题描述】:
我正在尝试将一个列表对象从我的 C# WebService 方法发送到我在 Oracle 中的存储过程。
在此处发布之前,我已经尝试了所有建议的重复链接。以下是我迄今为止所取得的成就:
- 成功:在 C# 中,我可以将我的列表值从我的 HTML 页面传递到我的 WebService 方法。
- 成功:在 Oracle 中,我创建了一个表、对象类型、表类型和存储过程来接受列表值。我能够使用匿名块和样本数据对此进行测试。
- 问题:我无法将列表值从 C# WebMethod 传递到我的 Oracle 存储过程。
我目前正在使用以下设置:
- Visual Studio 2017
- .NET Framework 4.6.1
- Oracle.ManagedDataAccess 18.6.0
请记住,Oracle.ManagedDataAccess 18.6.0 的版本不包含旧示例中建议的 OracleDbType.Array。
public class Automobile
{
public string Make { get; set; }
public string Model { get; set; }
public string Year { get; set; }
public string Country { get; set; }
}
using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.Types;
[WebMethod(EnableSession = true)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string InsertCars(List<Automobile> myCars, int userID)
{
DataSet dataSet = new DataSet();
using (OracleConnection sqlConnection = new OracleConnection(OracleDBConnection))
{
using (OracleCommand sqlCommand = new OracleCommand("sp_InsertCars", sqlConnection))
{
sqlConnection.Open();
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.Add(
new OracleParameter
{
CollectionType = OracleCollectionType.PLSQLAssociativeArray,
Direction = ParameterDirection.Input,
ParameterName = "p_CarList",
UdtTypeName = "tt_Automobile",
Size = myCars.Count,
Value = myCars.ToArray()
}
);
sqlCommand.Parameters.Add(
new OracleParameter
{
OracleDbType = OracleDbType.Int32,
Direction = ParameterDirection.Input,
ParameterName = "p_UserID",
Value = userID
}
);
sqlCommand.Parameters.Add(
new OracleParameter
{
OracleDbType = OracleDbType.RefCursor,
Direction = ParameterDirection.Output,
ParameterName = "o_Cursor"
}
);
using (OracleDataAdapter sqlAdapter = new OracleDataAdapter(sqlCommand))
{
sqlAdapter.SelectCommand = sqlCommand;
sqlAdapter.Fill(dataSet);
}
}
return JsonConvert.SerializeObject(dataSet);
}
}
CREATE TABLE tblCars
(
RecordID INT GENERATED BY DEFAULT AS IDENTITY NOMINVALUE NOMAXVALUE INCREMENT BY 1 START WITH 1 NOCACHE NOCYCLE NOORDER,
Make NVARCHAR2(100) NULL,
Model NVARCHAR2(100) NULL,
Year NVARCHAR2(4) NULL,
Country NVARCHAR2(100) NULL,
UserID INT NULL
);
CREATE OR REPLACE TYPE ot_Automobile AS OBJECT
(
Make varchar2(100),
Model varchar2(100),
Year varchar2(4),
Country varchar2(100)
);
CREATE OR REPLACE TYPE tt_Automobile AS TABLE OF ot_Automobile;
CREATE OR REPLACE PROCEDURE sp_InsertCars
(
p_CarList In tt_Automobile,
p_UserID In integer,
o_Cursor Out Sys_RefCursor
)
AS
BEGIN
DBMS_Output.Enable;
For RowItem In (Select * From Table(p_CarList))
Loop
Insert Into tblCars
(
Make,
Model,
Year,
Country,
UserID
)
Values(
RowItem.Make,
RowItem.Model,
RowItem.Year,
RowItem.Country,
p_UserID
);
End Loop;
-- Return our results after insert
Open o_Cursor For
Select Make, Model, Year, Country From tblCars Where UserID = p_UserID;
EXCEPTION
When Others Then
DBMS_Output.Put_Line('SQL Error: ' || SQLERRM);
END sp_InsertCars;
COMMIT
/
结果应该允许我将我的数组对象从我的 WebService WebMethod 传递给我的 Oracle 存储过程,然后循环遍历数组的每个项目以执行插入。
这是我尝试传入的数据示例。
【问题讨论】:
-
我们通常使用关联数组。已经有很多关于这个的答案了。一个例子是答案的第二部分here,另一个网站提供this example。
-
但是这里他使用的是嵌套表。
-
嗨@MrMoose,我花了一些时间浏览您提供的示例,但它们似乎都在传递一维数组,而我试图传递一个二维数组值列表.我很乐意查看您可能拥有的任何其他示例。
-
我正在搜索我过去引用过的一些其他示例,也遇到了this。它通过多个维度。希望这对您来说是一个更好的选择。
标签: c# .net oracle stored-procedures oracle.manageddataaccess