C# Как правильно получить двойные значения из базы данных с помощью DataAdapter?

Язык: C# БД: Доступ (Итак, OleDbDataAdapter)

Контекст:

В моем текущем проекте я создаю своего рода построитель запросов sql. В зависимости от того, что пользователь выбирает из раскрывающегося списка, команда sql может выглядеть так, не уверен, что она имеет отношение к вопросу, хотя [] являются столбцами/таблицей () являются раскрывающимися опциями, круглых скобок на самом деле нет:

Select * From [db] where [Date] (between) @value1 and @value2 AND [ID] (=) @ID AND [Usd] (=) @Usd

Ну, вы поняли идею.

Я запускаю это через следующий код:

sbuilder = new StringBuilder();

sbuilder.Append("Select * FROM ").Append(Current_Table).Append(" WHERE ");

using (OleDbConnection connection = new OleDbConnection(Con))
        {
            connection.Open();
            string query = sbuilder.ToString();
            OleDbDataAdapter da = new OleDbDataAdapter(query, connection);
            da.SelectCommand.Parameters.Clear();

//some code to build the string, AND build the select parameters, here's the important one though

            da.SelectCommand.Parameters.AddWithValue("@USD", Convert.ToDouble(FilterUSD.Text));
            DataTable dt = new DataTable();
            da.Fill(dt);
            DGVMain.DataSource = dt;
            connection.Close();
        }

Моя проблема:

Когда я получаю значения, как вы ожидаете, они должны соответствовать значению FilterUSD.Text, поэтому, когда пользователь ищет 12, а БД содержит 12,31251, он вернет 0 строк. Как мне сделать так, чтобы, когда параметр равен 12, он возвращал все значения, которые имеют базовое значение 12 и любые последующие десятичные значения. Примеры, которые я просмотрел в Интернете, похоже, предлагают использовать средство чтения данных sql и извлекать значения в переменную Double.

Как мне действовать в контексте использования адаптера данных, который я использую в настоящее время, для заполнения таблицы данных? (и позже, datagridview)

Я подозреваю, что мне придется использовать параметры моей команды выбора.

Нашел эту ссылку, я не знаю, как преобразовать ее для моего использования в качестве таблицы данных: Читать десятичный из базы данных SQL Server


person Aroueterra    schedule 30.05.2017    source источник


Ответы (2)


Я предполагаю, что вы всегда ищете только положительные целые числа, так что вот два способа, которые я могу придумать. Я бы, наверное, выбрал первый, на случай, если с функцией CAST произойдет что-то неожиданное.

Добавьте два сравнения в предложение WHERE, чтобы подобрать записи, превышающие или равные вашему параметру поиска, и записи, меньшие, чем ваш параметр поиска + 1.

[Usd] >= 12 AND [Usd] < 13

Приведите поле db к типу int в предложении WHERE, чтобы удалить десятичные разряды.

cast([Usd] as int) = 12

РЕДАКТИРОВАТЬ: не знал, что вы используете Access (выше для SQL Server). Вместо этого следует использовать: Int([Usd]) = 12.

Если вы хотите работать и с отрицательными числами, вы получите разные результаты из этих двух вариантов.

person James    schedule 30.05.2017
comment
К сожалению, мне нужно искать отрицательные числа. - person Aroueterra; 30.05.2017
comment
Для отрицательных чисел при поиске -12 хотите ли вы, чтобы -12.31251 отображалось (показывать диапазон от -13 до -12) или не отображалось (показывало диапазон от -12 до -11) - person James; 30.05.2017
comment
Для поиска положительных или отрицательных чисел используйте: Fix([Usd]) = 12. - person Gustav; 30.05.2017

Select * From [db] where [Date] (between) @value1 and @value2 AND [ID] (=) @ID AND left([Usd],len(Usd)) (=) @Usd

код, который я добавил, - это левая функция. Я не знаю, работает ли это с доступом, но я использовал это в sql, чтобы попробовать. если БД содержит 12.33321, а ваше имя параметра «@Usd» равно 12, БД даст вам только все число, которое вы хотели, и если -12, но БД содержит -12.3123, он все равно даст вам -12.

person Joshua Sanchez    schedule 30.05.2017