SQL - отображать 2 столбца как 1, но по-прежнему использовать ID_Column в качестве первичного ключа - PullRequest
1 голос
/ 30 августа 2011

У меня есть таблица с 2 столбцами, идентификатором продукта и описанием продукта. В asp.NET я заполняю раскрывающийся список данными, и пользователь выбирает продукт. Поэтому мне все еще нужно использовать идентификатор в качестве идентификатора, но наличие описания продукта поможет пользователю узнать, что это за продукт.

Как это лучше всего сделать?

Это то, что у меня есть (C #):

    public static DataTable GetProductList()
    {
        DatabaseAdapter dba = DatabaseAdapter.GetInstance();
        string sqlQuery = ("SELECT PRODUCT_ID FROM PRODUCT");

        DataTable dt = new DataTable();
        dt.Load(dba.QueryDatabase(sqlQuery));
        return dt;
    }

Вот где я его связываю (C #):

    private void PopulateProductList()
    {
        try
        {
            ProductList.DataSource = BusinessLayerHandler.GetUnitList();
            ProductList.DataTextField = "PRODUCT_ID";
            ProductList.DataValueField = "PRODUCT_ID";
            ProductList.DataBind();
        }
        catch
        {
            new Logging("E00080002");
            Alert("Failed to Import Product List");
        }
    }

Текущий результат - список идентификаторов продуктов: 1, 2, 3, 4 и мне нужен ID + Описание: 1 - фотоальбом, 2 - файл, 3 - пенал

Тогда мне нужно получить значение этого списка, но мне не нужен идентификатор + описание, мне нужен только идентификатор в качестве идентификатора. Это где пока не ясно, как это делается?

String productID = ProductList.SelectedValue;

Я использую Oracle в качестве базы данных

Ответы [ 4 ]

2 голосов
/ 30 августа 2011

Попробуйте это:

public static DataTable GetProductList()
{
    DatabaseAdapter dba = DatabaseAdapter.GetInstance();
    // Return a second, aliased column that concatenates PRODUCT_ID
    // with " - " and DESCRIPTION (alias NEW_DESCRIPTION)
    string sqlQuery = ("SELECT PRODUCT_ID, PRODUCT_ID + " - " + DESCRIPTION AS NEW_DESCRIPTION FROM PRODUCT");

    DataTable dt = new DataTable();
    dt.Load(dba.QueryDatabase(sqlQuery));
    return dt;
}

private void PopulateProductList()
{
    try
    {
        ProductList.DataSource = BusinessLayerHandler.GetUnitList();
        // Assign the NEW_DESCRIPTION column to the DataTextField
        ProductList.DataTextField = "NEW_DESCRIPTION";
        ProductList.DataValueField = "PRODUCT_ID";
        ProductList.DataBind();
    }
    catch
    {
        new Logging("E00080002");
        Alert("Failed to Import Product List");
    }
}

По сути, выберите столбец PRODUCT_ID и столбцы PRODUCT_ID и DESCRIPTION, объединенные вместе - для облегчения ссылок я связал второй столбец.

Затем вы можете назначить PRODUCT_ID для DataValueField DropDownList и связанного столбца (в данном случае NEW_DESCRIPTION) для DataTextField.

EDIT

Если вы просто хотите получить идентификатор продукта (для полей значения DropDownList) и описание продукта для текста параметра раскрывающегося списка, измените параметр Выбрать следующим образом:

string sqlQuery = ("SELECT PRODUCT ID, DESCRIPTION FROM PRODUCT");

, а затем измените DataTextField и DataValueField следующим образом:

ProductList.DataTextField = "NEW_DESCRIPTION";
ProductList.DataValueField = "PRODUCT_ID";

Синтаксис для SQL может немного отличаться для Oracle (я использую синтаксис SQL Server), но концепция та же самая - если вы хотите, чтобы значение одного столбца для поля значения DropDownList и значение другого столбца для DropDownList's текстовое поле, просто выберите оба столбца из таблицы и назначьте их соответствующим образом.

Эта модификация создаст DropDownList со следующими элементами:

Photo Album
File
Pencil Box

и соответствующие значения для предметов как:

1
2
3
0 голосов
/ 30 августа 2011

Я думаю, что вам нужно изменить ваш SQL-запрос и добавить столбец выражения, подобный этому.

    string sqlQuery = ("SELECT PRODUCT_ID, PRODUCT_ID+"-"+PRODUCT_DESCRIPTION as 'ExtDescription'  FROM PRODUCT");

, а затем вам нужно установить новый столбец «ExtDescription» как DataTextField вашего выпадающего списка.

0 голосов
/ 30 августа 2011

SQL:

SQL Server:

SELECT PRODUCT_ID, (PRODUCT_ID + " - " + Description) AS MergedDescr
FROM PRODUCT

My Sql:

SELECT PRODUCT_ID, CONCAT_WS('-', 'PRODUCT_ID', 'Description') AS MergedDescr
FROM PRODUCT

примечание: concat_ws пропустит пустые строки (полезно, если ваше описание может быть нулевым или пустым) формат: concat_ws («ваш разделитель», «имя столбца», «имя столбца», .........) Описание функции по адресу: http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_concat-ws

C #:

ProductList.DataSource = BusinessLayerHandler.GetUnitList();
ProductList.DataTextField = "MergedDescr";
ProductList.DataValueField = "PRODUCT_ID";
ProductList.DataBind();

Надеюсь, это поможет

0 голосов
/ 30 августа 2011

Я бы использовал такой запрос (псевдо SQL):

SELECT P.Product_ID, P.Product_ID + ' - ' + P.Description as 'PLabel'
FROM dbo.[Product] P
ORDER BY P.ID ASC

тогда, все просто, ваша привязка становится:

ProductList.DataTextField = "PLabel";
ProductList.DataValueField = "Product_ID";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...