Почему этот запрос дает мне ссылку на объект, а не экземпляр объекта?

Этот код:

string SidFinch = "Unknown SidFinch";

String sql = @"SELECT SidFinch 
           FROM PlatypusDuckbillS 
           WHERE PlatypusSTARTDATE = :Duckbilldate AND 
                   DuckbillID = :Duckbillid";
try {
    using (OracleCommand ocmd = new OracleCommand(sql, oc)) {
        ocmd.Parameters.Add("Duckbilldate", DuckbillDate);
        ocmd.Parameters.Add("Duckbillid", DuckbillID);
        SidFinch = ocmd.ExecuteScalar().ToString();
}

... терпит неудачу в строке "ExecuteScalar". Он ничего не находит (нет соответствующей записи для идентификатора, который я передал), но это не должно вызывать эту проблему, не так ли?


person B. Clay Shannon    schedule 31.05.2012    source источник
comment
Просто говорю... шикарно... pastie.org/4003886   -  person Marc Gravell    schedule 01.06.2012


Ответы (1)


Если он ничего не находит, то, предположительно, .ExecuteScalar() возвращает NULL, и не стоит вызывать .ToString() на NULL ....

Вам нужно изменить свой код, чтобы он выглядел примерно так:

object result =  ocmd.ExecuteScalar();

if(result != null)
{
    SidFinch = result.ToString();
} 
else
{
     // do whatever is appropriate here....
}
person marc_s    schedule 31.05.2012
comment
Если я опускаю .ToString(), который я получаю, невозможно неявно преобразовать тип «объект» в «строку». Существует явное преобразование (вам не хватает приведения?) - person B. Clay Shannon; 01.06.2012
comment
Это потому, что SidFinch — это строка. Выполните нулевую проверку перед преобразованием в строку. - person Yatrix; 01.06.2012
comment
@Clay да, но это зависит от того, какой тип SidFinch и может ли он быть нулевым. Либо приведение (string)ocmd.ExecuteScalar(), либо Convert.ToString(ocmd.ExecuteScalar()) должно работать. - person Marc Gravell; 01.06.2012
comment
вы можете использовать SidFinch = ocmd.ExecuteScalar() как строку, а затем проверить, не является ли она нулевой. это похоже на ваш вопрос - person YavgenyP; 01.06.2012
comment
@Marc: Да, Convert.ToString(ocmd.ExecuteScalar()); работает. Так же как и UCID = (String)ocmd.ExecuteScalar(); Марки действительно в деле. - person B. Clay Shannon; 01.06.2012