GeoFinex Ответов: 2

C# для получения идентификатора пользователя на основе его ссылочного идентификатора (цикл внутри цикла)


Наконец я пришел к этому но имея следующую проблему

Я хочу получить все User_id далее после того, как мой введенный User_id ссылается друг на друга из таблицы по Reference_id, приведенный ниже код дает точный результат, но он извлекает все User_id от "2001 до 2005".

Я хочу, чтобы если я введу "2002" в качестве User_id из текстового поля, то он должен быть извлечен из "2003-2005"

Table_xyz столбец User_id имеет значение= 2001, 2002, 2003, 2004, 2005
Table_xyz столбец Reference_id имеет значение= 2000, 2001, 2002, 2003, 2004

var gCmd = new SqlCommand(@"SELECT User_id FROM Table_xyz", nCon); 
SqlDataAdapter Sda = new SqlDataAdapter(gCmd); 
DataTable Dt = new DataTable(); Sda.Fill(Dt); 
for (int i = 0; i < Dt.Rows.Count; i++) 
{ 
    string referenceid = Dt.Rows[i]["User_id"].ToString(); 
    var gCmd1 = new SqlCommand(@"SELECT User_id FROM Table_xyz WHERE 
                                 Reference_id = '" + referenceid + "'", nCon); 
    SqlDataAdapter Sda1 = new SqlDataAdapter(gCmd1); 
    DataTable Dt1 = new DataTable(); 
    Sda1.Fill(Dt1); 
    Response.Write(referenceid); 
}


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

Я попытался добавить "SELECT User_id FROM Table_xyz WHERE User_id = '2001'" к первой команде, но она возвращает только одно значение, где User_id соответствует "2001"

2 Ответов

Рейтинг:
1

Richard Deeming

Используйте рекурсивный запрос, и вы сможете получить все записи одним ударом:

WITH cte As
(
    SELECT
        User_id,
        '/' + CAST(User_id As varchar(max)) + '/' As path
    FROM
        Table_xyz
    WHERE
        Reference_id = @ID
    
    UNION ALL
    
    SELECT
        B.User_id,
        A.path + CAST(B.User_id As varchar(max)) + '/'
    FROM
        cte As A
        INNER JOIN Table_xyz As B
        ON B.Reference_id = A.User_id
    WHERE
        A.path Not Like '%/' + CAST(B.User_id As varchar(max)) + '/%'
)
SELECT
    User_id
FROM
    cte
;


GeoFinex

Я попробовал ваш код и это полезно для меня, но возникла новая проблема, потому что он сравнивает значения как целое число и мой User_id, Reference_id может иметь числовые и буквенно-цифровые значения, такие как " ricky_global9, peter123"

Смотри мне исправленный код:

var gCmd = new SqlCommand (@"(SELECT dIstributor_iD FROM dEmo_aCcounts WHERE
@Sponsor_id <= dIstributor_iD )", nCon);

gCmd.Параметры.AddWithValue ("@Sponsor_id", " 2723022");
SqlDataAdapter Sda = новый SqlDataAdapter(gCmd);
DataTable Dt = новый DataTable();
ПДД.Заполнить(ДТ);

for (int i = 0; i < Dt.Rows.Граф; i++)
{
Ответ.Write(Dt. Rows[i] ["dIstributor_iD"]);
}

Richard Deeming

Код, который я опубликовал, по-прежнему будет работать с буквенно-цифровыми идентификаторами. (Предполагая, что вы не нарушили свою базу данных, сохранив несколько значений в одном поле?)

Единственная потенциальная проблема заключается в том, что ваши идентификаторы включают / характер. Если они это сделают, выберите другой символ для разделения идентификаторов в пути.

GeoFinex

Да, работает, но это дает неожиданный результат, когда я изменил значения user_id на буквенно-цифровые.

Richard Deeming

Не видя образца входных данных, ожидаемого результата и фактического результата, я не могу сказать вам, в чем проблема.

Попробуйте создать демо-версию на Скрипка SQL[^].

GeoFinex

Вот скрипка http://sqlfiddle.com/#!9 / 33fbe4 / 17

Richard Deeming

Это использование MySQL, но в вашем коде вы используете SqlClient пространство имен, которое подключается только к Microsoft SQL Server.

Мой ответ будет работать в MS SQL Server 2005 или более поздней версии.

Вот обновленная скрипка: http://sqlfiddle.com/#!6/747002/1[^]

Рейтинг:
0

RickZeeland

Я думаю, что вам нужно Свойство sqlcommand.Executescalar так, см. пример здесь: Свойство sqlcommand.Метод ExecuteScalar (System. Data.SqlClient)[^]