forte74 Ответов: 1

Необработанное исключение типа "system. unauthorizedaccessexception"


Я следую учебнику по Подключение C# к MySQL[^]


По какой-то причине , когда я запускаю метод Backup (), я получаю эту ошибку: и я пытаюсь найти файл, но его там нет.


<pre lang="C#">An unhandled exception of type &#39;System.UnauthorizedAccessException&#39; occurred in mscorlib.dll

Additional information: Access to the path &#39;C:\MySqlBackup2016-11-4-8-23-4-270.sql&#39; is denied.</pre>






using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using MySql.Data.MySqlClient;

using System.Diagnostics;


using System.IO;



namespace connect
{

    class DBConnect
    {
        private MySqlConnection connection;
        private string server;
        private string database;
        private string uid;
        private string password;

        //Constructor
        public DBConnect()
        {
            Initialize();
        }

        //Initialize values
        private void Initialize()
        {
            server = "localhost";
            database = "first_db";
            uid = "root";
            password = "";
            string connectionString;
            connectionString = "SERVER=" + server + ";" + "DATABASE=" +
            database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";";

            connection = new MySqlConnection(connectionString);
        }

        //open connection to database
        public bool OpenConnection()
        {

            try
            {
                connection.Open();

                Console.WriteLine("connection opened");

                return true;
            }
            catch (MySqlException ex)
            {
                //When handling errors, you can your application's response based 
                //on the error number.
                //The two most common error numbers when connecting are as follows:
                //0: Cannot connect to server.
                //1045: Invalid user name and/or password.
                switch (ex.Number)
                {
                    case 0:
                        Console.WriteLine("Cannot connect to server.  Contact administrator");
                        break;

                    case 1045:
                        Console.WriteLine("Invalid username/password, please try again");
                        break;
                }
                return false;
            }



        }

        //Close connection
        public bool CloseConnection()
        {
            try
            {
                connection.Close();

                Console.WriteLine("connection closed");
                return true;
            }
            catch (MySqlException ex)
            {
                Console.WriteLine(ex.Message);
                return false;
            }



        }
        


        //Insert statement
        public void Insert()
        {

            string query = "INSERT INTO users (id, username, password) VALUES('23' ,'Jojo', '33')  , ('99', 'jen', '66')";

    //open connection
    if (this.OpenConnection() == true)
    {
        //create command and assign the query and connection from the constructor
        MySqlCommand cmd = new MySqlCommand(query, connection);

        Console.WriteLine("values inserted");


        
        //Execute command
        cmd.ExecuteNonQuery();

        //close connection
        this.CloseConnection();
    }

        }



        

        //Update statement
        public void Update()
        {

          string query = "UPDATE users SET username='Joe', password='22', id='33'  WHERE username='Joe'";

    //Open connection
    if (OpenConnection() == true)
    {
        //create mysql command
        MySqlCommand cmd = new MySqlCommand();
        //Assign the query using CommandText
        cmd.CommandText = query;
        //Assign the connection using Connection
        cmd.Connection = connection;

        //Execute query
        cmd.ExecuteNonQuery();

        //close connection
        this.CloseConnection();
    }



        }



        
        //Delete statement
        public void Delete()
        {

            string query = "DELETE FROM users WHERE username='Joe'";

            if (this.OpenConnection() == true)
            {
                MySqlCommand cmd = new MySqlCommand(query, connection);
                cmd.ExecuteNonQuery();
                this.CloseConnection();
            }


        }


       
        //Select statement
        public List<string>[] Select()
        {
            string query = "SELECT * FROM users";

    //Create a list to store the result
    List< string >[] list = new List< string >[3];
    list[0] = new List< string >();
    list[1] = new List< string >();
    list[2] = new List< string >();

    //Open connection
    if (this.OpenConnection() == true)
    {
        //Create Command
        MySqlCommand cmd = new MySqlCommand(query, connection);
        //Create a data reader and Execute the command
        MySqlDataReader dataReader = cmd.ExecuteReader();
        
        //Read the data and store them in the list
        while (dataReader.Read())
        {
            list[0].Add(dataReader["id"] + "");
            list[1].Add(dataReader["username"] + "");
            list[2].Add(dataReader["password"] + "");
        }

        //close Data Reader
        dataReader.Close();

        //close Connection
        this.CloseConnection();

        //return list to be displayed
        return list;
    }
    else
    {
        return list;
    }

        }



        //Count statement
        public int Count()
        {
             string query = "SELECT Count(*) FROM users";
    int Count = -1;

    //Open Connection
    if (this.OpenConnection() == true)
    {
        //Create Mysql Command
        MySqlCommand cmd = new MySqlCommand(query, connection);

        //ExecuteScalar will return one value
        Count = int.Parse(cmd.ExecuteScalar()+"");
        
        //close Connection
        this.CloseConnection();

        return Count;
    }
    else
    {
        return Count;
    }

        }



        //Backup
        public void Backup()
        {
             try
    {
        DateTime Time = DateTime.Now;
        int year = Time.Year;
        int month = Time.Month;
        int day = Time.Day;
        int hour = Time.Hour;
        int minute = Time.Minute;
        int second = Time.Second;
        int millisecond = Time.Millisecond;

        //Save file to C:\ with the current date as a filename
        string path;
        path = "C:\\MySqlBackup" + year + "-" + month + "-" + day + 
	"-" + hour + "-" + minute + "-" + second + "-" + millisecond + ".sql";
        StreamWriter file = new StreamWriter(path);

        
        ProcessStartInfo psi = new ProcessStartInfo();
        psi.FileName = "mysqldump";
        psi.RedirectStandardInput = false;
        psi.RedirectStandardOutput = true;
        psi.Arguments = string.Format(@"-u{0} -p{1} -h{2} {3}", 
			uid, password, server, database);
        psi.UseShellExecute = false;

        Process process = Process.Start(psi);

        string output;
        output = process.StandardOutput.ReadToEnd();
        file.WriteLine(output);
        process.WaitForExit();
        file.Close();
        process.Close();
    }
    catch (IOException ex)
    {
        Console.WriteLine("Error , unable to backup!");
    }



        }



        /*
        //Restore
        public void Restore()
        {
        }
         * 
          */
    }






}


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

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

[no name]

"Доступ запрещен"вполне объясним.

Philippe Mori

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

Karthik_Mahalingam

публикуйте только соответствующий блок кода

1 Ответов

Рейтинг:
1

OriginalGriff

Посмотрите на ошибку:

Access to the path 'C:\MySqlBackup2016-11-4-8-23-4-270.sql' is denied

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

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


forte74

но я даже не могу найти файл...как мне изменить права на запись

OriginalGriff

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

forte74

как изменить разрешения на запись

OriginalGriff

В корневом каталоге загрузочного диска вы, вероятно, не можете - и, конечно, не должны, Если вам не нравятся вирусы, - в других каталогах это просто:
В Проводнике Windows щелкните правой кнопкой мыши папку и выберите пункт " Свойства"
Выберите вкладку "Безопасность" и выделите интересующую вас группу пользователей.
Нажмите кнопку" Редактировать...", и это будет довольно очевидно оттуда.