C# - Mysql выберите запросы, не выполняющиеся - PullRequest
0 голосов
/ 18 апреля 2020

Программа, которую я создавал, принимает запрос SQL в качестве строкового параметра и передает его методу, где он затем выполняется. Я могу открыть свое mysql соединение для каждого запроса, но по какой-то причине я не могу выполнить какие-либо операторы выбора (я пробовал и ExecuteReader, и ExecuteScalar).

Однако, когда я запускаю ExecuteNonQuery, он работает нормально. Я могу проверить, что оператор вставки работал с ExecuteNonQuery.

В настоящее время у меня есть та же база данных в SQLyog, использующая точно такую ​​же информацию о соединении. Пока выполняется оператор select, я одновременно выполняю «SHOW FULL PROCESSLIST» и не вижу, как выполняется запрос. Вот код, который у меня есть:

private void buttonConnect_Click(object sender, EventArgs e)
{
    string tmp = mysqlSelectScalar("select NAME from PRESIDENTS where name like '%trump%';");
    string tmp = mysqlSelectScalar("select COUNT(*) from project.PRESIDENTS;");
    mysqlnonQuery("insert into PRESIDENTS (ID,NAME) VALUES ('66','TEST');");
}

public string mysqlSelectScalar(string query)
{
    string connString = "server=" + textBoxHostname.Text + ";user=" + textBoxUsername.Text + "; password=" + textBoxPW.Text + ";port=" + textBoxPort.Text + ";database=" + textBoxDB.Text + ";RespectBinaryFlags = false;CharSet=utf8;";

    MySqlConnection cnn = new MySqlConnection(connString);
    string result = "";

    try
    {
        MessageBox.Show(query);
        MySqlCommand cmd = new MySqlCommand(query, cnn);

        using (cnn)
        {
            cnn.Open();
            cmd.CommandTimeout = 10;
            result = Convert.ToString(cmd.ExecuteScalar());
        }

        cnn.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show("COULD NOT CONNECT TO DATABASE: " + ex.ToString());
    }

    return result;
}

public void mysqlnonQuery(string query)
{
    string connString = "server=" + textBoxHostname.Text + ";user=" + textBoxUsername.Text + "; password=" + textBoxPW.Text + ";port=" + textBoxPort.Text + ";database=" + textBoxDB.Text + ";RespectBinaryFlags = false;CharSet=utf8;";

    MySqlConnection cnn = new MySqlConnection(connString);
    string result = "";

    try
    {
        MessageBox.Show(query);
        MySqlCommand cmd = new MySqlCommand(query, cnn);

        using (cnn)
        {
            cnn.Open();
            cmd.ExecuteNonQuery();
        }

        cnn.Close();
        connStatus = 0;
    }
    catch (Exception ex)
    {
        MessageBox.Show("COULD NOT CONNECT TO DATABASE: " + ex.ToString());
        connStatus = 1;
    }
}
private void outputTable(string query)
        {
            try
            {
                string connString = "server=" + textBoxHostname.Text + ";user=" + textBoxUsername.Text + "; password=" + textBoxPW.Text + ";port=" + textBoxPort.Text + ";database=" + textBoxDB.Text + ";RespectBinaryFlags = false;CharSet=utf8;";
                MySqlConnection conn = new MySqlConnection(connString);
                MySqlCommand cmd = new MySqlCommand(query, conn);
                MySqlDataAdapter adpt = new MySqlDataAdapter();
                conn.Open();
                cmd.CommandTimeout = 5;
                MySqlDataAdapter sqladapter = new MySqlDataAdapter(query, conn);
                DataSet DS = new DataSet();
                sqladapter.Fill(DS);
                //the above command is what times out. Everything before runs fine
                dataGridViewOutput.DataSource = DS.Tables[0];
                MessageBox.Show("dataGridViewOutput.DataSource = DS.Tables[0];");
                conn.Clone();

            }
            catch (Exception ex)
            {
                richTextBoxOutput.Text = ex.ToString();
            }
        }

Я получаю сообщение об ошибке от тайм-аута:

System.TimeoutException : A Попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время, или не удалось установить установленное соединение, поскольку подключенный хост не смог ответить

System.IO.IOException : невозможно прочитать данные из транспортного соединения: попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время, или не удалось установить соединение, так как подключенный хост не смог ответить.

System. Net. Sockets.SocketException : Попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время, или не удалось установить соединение, так как подключенный хост не смог ответить

Я уверен, что Строка подключения работает, потому что я могу запустить метод mysqlnonQuery, и когда я положил печать операторы в методе mysqlSelectScalar, которые я видел, я смог пройти после открытия соединения.

Я должен также указать, что в таблице, из которой я выбираю, всего 45 записей, и я могу запустить те же самые запросы выбора из командной строки mysql, которые выполняются примерно за 0,01 секунды.

Этот код также переназначен из более старого проекта, над которым я работал, с точно таким же методом mysqlSelectScalar, и работал отлично.

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 18 апреля 2020
using System;
using MySql.Data.MySqlClient;

namespace RetrieveCars
{
    class Program
    {
        static void Main(string[] args)
        {
            string cs = @"server=localhost;userid=dbuser;password=s$cret;database=testdb";

            using var con = new MySqlConnection(cs);
            con.Open();

            string sql = "SELECT * FROM cars";
            using var cmd = new MySqlCommand(sql, con);

            using MySqlDataReader rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {
                Console.WriteLine("{0} {1} {2}", rdr.GetInt32(0), rdr.GetString(1), 
                        rdr.GetInt32(2));
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...