Computer Wiz99 Ответов: 2

Загрузить Excel в SQL сервере: почему я получаю систему.исключение NullReferenceException: объекта не задана ссылка на экземпляр объекта.'?


Привет. Я получаю
System.NullReferenceException: 'Object reference not set to an instance of an object.'
когда я пытаюсь загрузить свой файл excel на локальный SQL-сервер. Когда я запускаю приложение, все в порядке. Я могу выбрать файл, он появляется в текстовом поле, и когда я нажимаю кнопку загрузки, я получаю
System.NullReferenceException: 'Object reference not set to an instance of an object.'
в
conString = ConfigurationManager.ConnectionStrings["AkinTest"].ConnectionString;
для файлов .xls.

Я тоже получаю это вместе с ним:

System.Configuration.ConnectionStringSettingsCollection.this[string].get returned null.


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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Configuration;


public partial class CS : System.Web.UI.Page
{
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["AkinTest"].ConnectionString;
            break;
        case ".xlsx": //Excel 07 or higher
            conString = ConfigurationManager.ConnectionStrings["AkinTest"].ConnectionString;
            break;
        case ".csv": //CSV Files
            conString = ConfigurationManager.ConnectionStrings["AkinTest"].ConnectionString;
            break;
                //SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[""].ConnectionString);
                //con.Open();

        }
    conString = string.Format(conString, excelPath);
    using (OleDbConnection excel_con = new OleDbConnection(conString))
    {
        excel_con.Open();
        string sheet1 = excel_con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).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 (OleDbDataAdapter oda = new OleDbDataAdapter("SELECT * FROM [" + sheet1 + "]", excel_con))
        {
            oda.Fill(dtExcelData);
        }
        excel_con.Close();

        string consString = ConfigurationManager.ConnectionStrings["AkinTest"].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();
            }
        }
    }
}
}


<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>

2 Ответов

Рейтинг:
4

MadMyche

Net 3.5, то строка подключения будет находиться в вашей сети.конфигурационный файл, похожий на этот

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  https://go.microsoft.com/fwlink/?LinkId=301879
  -->
<configuration>
	<connectionStrings>
		<add name="AkinTest" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\PathTo\MyExcelFile.xlsx; Extended Properties=Excel 12.0"; />
	</connectionStrings>
</configuration>


Computer Wiz99

Привет, Мадмыч. Спасибо за информацию. Вот что у меня есть:

<конфигурация>
<соединительные нити>


&ЛТ;добавить имя="AkinTestConnectionString" свойства connectionString="поставщика=Майкрософт.Джет.Oledb для.4.0;Источник данных={0};расширенные свойства='программы Excel 8.0;HDR съемка=да'"&ГТ;

MadMyche

Имена не совпадают между вашим кодом и конфигурацией.

Ваш web.config имеет это:

<add name="AkinTestConnectionString" connectionstring="Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=YES'">

В то время как ваше приложение ищет
conString = ConfigurationManager.ConnectionStrings["AkinTest"].ConnectionString;

Computer Wiz99

Спасибо за информацию. Я действительно внесла изменения. Теперь, когда я запускаю программу, я получаю систему.ArgumentException: 'столбец 'TABLE_NAME' не принадлежит таблице MetaDataCollections.' и вот где это происходит: string sheet1 = excel_con.GetSchema().Rows[0]["TABLE_NAME"].Метод toString();

MadMyche

Вам нужно будет посмотреть на то, что есть в вашем коде, и сравнить это с тем, что есть в электронной таблице

Рейтинг:
19

OriginalGriff

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

Позвольте мне просто объяснить, что означает ошибка: вы пытались использовать переменную, свойство или возвращаемое значение метода, но оно содержит null - что означает, что в переменной нет экземпляра класса.
Это немного похоже на карман: у вас есть карман в рубашке, который вы используете, чтобы держать ручку. Если вы сунете руку в карман и обнаружите, что там нет ручки, вы не сможете подписать свое имя на листе бумаги - и вы получите очень смешные взгляды, если попытаетесь! Пустой карман дает вам нулевое значение (здесь нет ручки!), поэтому вы не можете сделать ничего, что обычно делали бы, когда вы извлекли свою ручку. Почему он пуст? Вот в чем вопрос - может быть, вы забыли взять ручку, когда уходили из дома сегодня утром, или, возможно, вы оставили ручку в кармане вчерашней рубашки, когда снимали ее вчера вечером.

Мы не можем сказать, потому что нас там не было, и, что еще важнее, мы даже не можем видеть вашу рубашку, не говоря уже о том, что находится в кармане!

Вернемся к компьютерам, и вы каким - то образом сделали то же самое-и мы не можем увидеть ваш код, а тем более запустить его и узнать, что содержит null, когда это не должно быть.
Но вы можете - и Visual Studio поможет вам здесь. Запустите свою программу в отладчике, и когда она выйдет из строя, VS покажет вам строку, в которой она обнаружила проблему. Затем вы можете начать просматривать различные его части, чтобы увидеть, какое значение равно null, и начать просматривать свой код, чтобы узнать, почему. Поэтому поставьте точку останова в начале метода, содержащего строку ошибки, и снова запустите программу с самого начала. На этот раз VS остановится перед ошибкой и позволит вам изучить, что происходит, пройдя через код, глядя на ваши значения.

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