У меня есть следующий код, который выполняет оператор 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
к этому значению, я получил результат.
Похоже, мне нужно каким-то образом ввести свой параметр в верхний регистр, чтобы запрос работал, но я понятия не имею, как. Тем не менее, если я сделаю ToString().ToUpper()
для projectId
GUID, я получу ошибку привязки параметра.
ОЧЕНЬ ВАЖНО:
Я попытался полностью удалить предложение where
и больше не добавлять параметр, поэтому все строки в таблице должны быть возвращены, но результаты по-прежнему отсутствуют.