【发布时间】:2019-10-27 20:46:29
【问题描述】:
我有以下代码执行 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,我可以捕获发送到数据库的SQL,但只有一次分析器为:ProjectId 参数提供了一个值,而且它是小写的。就像它没有返回任何结果一样,但是一旦我将UPPER 应用于该值,我就会得到一个结果。
看起来我必须以某种方式将参数转换为大写才能使查询工作,但我不知道如何。但是,如果我在 projectId GUID 上执行 ToString().ToUpper(),则会收到参数绑定错误。
非常重要:
我已经尝试完全删除where 子句,不再添加参数,所以应该返回表中的所有行,但仍然没有结果。
【问题讨论】:
-
如果您的查询总是只返回一行一列,那么您可以考虑
cmd.ExecuteScalar(); -
@WernfriedDomscheit 不。
ExecuteScalar返回null。 -
@ProfK - 看看这是否直接相关,它与 Guid 在 .net 和 oracle 之间的翻译方式有关。 Convert from Oracle's RAW(16) to .NET's GUID
-
如果您仍然遇到问题,如果您包含基础类型和变量
projectId的值(变量用作查询中的参数),将会有所帮助。 -
@Igor 我已经添加了,类型是'Guid'。
标签: oracle ado.net oracle12c datareader