Проблема с получением данных из таблицы с помощью Execute Scalar (C#) - PullRequest
0 голосов
/ 21 марта 2020

У меня есть две таблицы, одна называется DogContract, а другая - WeeklyBooking. Оба они имеют два столбца, называемых ContractLength и DogID.

В настоящее время я программирую функцию для пользователя, чтобы использовать GUI для ввода нового объекта WeeklyBooking в таблицу. Я пытаюсь получить значение ContractLength . У меня есть текстовое поле, в котором пользователь вводит DogID , и теоретически мой код состоит в том, чтобы взять значение ContractLength из DogContract и затем назначить его в качестве ContractLength для объекта еженедельного бронирования. У меня есть функция в моем классе WeeklyBookingDataAccess, чтобы сделать это:

        public int getContractLength(string dogID, WeeklyBooking week)
    {
        SqlCommand getCLength = new SqlCommand("SELECT ContractLength FROM WeeklyBooking WHERE DogID =" + dogID);
        try
        {
            db.Conn.Open();
            week.contractLength = (int)db.Cmd.ExecuteScalar();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        return week.contractLength;
    }

Этот метод вызывается в функции, которую я использую для создания объекта WeeklyBooking. Проблема в том, что когда я проверяю данные таблицы, значение ContractLength всегда устанавливается в ноль. У кого-нибудь есть идеи, как решить эту проблему? -Спасибо

1 Ответ

1 голос
/ 21 марта 2020

Вы делаете что-то странное с Connection и SqlCommand. Это должно работать:

public int getContractLength(string dogID, WeeklyBooking week)
{
    SqlCommand getCLength = new SqlCommand("SELECT ContractLength FROM WeeklyBooking WHERE DogID = @DogId", db.Conn);
    try
    {
        getCLength.Parameters.Add("@DogId", SqlDbType.NVarChar, 64);
        getCLength.Parameters["@DogId"].Value = dogID;
        db.Conn.Open();
        week.contractLength = (int)getCLength.ExecuteScalar();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    return week.contractLength;
}

Вам необходимо связать ваше соединение и вашу SqlCommand. Вы можете сделать это, передав Соединение конструктору SqlCommand или попросив Соединение создать команду.

Кроме того, вы должны взглянуть на шаблон использования и убедиться, что ваше Соединение и SqlCommand созданы и уничтожены в правильном пути. Также обратите внимание, что я использую именованный параметр, это лучшая практика, поэтому вы не открыты для SQL -инъекции.

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

public int getContractLength(string dogID, WeeklyBooking week)
{
    SqlCommand getCLength = new SqlCommand("SELECT ContractLength FROM WeeklyBooking WHERE DogID = @DogId", db.Conn);
    try
    {
        getCLength.Parameters.AddWithValue("@DogId", dogID);
        db.Conn.Open();
        week.contractLength = (int)getCLength.ExecuteScalar();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    return week.contractLength;
}
...