我有以下执行SQL语句并寻找结果的代码。
var sql = @"select BOQ_IMPORT_ID "
+ "from ITIS_PRJ.PRJ_BOQ_IMPORT_HEADER "
+ "where PROJECT_ID = :Projectid "
+ "order by CREATED_ON desc "
+ "fetch first 1 row only";
using (var conn = new OracleConnection(ApplicationSettings.ConnectionString))
using (var cmd = new OracleCommand(sql, conn))
{
conn.Open();
cmd.Parameters.Add(LocalCreateParameterRaw("ProjectId", projectId));
var reader = cmd.ExecuteReader();
if (reader.Read())
{
byte[] buffer = new byte[16];
reader.GetBytes(0, 0, buffer, 0, 16);
var boqId = new Guid(buffer);
return boqId;
}
return null;
}
其中LocalCreateParameterRaw
声明为:
public static OracleParameter LocalCreateParameterRaw(string name, object value)
{
OracleParameter oracleParameter = new OracleParameter();
oracleParameter.ParameterName = name;
oracleParameter.OracleDbType = OracleDbType.Raw;
oracleParameter.Size = 16;
oracleParameter.Value = value;
return oracleParameter;
}
“ projectId”的基础类型是“ Guid”。
将if (reader.Read())
始终计算为false
,尽管那里是在表中的一行。它通常应该只返回一行。
使用GI Oracle Profiler,我可以捕获发送到db的SQL,但事件探查器仅提供一次:ProjectId
参数值,并且使用小写形式。像这样,它没有返回任何结果,但是一旦我将其应用于UPPER
该值,便会得到结果。
看来我必须以某种方式将我的参数转换为大写字母才能使查询正常工作,但是我不知道该怎么做。但是,如果我ToString().ToUpper()
在projectId
GUID上执行操作,则会收到参数绑定错误。
非常重要:我尝试where
完全删除该子句,并且不再添加参数,因此应该返回表中的所有行,但仍然没有结果。
我不知道如何,但是将SQL字符串变成逐字字符串(以开头@
)会使proc工作。因此,它不适用于:
var sql = @"SELECT BOQ_IMPORT_ID "
+ "FROM ITIS_PRJ.PRJ_BOQ_IMPORT_HEADER "
+ "WHERE PROJECT_ID = :projectid "
+ "ORDER BY CREATED_ON DESC "
+ "FETCH FIRST ROW ONLY";
但是,SQL Developer中的相同命令字符串会执行并返回结果。当使我的SQL字符串完全不变时,如下所示,我得到了结果。
var sql = @"select BOQ_IMPORT_ID
from ITIS_PRJ.PRJ_BOQ_IMPORT_HEADER
where PROJECT_ID = :ProjectId
order by CREATED_ON desc
fetch first 1 row only";
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句