【发布时间】:2021-05-16 17:21:22
【问题描述】:
我在调试时通过 C# 连接到 Oracle,出现以下错误: Oracle.ManagedDataAccess.Client.OracleException:“ORA-01843:无效月份”。 我以为是路线。更改通过 url 获取变量的方式没有帮助。
Oracle 程序:
PROCEDURE TestSelect(YEARp IN INT, MONTHp IN INT, pResult OUT SYS_REFCURSOR) IS
BEGIN
OPEN pResult FOR
SELECT SUM(LOAD_MATERIALS), REG_DATE
FROM PRODUCTION
WHERE EXTRACT(MONTH FROM REG_DATE) = EXTRACT(MONTH FROM TO_DATE(MONTHp, 'MM')) AND EXTRACT(YEAR FROM REG_DATE) = EXTRACT(YEAR FROM TO_DATE(YEARp, 'YYYY'))
GROUP BY REG_DATE;
END TestSelect;
C#:
[HttpGet("test")]
public List<Charts> GetCertainEmployees(int month, int year)
{
List<Charts> SelectPerem = new List<Charts>();
string conString = "User Id=*; Password=*; Data Source=*";
using (OracleConnection con = new OracleConnection(conString))
{
using (OracleCommand cmd = con.CreateCommand())
{
try
{
con.Open();
cmd.BindByName = true;
cmd.CommandText = "PACKAGE_PRACTICE.TestSelect";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("YEARp", OracleDbType.Int32, month, ParameterDirection.Input);
cmd.Parameters.Add("MONTHp", OracleDbType.Int32, year, ParameterDirection.Input);
var pResult = new OracleParameter("pResult", OracleDbType.RefCursor, ParameterDirection.Output);
cmd.Parameters.Add(pResult);
cmd.ExecuteNonQuery();
var res = (OracleRefCursor)pResult.Value;
var reader = res.GetDataReader();
while (reader.Read())
{
Charts s = new Charts();
s.LOAD_MATERIALS = Convert.ToInt32(reader[0]);
s.REG_DATE = Convert.ToString(reader[1]);
SelectPerem.Add(s);
}
}
finally
{
con.Close();
con.Dispose();
}
}
}
return SelectPerem;
}
错误发生在这一行:
while (reader.Read()) {
【问题讨论】:
-
将月/年整数值转换为日期然后再转换回整数是没有意义的。只需使用
WHERE EXTRACT(MONTH FROM REG_DATE) = MONTHp AND EXTRACT(YEAR FROM REG_DATE) = YEARp -
REG_DATE的数据类型是什么? -
@Wernfried Domscheit,日期