C # MySQL параметр addwithvalue на SELECT IP, Estado FROM @table не работают - PullRequest
0 голосов
/ 24 мая 2018

У меня есть метод "LeerTabla" в классе C #, который дает имя таблицы в базе данных MySQL и возвращает столбцы ip и estado, я безуспешно пробовал параметры:

Сначала с AddWithValue, вызывая методс "secot" obj.LeerTabla("secot"):

    public void LeerTabla(string NombreTabla)
    {
        string SQLCmdStr;
        try
        {
            SQLCmdStr = "SELECT ip, estado FROM @tabla";
            MySqlCommand SQLcmd = new MySqlCommand(SQLCmdStr, SqlDBconn);
            SQLcmd.Prepare();
            SQLcmd.Parameters.AddWithValue("@tabla", NombreTabla);
            MySqlDataReader SQLReader = SQLcmd.ExecuteReader();

            while(SQLReader.Read())
            {
                TablaDeIP.Add(SQLReader["ip"].ToString());
                ListaDeEstado.Add(SQLReader["estado"].ToString());
            }
        }
        catch (MySql.Data.MySqlClient.MySqlException ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

Затем с Add:

public void LeerTabla(string NombreTabla)
{
    string SQLCmdStr;
    try
    {
        SQLCmdStr = "SELECT ip, estado FROM @tabla";
        MySqlCommand SQLcmd = new MySqlCommand(SQLCmdStr, SqlDBconn);
        MySqlParameter parametro = new MySqlParameter();
        parametro.ParameterName = "@tabla";
        parametro.Value = NombreTabla;
        SQLcmd.Parameters.Add(parametro);
        MySqlDataReader SQLReader = SQLcmd.ExecuteReader();

        while(SQLReader.Read())
        {
            TablaDeIP.Add(SQLReader["ip"].ToString());
            ListaDeEstado.Add(SQLReader["estado"].ToString());
        }
    }
    catch (MySql.Data.MySqlClient.MySqlException ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Оба дали мне одно и то же исключение: "У вас ошибка в синтаксисе SQL; проверьте руководствоэто соответствует вашей версии сервера MySQL для правильного синтаксиса, чтобы использовать около "secot" в строке 1 "...

Но если я не использую параметры, это работает ОК:

    public void LeerTabla(string NombreTabla)
    {
        string SQLCmdStr;
        try
        {
            SQLCmdStr = "SELECT ip, estado FROM secot";
            MySqlCommand SQLcmd = new MySqlCommand(SQLCmdStr, SqlDBconn);
            SQLcmd.Prepare();
            MySqlDataReader SQLReader = SQLcmd.ExecuteReader();

            while(SQLReader.Read())
            {
                TablaDeIP.Add(SQLReader["ip"].ToString());
                ListaDeEstado.Add(SQLReader["estado"].ToString());
            }
        }
        catch (MySql.Data.MySqlClient.MySqlException ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

Что я делаю не так?любая помощь будет отличной.

1 Ответ

0 голосов
/ 24 мая 2018

Параметры предназначены для использования со значениями, а не с именами таблиц.Следовательно, вы не можете параметризировать имена таблиц в строке запроса, как это делают значения.

Наиболее распространенный способ предоставления динамического имени таблицы - это объединение имени таблицы в строку запроса, но этот подход все еще подвержен внедрению SQL:

SQLCmdStr = string.Format("SELECT ip, estado FROM {0}", NombreTabla);

Если вы хотите использовать белый список для имен таблиц, используйте хранимую процедуру, которая передает имя таблицы в качестве параметра, и выполняйте белый список, сверяя имя таблицы с information_schema.tables:

DELIMITER //

CREATE PROCEDURE RunSQLWithDynamicTableName(@tableName varchar(50))
AS
BEGIN 
    DECLARE @validTableName varchar(50)
    DECLARE @queryString varchar(100)

    SET @validTableName = SELECT table_name FROM information_schema.tables
                          WHERE table_schema = '[database_name]' 
                          AND table_name = @tableName LIMIT 1

    IF @validTableName IS NULL
        # table name does not exist, throw exception here

    # concatenate table name and prepared query string
    SET @queryString = SELECT CONCAT('SELECT * FROM ', @validTableName) 

    PREPARE stmt FROM @queryString
    EXECUTE stmt
END //

DELIMITER ;

Затем вызовитепроцедура в MySqlCommand строке запроса:

SQLCmdStr = "CALL RunSQLWithDynamicTableName(@tableName)"

MySqlCommand SQLcmd = new MySqlCommand(SQLCmdStr, SqlDBconn);
cmd.Parameters.Add("@tableName", MySqlDbType.VarChar).Value = NombreTabla;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...