c # извлечение разделов SQL-запроса из строки - PullRequest
0 голосов
/ 07 июня 2018

Привет всем, я ищу чистый способ извлечения разделов из моей строки запроса SQL.

Я имею в виду следующее:

Скажем, у меня есть запрос типа:

SELECT 
    poc, event, network, vendor 
FROM 
    bLine 
WHERE 
    network = 'something' 
AND 
    event = 'simple' 
OR 
    event != 'hard' 
ORDER BY 
    poc ASC

Я ищу разбиение каждого на отдельный раздел (используя словарь как способ хранения двух значений каждое):

Key      |Value
-------------------------------------
SELECT   |poc, event, network, vendor
FROM     |bLine
WHERE    |network = 'something' 
AND      |event = 'simple' 
OR       |event != 'hard' 
ORDER BY |poc 
??       |ASC

У кого-нибудь уже есть что-то подобное?Я попробовал ЭТОТ пример на SO, поскольку мне показалось, что это именно то, что я хочу сделать, но код, похоже, не работает:

enter image description here

с ошибками:

Ошибка CS0117 «TokenInfo» не содержит определения для «Пуск»

Ошибка CS0117 «TokenInfo» не содержит определения для «Пуск»Конец '

Ошибка CS0117 «TokenInfo» не содержит определения для «IsPairMatch»

ETC ETC ....

ОБНОВЛЕНИЕ

Кажется, что этот пример SO ЗДЕСЬ делает то, что мне нужно, и не имеет ошибок!:)

1 Ответ

0 голосов
/ 07 июня 2018

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

        string[] Params = { "SELECT", "FROM", "WHERE", "AND", "OR", "ORDER BY" };
        Dictionary<string, string> sqlSource = new Dictionary<string, string>();
        string sqlString = "SELECT poc, event, network, vendor FROM bLine WHERE network = 'something'";
        int i, j;

        //iterate through all the items from Params array
        for (i = 0; i < Params.Length; i++)
        {

            string result = "";

            //take next element from Params array for SELECT next will be FROM
            for (j = i + 1; j < Params.Length; j++)
            {
                int ab = sqlString.IndexOf(Params[j]);
                //Get the substring between SELECT and FROM
                if (ab > 0)
                {
                    int pFrom = sqlString.IndexOf(Params[i]) + Params[i].Length;
                    int pTo = sqlString.LastIndexOf(Params[j]);
                    result = sqlString.Substring(pFrom, (pTo - pFrom));
                }


                //if there is a string then break the loop  
                if (result != "")
                {
                    sqlSource.Add(Params[i], result);
                    break;
                }
            }

            //if result is empty which is possible after FROM clause if there are no WHERE/AND/OR/ORDER BY then get substring between FROM and end of string
            if (result == "")
            {
                int pFrom = sqlString.IndexOf(Params[i]) + Params[i].Length;
                int pTo = sqlString.Length;
                result = sqlString.Substring(pFrom, (pTo - pFrom));
                sqlSource.Add(Params[i], result);
                break;
            }

        }
...