2012-04-25 4 views
0

У меня возникает проблема, которая для меня поражает. Я заметил, что IDataReader.Read() действует по-разному в зависимости от того, как установлен IDbCommand.CommandText.Несогласованное поведение с использованием IDataReader.Read()

В приведенном ниже коде - если «AID» установлен и передан в EntAgencyId(), reader.Read() возвращает true, и программа может войти в цикл while. Если я просто установил «запрос» в EntAgencyId() с использованием того же значения, которое я передаю функции («455»), программа никогда не сможет ввести цикл while (такое же поведение происходит при передаче «AID» из textbox.text).

public string EntAgencyId(string AID) 
{ 
    cmd = uasConnection.CreateCommand(); 
    //query = "select * from EnterpriseAgencyTbl where AOCId = " + AID; //<--Works 
    query = "select * from EnterpriseAgencyTbl where AOCId = 455"; //<--Causes issue 

    cmd.CommandText = query; 
    reader = cmd.ExecuteReader(); 

    while (reader.Read()) 
    { 
     EntAgId = reader["Id"].ToString(); 
     AgencyName = reader["Name"].ToString(); 
    } 

    reader.Close(); 
    return AgencyName; 
} 

При отладке, «запрос» всегда имеет то же значение, так почему же это делает разницу с .read().

Пища для размышлений - .Read() возвращает true, если есть больше строк; в противном случае - false. В этом случае я попробовал просто прочитать первую одиночную строку с использованием свойства Item и GetValue(), оба из них приводят к ошибке «Объект, не установленный в экземпляр объекта».

У меня полностью закончились идеи, поэтому любая помощь будет оценена!

+1

Я * сильно * подозреваю, что ваши диагностические данные неверны. Одна строка запроса была построена, ничто не заботится о том, как она была построена. (И вы не должны строить запрос, используя значение текстового поля как часть SQL, конечно. Используйте параметризованный SQL вместо этого.) –

+0

Не могли бы вы добавить код, который вызывает 'EntAgencyId'? – phoog

+0

Из любопытства, какой тип столбца AOCId? И передаете ли вы строку «455» (с тиковыми кавычками) в функцию? или "455"? –

ответ

2

Если AID может исходить из ненадежного источника, тогда вы должны действительно использовать параметры.

Используйте следующий код вместо:

query = "select * from EnterpriseAgencyTbl where AOCId = @AOCId"; 

cmd.CommandText = query; 
cmd.Parameters.Add(new SqlParameter("@AOCId", SqlDbType.Int) { Value = int.Parse(AID) }); 

Затем посмотреть, если это ведет себя одни и те же с использованием статических входов, таких как:

cmd.Parameters.Add(new SqlParameter("@AOCId", SqlDbType.Int) { Value = 455 }); 

Примечание: Я делаю предположение, основанное на " Id 'в имени, что AOCId является типом int.

+0

+1 для параметризованных запросов. – zimdanen

Смежные вопросы