Member 13147658 Ответов: 2

Как мне решить эту проблему? Я был бы очень признателен за помощь.


Я хочу получить clinicID в общей таблице по ClinicName и отправить clinicID пользователю, когда он зарегистрируется.

Что я уже пробовал:

int clinicId;
            string sqlClinicID = "SELECT ClinicID FROM GENERAL WHERE ClinicName ='" + txtClinicName.Text + "'";
             cmd = new SqlCommand(sqlClinicID, con);
             SqlDataReader rd = cmd.ExecuteReader();

            while (rd.Read())
            {
                clinicId = Convert.ToInt32(rd[0].ToString());
            }
            con.Close();
            
            sendMsg(clinicId, username, txtPassword.Text, email);

2 Ответов

Рейтинг:
17

OriginalGriff

Для начала, не делай этого так! Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Во-вторых, если в вашей БД есть только одно совпадающее значение, то зачем нужен цикл?

В-третьих, если это целое число в вашей БД, зачем преобразовывать его в строку, чтобы преобразовать обратно в целое число?

В-четвертых, вам нужно избавиться от SqlCommands, SqlReaders, SqlConnections, когда вы закончите с ними.

Попробовать это:

int clinicId;
string sqlClinicID = "SELECT ClinicID FROM GENERAL WHERE ClinicName =@CN";
using (SqlCommand cmd = new SqlCommand(sqlClinicID, con))
   {
   cmd.Parameters.AddWithVaue("@CN", txtClinicName.Text); 
   clinicId = (int) cmd.ExecuteScalar();
   sendMsg(clinicId, username, txtPassword.Text, email);
   }
Если это не решит вашу проблему, вам нужно объяснить более подробно, что именно происходит не так.


Спасибо, что это помогло мне, но я получаю ошибку на этой линии.
System.NullReferenceException: Object reference not set to an instance of an object.
clinicId = (int)cmd.ExecuteScalar();

Это потому, что нет соответствующего элемента - и ваш код не проверяет ввод пользователя. Когда вы не позволяете пользователю делать ошибки, ваш код будет терпеть неудачу - а пользователи делают ошибки все время: черт возьми, мне пришлось исправлять опечатки, пока я печатал это!
А когда совпадения нет, SQL не возвращает никаких строк.

Поэтому всегда позволяйте своим пользователям делать ошибки и обращаться с ними изящно:
int clinicId = -1;
string sqlClinicID = "SELECT ClinicID FROM GENERAL WHERE ClinicName = @CN";
using (SqlCommand cmd = new SqlCommand(sqlClinicID, con))
    {
    cmd.Parameters.AddWithValue("@CN", txtClinicName.Text);
    object o = cmd.ExecuteScalar();
    if (o == null)
        {
        ... Report problem to user...
        return;
        }
    clinicId = (int)o;
    sendMsg(clinicId, username, txtPassword.Text, email);
    }


Member 13147658

Спасибо, что это помогло мне, но я получаю ошибку на этой линии.

System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта.


clinicId = (int)cmd.Executescalar так();

Maciej Los

5ed!

Рейтинг:
0

pabitra behera

Я думаю, что так будет лучше

<pre>int clinicId = -1;
string sqlClinicID = "SELECT ClinicID FROM GENERAL WHERE ClinicName = @CN";
using (SqlCommand cmd = new SqlCommand(sqlClinicID, con))
    {
    cmd.Parameters.AddWithValue("@CN", txtClinicName.Text);
    object result= cmd.ExecuteScalar();
    if (result.Length>0)
        {
        clinicId = (int)result;
        }else
{
// An error Occurs 
return
}
   
    sendMsg(clinicId, username, txtPassword.Text, email);
    }


OriginalGriff

Причина моего голосования одна: Когда вы публикуете решение, оно должно работать. Он должен, по крайней мере, компилироваться.
ExecuteScalar не возвращает строку, он возвращает объект - поэтому ваш код не сможет выполнить компиляцию с "не может неявно преобразовать тип 'object' в 'string'. Существует явное преобразование (вы пропускаете приведение?)"
Предполагая, что это было исправлено, Execute scalar возвращает null, если никакие элементы не найдены, поэтому ваш тест if завершится неудачей во время выполнения с исключением ссылки null, когда вы попытаетесь использовать свойство Length нулевого значения.
Предполагая, что это было исправлено, вы не можете привести строку к int, даже если она содержит целочисленное значение в виде строки - вы должны либо использовать Convert.ToInt32 (плохая идея) или Parse / TryParse (хорошая идея).

"Лучшие" идеи-это те, которые работают, а не те, которые даже не компилируются и не запускаются. Пожалуйста, Протестируйте свой код, прежде чем публиковать его в качестве решения в будущем.

Member 13147658

Большое вам спасибо, что это сработало.

Dave Kreskowiak

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