将 C# 日期时间值传递给 Oracle DB Query
本文关键字:Oracle DB Query 值传 日期 时间 | 更新日期: 2023-09-27 18:31:26
我有一个SQL查询,我正在将C#变量传递到我的Oracle DB。
我在将 C# 日期时间变量"PROCESS_DATE"传递到应用程序中的查询时遇到问题。 我没有取回任何记录。 如果我将查询复制到我的预言机开发人员工具 TOAD 中,它工作正常,我会得到多条记录。
这是我在应用程序中使用的查询:
String SelectAllSQL = "SELECT * FROM REALMS_AUDIT.R2_GROUP_QUERY_RPT WHERE PROCESS_DATE = :pPROCESS_DATE";
我还尝试将 datetime 变量转换为 shortDateString(),以便它与数据库完全匹配,然后我使用了 TO_DATE 函数,如果我直接在 TOAD 中查询日期,我必须使用它,没有任何运气。 shortDateString() 将我的日期更改为:1/16/2016
,这是我所需要的,但 OracleDataReader 不喜欢它。 这里是带有TO_DATE函数的查询:
String SelectAllSQL = "SELECT * FROM REALMS_AUDIT.R2_GROUP_QUERY_RPT WHERE PROCESS_DATE = TO_DATE(:pPROCESS_DATE, 'MM-DD-YYYY'";
:pROCESS_DATE
是传入的日期时间变量。
C# 和 Oracle 之间必须有一个与处理日期时间变量相关的细分。 我正在使用Oracle DataReader来处理查询。
OracleDataReader dataReader = mDataAccess.SelectSqlRows ( oracleConnection, oracleCommand, sqlCommand, parameters );
while ( dataReader.Read ( ) )
{
groupEntityFacilityRptList.Add ( ReadRecord ( dataReader ) );
}
如果我使用 TO_DATE 函数,应用程序将不会单步执行 while 循环。 如果我使用原始查询,它会返回,但不返回任何数据。
日期时间变量 PROCESSDATE 如下所示:
1/16/2016 12:00:00 AM
我注意到它上面有一个时间戳,所以我不确定这是否是问题所在。
Oracle 中的数据如下所示:
1/16/2016
除非我完全误解了你的问题,否则我认为你可能会让这件事变得比它需要的更难。 ODP.net 为您处理所有这些肮脏的工作。 如果 PROCESS_DATE
是 Oracle 中实际的DATE
数据类型,则只需向其传递一个实际的 C# DateTime
变量,然后 ODP.net 完成繁重的工作。 无需进行任何类型的转换,前提是您传递的是实际日期:
DateTime testDate = new DateTime(2015, 7, 16);
OracleCommand cmd = new OracleCommand(
"SELECT * FROM REALMS_AUDIT.R2_GROUP_QUERY_RPT WHERE PROCESS_DATE = :pPROCESS_DATE",
conn);
cmd.Parameters.Add(new OracleParameter("pPROCESS_DATE", OracleDbType.Date));
cmd.Parameters[0].Value = testDate;
OracleDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
object o = reader.IsDBNull(0) ? null : reader.GetValue(0);
}
reader.Close();
如果你在 C# 中的数据不是日期,我建议在尝试之前先把它定为日期:
DateTime testDate;
if (DateTime.TryParse(testDateString, out testDate))
{
// run your query
}
根据我的评论,请在下面尝试并查看此解决方案。
TRUNC(TO_DATE(:pPROCESS_DATE,'MM-DD-YYYY HH:MI:SS AM'))
格式是否pROCESS_DATE
1/16/2016 12:00:00 AM
。
TRUNC(TO_DATE(:pPROCESS_DATE,'DD-MM-YYYY HH:MI:SS AM'))
pROCESS_DATE
格式是否为 16/1/2016 12:00:00 AM
.
首先,我了解到我的代码不会进入下面的代码,除非我真的有记录返回给我。
OracleDataReader dataReader = mDataAccess.SelectSqlRows ( oracleConnection, oracleCommand, sqlCommand, parameters );
while ( dataReader.Read ( ) )
{
groupEntityFacilityRptList.Add ( ReadRecord ( dataReader ) );
}
其次,要使 ProcessDate 正常工作,我需要获取来自我的视图的字符串,将其转换为日期时间,然后将其格式化为字符串。 这可能不是最佳实践,但它奏效了。
public JsonResult GetGroupReportData ( String reportDate )
{
DateTime processDate = DateTime.Parse ( reportDate );
var monthlyReport = SelectAllGroupRprt (processDate.ToString("MM/dd/yyyy");
return new JsonResult ( )
{
Data = monthly,
MaxJsonLength = Int32.MaxValue
};
}