Как исправить ошибку getschema в моем проекте?
Привет. У меня есть веб-программа, которая может загрузить файл excel в базу данных SQL server. До сих пор единственная ошибка, которую я получаю при запуске программы, - это:
System.ArgumentException: 'Column 'TABLE_NAME' does not belong to table MetaDataCollections.'
Что происходит в этой строке кода:
string sheet1 = excel_con.GetSchema().Rows[0]["TABLE_NAME"].ToString();
Это происходит только тогда, когда я нажимаю кнопку загрузки. Так что в этот момент меня топчут. Файл Excel, который я использую, действительно содержит небольшие данные. В базе данных нет никаких таблиц.
Вот мой полный код HTML:
<pre><%@ Page Language="C#" AutoEventWireup="true" CodeFile="CS.aspx.cs" Inherits="CS" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <asp:FileUpload ID="FileUpload1" runat="server" /> <asp:Button Text="Upload" OnClick = "Upload" runat="server" /> <br /> <br /> <br /> <br /> </form> </body> </html>
Вот код, стоящий за этим:
using System; using System.IO; using System.Data; using System.Data.SqlClient; using System.Configuration; public partial class CS : System.Web.UI.Page { public object SqlSchemaGuid { get; private set; } protected void Upload(object sender, EventArgs e) { //Upload and save the file string excelPath = Server.MapPath("~/Files/") + Path.GetFileName(FileUpload1.PostedFile.FileName); FileUpload1.SaveAs(excelPath); string conString = string.Empty; string extension = Path.GetExtension(FileUpload1.PostedFile.FileName); switch (extension) { case ".xls": //Excel 97-03 conString = ConfigurationManager.ConnectionStrings["AkinTestConnectionString"].ConnectionString; break; case ".xlsx": //Excel 07 or higher conString = ConfigurationManager.ConnectionStrings["AkinTestConnectionString"].ConnectionString; break; case ".csv": //CSV Files conString = ConfigurationManager.ConnectionStrings["AkinTestConnectionString"].ConnectionString; break; //SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[""].ConnectionString); //con.Open(); } conString = string.Format(conString, excelPath); using (SqlConnection excel_con = new SqlConnection(conString)) { excel_con.Open(); string sheet1 = excel_con.GetSchema().Rows[0]["TABLE_NAME"].ToString(); DataTable dtExcelData = new DataTable(); //[OPTIONAL]: It is recommended as otherwise the data will be considered as String by default. dtExcelData.Columns.AddRange(new DataColumn[3] { new DataColumn("Id", typeof(int)), new DataColumn("Name", typeof(string)), new DataColumn("Salary",typeof(decimal)) }); using (SqlDataAdapter reader = new SqlDataAdapter("SELECT * FROM [" + sheet1 + "]", excel_con)) { reader.Fill(dtExcelData); } excel_con.Close(); string consString = ConfigurationManager.ConnectionStrings["AkinTestConnectionString"].ConnectionString; using (SqlConnection con = new SqlConnection(consString)) { using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con)) { //Set the database table name sqlBulkCopy.DestinationTableName = "dbo.tblPersons"; //[OPTIONAL]: Map the Excel columns with that of the database table sqlBulkCopy.ColumnMappings.Add("Id", "PersonId"); sqlBulkCopy.ColumnMappings.Add("Name", "Name"); sqlBulkCopy.ColumnMappings.Add("Salary", "Salary"); con.Open(); sqlBulkCopy.WriteToServer(dtExcelData); con.Close(); } } } } }
Что я уже пробовал:
Я попытался изменить имя таблицы и закомментировать строку кода.
ZurdoDev
TABLE_NAME - это не имя таблицы в вашем файле. Просто отладьте его и посмотрите, что находится в excel_con.GetSchema().Rows[0]
Computer Wiz99
Спасибо. Я уже давно смотрю на этот код. Это простые вещи.