#mysql #.net #powershell
#mysql #.net #powershell
Вопрос:
У меня есть программа, которая позволяет пользователям запускать пользовательские запросы к нескольким базам данных. Программа использует .net connector для MySQL, который создает объекты connection, command и DataAdapter.
Цель состоит в том, чтобы получить все таблицы / столбцы, к которым обращается запрос. Я знаю, что мог бы проанализировать запрос, чтобы получить их, но подумал, что должен быть более простой способ с использованием соединителя.
Мне также было бы интересно решение, которое использует какой-либо запрос? Объяснение этого не делает.
Пример: Table1
col1 | col2 | col3 | col4 |
---|---|---|---|
тест1 | tes2 | test3 | test4 |
Запрос:
Select col1 as 'name', col2 as 'first' from Table1;
Я хочу получить массив столбцов (не псевдонимов), которые были использованы, в данном случае -> col1, col2. Я просмотрел множество документов и не смог найти ничего подобного. Я предполагаю, что где-то в объектах соединения должен быть кэш метаданных.
Настройка соединителя (Powershell):
$ConnectionString = "server=" $MySQLHost ";port=$Mysqlport;uid=" $Mysqluser ";pwd=" $Mysqlpass ";database=" $Database ";allow zero datetime=true;"
[void][System.Reflection.Assembly]::LoadWithPartialName("MySql.Data")
$Connection = New-Object MySql.Data.MySqlClient.MySqlConnection
$Connection.ConnectionString = $ConnectionString
$Connection.Open()
$Command = New-Object MySql.Data.MySqlClient.MySqlCommand($Query, $Connection)
$command.CommandTimeout = 7200;
$DataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($Command)
$DataSet = New-Object System.Data.DataSet
$RecordCount = $dataAdapter.FillAsync($dataSet, "data")
$results = $DataSet.Tables[0]
Комментарии:
1. Вам нужен план выполнения , но я не уверен, как получить его из кода, хотя
EXPLAIN
это может помочь.2.
EXPLAIN whatever;
из клиентского кода возвращается результирующий набор, как и любой другой запрос.3. Спасибо за предложение здесь.
EXPLAIN
предоставляет мне таблицы, к которым осуществляется доступ, но не столбцы.
Ответ №1:
Какие столбцы используются в следующих запросах?
SELECT COUNT(*) FROM mytable WHERE userid = 123;
SELECT col1 col2 AS myalias FROM mytable
SELECT CURDATE();
SELECT a, b, c FROM table1
UNION
SELECT x, y, z FROM table2;
SELECT EXISTS ( SELECT * FROM mytable WHERE user_id = 123);
WITH RECURSIVE cte ( ... ) SELECT * FROM cte;
Вы поняли идею. SQL — это мощный язык, с множеством случаев, которые затрудняют сопоставление исходного столбца и таблицы с каждым столбцом результирующего набора.
Комментарии:
1. Очень верно, но даже с этими запросами движок делает перекрестные ссылки на них, чтобы убедиться, что они существуют. Я полагал, что эта информация будет храниться в некоторых метаданных. Похоже, что синтаксический анализ запроса может быть правильным решением, таким образом, я могу учитывать эти типы операторов.
2. Это делается внутри, но я не знаю ни одной системы, которая предоставляет метаданные клиенту.