Renjith_R Ответов: 3

Компонент Microsoft access database engine не может открыть или записать файл ошибка


Я попытался импортировать лист excel в базу данных. Я устал от приведенного ниже кода и получаю ошибку "
The Microsoft Access database engine cannot open or write to the file ''. It is already opened exclusively by another user, or you need permission to view and write its data.
"

Лист Excel-это не где-нибудь открыт, когда я выполнить код..

Пожалуйста помогите
Заранее спасибо.

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

private void ExcelConn(string FilePath)
{

    constr = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=YES;""", FilePath);
    Econ = new OleDbConnection(constr);

}

private void InsertExcelRecords(string FilePath)
{
    ExcelConn(FilePath);

    Query = string.Format("Select [Account_name],[Key_Risks],[Mitigation_Plan],[Contingency_plan],[Status_in_detail],[Flag],[Rdate],[LableDate],[Pool_name],[Group_name],[Lastupdatedate] FROM [{0}]", "Sheet1$");
    OleDbCommand Ecom = new OleDbCommand(Query, Econ);
    Econ.Open();

    DataSet ds = new DataSet();
    OleDbDataAdapter oda = new OleDbDataAdapter(Query, Econ);
    Econ.Close();
    oda.Fill(ds);
    DataTable Exceldt = ds.Tables[0];

    SqlConnection con = new SqlConnection(cs);

    //creating object of SqlBulkCopy
    SqlBulkCopy objbulk = new SqlBulkCopy(con);
    //assigning Destination table name
    objbulk.DestinationTableName = "ERP_Mgmt";
    //Mapping Table column
    objbulk.ColumnMappings.Add("Account_name", "Account_name");
    objbulk.ColumnMappings.Add("Key_Risks", "Key_Risks");
    objbulk.ColumnMappings.Add("Mitigation_Plan", "Mitigation_Plan");
    objbulk.ColumnMappings.Add("Contingency_plan", "Contingency_plan");
    objbulk.ColumnMappings.Add("Status_in_detail", "Status_in_detail");
    objbulk.ColumnMappings.Add("Flag", "Flag");
    objbulk.ColumnMappings.Add("Rdate", "Rdate");
    objbulk.ColumnMappings.Add("LableDate", "LableDate");
    objbulk.ColumnMappings.Add("Pool_name", "Pool_name");
    objbulk.ColumnMappings.Add("Group_name", "Group_name");
    objbulk.ColumnMappings.Add("Lastupdatedate", "Lastupdatedate");
    //inserting Datatable Records to DataBase
    con.Open();
    objbulk.WriteToServer(Exceldt);
    con.Close();
}

protected void Button1_Click(object sender, EventArgs e)
{
    string CurrentFilePath = Path.GetFullPath(FileUpload1.PostedFile.FileName);
    InsertExcelRecords(CurrentFilePath);
}

Dave Kreskowiak

Имеет ли пользователь права на запись в папку, в которой находится лист Excel? Если в разделе Program Files, то ответ на этот вопрос будет отрицательным.

Renjith_R

Спасибо за быстрый ответ..
я создал папку на диске e.. тем не менее путь к файлу отображается следующим образом "C:\Program файлы (x86)\Общие файлы\Microsoft Shared\DevServer\10.0\ImportTest.xlsx"

Где я должен хранить excel ?

Dave Kreskowiak

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

Что касается пути, который вы придумываете, действительно ли лист Excel существует на этом пути?

Richard Deeming

Похоже, это тот же самый вопрос, который "paul_vin" опубликовал три дня назад:
https://www.codeproject.com/Questions/1200094/Error-while-inserting-excel-sheet-data-into-databa[^]

Вы работаете над одним и тем же проектом или вам обоим дали одно и то же домашнее задание? Если это домашнее задание, то ваш учитель, очевидно, не очень хорошо объяснил разницу между клиентом и сервером, а также то, как работает загрузка файлов ASP.NET приложения.

3 Ответов

Рейтинг:
0

OriginalGriff

Начните с проверки разрешений на файл и папку, как упоминает Дэйв, - если пользователь, под которым работает программное обеспечение, не имеет доступа на чтение и запись, как и приложение.

Если все это выглядит хорошо, то проверьте остальную часть вашего кода: создает ли какая-либо его часть объект соединения и забывает ли закрыть соединение (для лучшей практики вы должны использовать using блокируйте с каждым творением, чтобы они автоматически закрывались и утилизировались, когда вы закончите с ними:

using (OleDbCommand Ecom = new OleDbCommand(Query, Econ))
   {
   Econ.Open();
   ...
   }
Если какая-либо часть вашего программного обеспечения не сможет закрыть соединение, никакая другая его часть не сможет открыть его снова, пока ваше приложение не закроется (или GC не будет запущен в жизнь, чтобы избавиться от избыточного объекта).


Рейтинг:
0

Richard Deeming

(Кросс-постинг от Ошибка при вставке данных листа excel в базу данных[^], так как это, кажется, один и тот же вопрос от другого пользователя.)

Ваш код работает на сервере.

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

Код, запущенный на сервере, имеет нет доступа в файловую систему клиента.

Может быть появиться для работы при отладке кода в Visual Studio. Но это только потому, что сервер и клиент одинаковы в этом конкретном экземпляре.

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

protected void Button1_Click(object sender, EventArgs e)
{
    string filePath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N") + ".xlsx");
    FileUpload1.SaveAs(filePath);
    try
    {
        InsertExcelRecords(filePath);
    }
    finally
    {
        File.Delete(filePath);
    }
} 


Рейтинг:
0

Member 14943824

Привет
Я установил программное обеспечение для компании
Я получаю эту ошибку, когда пытаюсь обновить информацию
Вы можете мне помочь с тем, что это такое?
Microsoft Access Database Engine не удалось открыть или записать файлы
c: \ newfolder. он уже был открыт исключительно другим пользователем, или вам нужно разрешение на просмотр и запись его данных. "
Проблема в моем программном обеспечении или системе компании-клиента?


Richard MacCutchan

"c:\newfolder. он уже был открыт исключительно другим пользователем, или вам нужно разрешение на просмотр и запись его данных. "
Сообщение об ошибке совершенно ясно. Узнайте, какое приложение использует эту папку. Но вы не должны использовать папку в корне диска C, см. Эту статью знаменитого OriginalGriff: Где я должен хранить свои данные?[^].