Почему при компиляции возникает ошибка «Использование неназначенной локальной переменной»?

я получаю эту ошибку, но не знаю почему, я получаю ее здесь: Label1.Text = fgmail.ToString (); а вот полный код:

string st = this.pfun.Text;
string sqlstr2 = "select * from hsinfo WHERE rname='" + st + "'";
OleDbCommand cmd = new OleDbCommand(sqlstr2, DBFunction.GenerateConnection("DBS.accdb"));
OleDbDataReader reader = cmd.ExecuteReader();
string fgmail;

while (reader.Read())
{
    fgmail = reader[1].ToString();
}

Label1.Text = fgmail.ToString();

person Raghad    schedule 25.06.2019    source источник
comment
У вас есть уязвимость SQL-инъекций.   -  person SLaks    schedule 25.06.2019
comment
что ты имеешь в виду под последним? читатель [1] имеет в виду последнюю?   -  person Raghad    schedule 25.06.2019
comment
Вы делаете SELECT, а затем читаете все результаты. Вы устанавливаете fgmail равным reader[1] для каждого результата, что означает, что когда вы закончите, fgmail получит свое значение из последней строки. В таком случае зачем перебирать их все, если вам нужно только одно значение? В вашем запросе также нет ORDER BY, поэтому, если есть несколько результатов, нельзя сказать, какой из них вы получите. Если вы ожидаете, что будет только один результат, возможно, измените запрос, чтобы выбрать один столбец (не SELECT *) и использовать ExecuteScalar вместо читателя.   -  person Scott Hannen    schedule 25.06.2019
comment
Если вы ожидаете от вашего запроса ноль или одну запись, лучше использовать if (reader.Read()) вместо while (reader.Read()).   -  person LarsTech    schedule 25.06.2019
comment
Перед присвоением строковой переменной проверьте, имеет ли переменная reader [1] значение или нет. string.IsNullOrEmpty (читатель [1] .ToString ());   -  person goofyui    schedule 25.06.2019


Ответы (2)


Если reader не имеет строк, переменная никогда не будет назначена.

person SLaks    schedule 25.06.2019
comment
можно это упростить? - person Raghad; 25.06.2019
comment
В логике есть несколько проблем. Посмотрите комментарий от @ Scott-Hannen. Вы можете инициализировать свою строку строкой fgmail = String.Empty. Это инициализирует вашу строку пустой строкой - person Anil Goel; 25.06.2019

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

person ipedrosa    schedule 25.06.2019