Computer Wiz99 Ответов: 0

Как исправить ошибку 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

Спасибо. Я уже давно смотрю на этот код. Это простые вещи.

0 Ответов