我有一个SQL查询,我将C#变量传递给我的Oracle DB。
我无法将C#datetime变量" PROCESS_DATE"传递到我的应用程序中的查询中。我没有得到任何记录。如果我将查询复制到我的oracle开发人员工具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
答案 0 :(得分:1)
根据我的评论,请尝试以下内容并查看此解决方案。
如果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
。
答案 1 :(得分:1)
除非我完全误解了你的问题,否则我认为你可能会比实际需要更难。 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
}
答案 2 :(得分:0)
首先,我了解到我的代码不会进入下面的代码,除非我确实有记录返回给我。
OracleDataReader dataReader = mDataAccess.SelectSqlRows ( oracleConnection, oracleCommand, sqlCommand, parameters );
while ( dataReader.Read ( ) )
{
groupEntityFacilityRptList.Add ( ReadRecord ( dataReader ) );
}
其次,要让ProcessDate工作,我需要从我的View中获取字符串,将其转换为日期时间,然后将其格式化为字符串。它可能不是最佳实践,但它有效。
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
};
}