Nishikant Tayade Ответов: 3

Доступ к пути запрещен при создании базы данных sqlite по заданному пути


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


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

Может ли кто-нибудь сказать, как решить эту проблему?

Ниже приведен код, который я пробовал.

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

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

namespace tthhSensorCalibrator
{
   public class DatabaseOperations
    {


       // OutputOfPort portOutput = new OutputOfPort();
        
        public void databaseMethod(string s1l, string s1h, string s2l, string s2h)
        {
            // This is the query which will create a new table in our database file with three columns. An auto increment column called "ID".
            string createTableQuery = @"CREATE TABLE IF NOT EXISTS [Log] (
                          [ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
                          [Date] VARCHAR(2048)  NULL,
                          [Time] VARCHAR(2048)  NULL,
                          [S1L] VARCHAR(2048) NULL,
                          [S1H] VARCHAR(2048) NULL,
                          [S2L] VARCHAR(2048) NULL,
                          [S2H] VARCHAR(2048) NULL
                          )";

            string path = "C:\\";
            if (!System.IO.File.Exists(path + "databaseFile.db3"))
            {
                SQLiteConnection.CreateFile(path + "databaseFile.db3");        // Create the file which will be hosting our database
            }
              
            else
            {
                using (System.Data.SQLite.SQLiteConnection con = new System.Data.SQLite.SQLiteConnection(@"Data source="+ path + "databaseFile.db3"))
                {
                    using (System.Data.SQLite.SQLiteCommand com = new System.Data.SQLite.SQLiteCommand(con))
                    {
                        con.Open();                             // Open the connection to the database

                        com.CommandText = createTableQuery;     // Set CommandText to our query that will create the table
                        com.ExecuteNonQuery();                  // Execute the query

                        string Date = DateTime.Now.ToShortDateString();
                        string Time = DateTime.Now.ToShortTimeString();

                        com.CommandText = "INSERT INTO Log (Date,Time,S1L,S1H,S2L,S2H) Values (@param1,@param2,@param3,@param4,@param5,@param6)";     // Add the first entry into our database 
                        com.CommandType = System.Data.CommandType.Text;
                        com.Parameters.Add(new SQLiteParameter("@param1", Date));
                        com.Parameters.Add(new SQLiteParameter("@param2", Time));
                        com.Parameters.Add(new SQLiteParameter("@param3", s1l));
                        com.Parameters.Add(new SQLiteParameter("@param4", s1h));
                        com.Parameters.Add(new SQLiteParameter("@param5", s2l));
                        com.Parameters.Add(new SQLiteParameter("@param6", s2h));
                        com.ExecuteNonQuery();      // Execute the query



                        com.CommandText = "Select * FROM Log";      // Select all rows from our database table

                        using (System.Data.SQLite.SQLiteDataReader reader = com.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                Console.WriteLine(reader["Date"] + " : " + reader["Time"]);     // Display the value
                            }
                        }
                        con.Close();        // Close the connection to the database
                    }
                }
            }
         
        }

       
    }
}

F-ES Sitecore

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

Nishikant Tayade

Попробовал папку но все равно безрезультатно

F-ES Sitecore

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

Gerry Schmitz

Вы никогда не проверяете ни один из кодов возврата.

Как ты собираешься узнать, что происходит?

Вы не.

3 Ответов

Рейтинг:
19

Jochen Arndt

Корневой путь диска Windows принадлежит системе и имеет ограниченный доступ.

Выберите другой путь, по которому пользователь, запускающий ваше приложение, имеет доступ на запись. Для данных, связанных с приложением, это предопределенные папки данных приложения для всех (общие) или каждого пользователя (в зависимости от того, должна ли база данных быть доступна всем пользователям или у каждого пользователя есть своя собственная база данных). То Приложение.Свойство UserAppDataPath (System.Окна.Формы)[^] и то же самое Приложение.CommonAppDataPath Свойство (System.Окна.Формы)[^] предоставить вам соответствующие пути для вашего приложения.


Nishikant Tayade

система используется строка=.ИО.Путь.Комбайн(Окружающая Среда.GetFolderPath(
Окружающая среда.Специальная папка."Избранное"), "databaseFile.DB3, в");

Я попробовал это сделать,и он успешно создает файл базы данных, но он пуст,никакой таблицы.

Nishikant Tayade

Это сработало,это была какая-то проблема "если бы еще".
Список специальных папок также содержит программные файлы ,как я могу получить доступ к этой папке или нет.

Jochen Arndt

Папка "Program Files" - это место, где устанавливаются программы. Обычные пользователи не имеют доступа на запись в эту папку, и она не должна использоваться для хранения данных, которые были изменены после установки или обновления.

Используйте папки, предоставляемые функциями из моего ответа, или используйте GetFolderPath() с CommonApplicationData (все пользователи), ApplicationData (перемещаемый пользователь) или LocalApplicationData (локальный пользователь) и добавьте имя вашего приложения (вы должны создать каталог изначально).

Это рекомендуемый способ сделать это (используя конкретный подкаталог приложения одной из папок данных приложения). Использование любого другого каталога может привести к тому, что ваше приложение не будет работать должным образом в других системах, поскольку запись запрещена.

Nishikant Tayade

DirectoryInfo di=System.IO.Directory.CreateDirectory("C:\\Users\\admin\\AppData\\Roaming\\tthhSensorCalibrator");
система используется строка=.ИО.Путь.Комбайн(Окружающая Среда.GetFolderPath(
Окружающая среда.Специальная папка.Данные приложения), Ди+"\\databaseFile.DB3, в");

Это работает на моей машине.Файл базы данных в указанной папке создается.
Но когда я пытаюсь запустить его на другой машине, то он показывает
Не мог найти часть пути.
C:\\Users\\ACCEL\\AppData\\Roaming\\tthhSensorCalibrator\\databaseFile.db3

Jochen Arndt

Не используйте жестко закодированные пути!

Используйте пути к данным приложения, возвращаемые функциями Windows. Это гарантирует, что он работает на всех системах (после того, как каталог был создан при использовании GetFolderPath() и добавлении имени вашего приложения).

Используйте только один метод:

GetFolderPath():
добавьте имя приложения и создайте этот каталог

Приложения.Собственность XxxDataPath :
Каталог есть ...\CompanyName\ProductName\ProductVersion и создается при использовании того, что в первый раз и каталог не существует.

Рейтинг:
10

User 7429338

Windows не позволяет вам записывать данные в корневой каталог диска C:\. Вы можете поместить свою базу данных в %appdata% или папку документов пользователя, в зависимости от того, что имеет смысл.


OriginalGriff

Голос против - вы абсолютно правы!
Windows не позволит обычным пользователям писать в корень любого загрузочного диска (и не любит изменения в корень любого диска по очень веским причинам)

Nishikant Tayade

Я попробовал другую папку (в частности, папку Documents), но она создает файл, но по-прежнему нет таблицы.

[no name]

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

OriginalGriff

:большой палец вверх:

Рейтинг:
0

OriginalGriff

Чтобы добавить к тому, что Таддеус Джонс - очень правильно - сказал, смотрите здесь: Где я должен хранить свои данные?[^] - он показывает некоторые лучшие места, и как их использовать.