3

私のローカルマシンでは、すべてがうまく機能しますが..

Webプロジェクトを公開した後MVC4、アップロードされたExcelファイルに問題があります。をロードしてHttpPostedFileBase、パスをBLに送信します。そこでロードdataTableし、2回目の呼び出しで。に取得しlistます。

これがコードです。

コントローラ:

  [HttpPost]
    public ActionResult UploadCards(HttpPostedFileBase file, string sheetName, int ProductID)
    {
        try
        {
            if (file == null || file.ContentLength == 0)
                throw new Exception("The user not selected a file..");

            var fileName = Path.GetFileName(file.FileName);
            var path = Server.MapPath("/bin");

            if (!Directory.Exists(path))
                Directory.CreateDirectory(path);

            path = Path.Combine(path, fileName);
            file.SaveAs(path);

            DataTable cardsDataTable = logic.LoadXLS(path, sheetName);
            cardsToUpdate = logic.getUpdateCards(cardsDataTable, ProductID);

            foreach (var item in cardsToUpdate)
            {
                if (db.Cards.ToList().Exists(x => x.SerialNumber == item.SerialNumber))
                    cardsToUpdate.Remove(item);
            }
            Session["InfoMsg"] = "click update to finish";
        }
        catch (Exception ex)
        {
            Session["ErrorMsg"] = ex.Message;
        }
        return View("viewUploadCards", cardsToUpdate);
    }

BL:

     public DataTable LoadXLS(string strFile, String sheetName)
    {
        DataTable dtXLS = new DataTable(sheetName);

        try
        {
            string strConnectionString = "";

            if (strFile.Trim().EndsWith(".xlsx"))
                strConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";", strFile);
            else if (strFile.Trim().EndsWith(".xls"))
                strConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";", strFile);

            OleDbConnection SQLConn = new OleDbConnection(strConnectionString);

            SQLConn.Open();

            OleDbDataAdapter SQLAdapter = new OleDbDataAdapter();

            string sql = "SELECT * FROM [" + sheetName + "$]";

            OleDbCommand selectCMD = new OleDbCommand(sql, SQLConn);

            SQLAdapter.SelectCommand = selectCMD;

            SQLAdapter.Fill(dtXLS);

            SQLConn.Close();

        }

        catch (Exception ex)
        {
            string res = ex.Message;
            return null;
        }

        return dtXLS;
    }

と:

    public List<Card> getUpdateCards(DataTable dt, int prodId)
    {
        List<Card> cards = new List<Card>();
        try
        {
            Product product = db.Products.Single(p => p.ProductID == prodId);
            foreach (DataRow row in dt.Rows)
            {
                cards.Add(new Card
                {
                    SerialNumber = row[0].ToString(),
                    UserName = row[1].ToString(),
                    Password = row[2].ToString(),

                    Activated = false,

                    Month = product.Months,
                    Bandwidth = product.Bandwidth,
                    ProductID = product.ProductID,
                    // Product = product
                });
            }
        }
        catch (Exception ex)
        {
            db.Log.Add(new Log { LogDate = DateTime.Now, LogMsg = "Error : " + ex.Message });

        }
        return cards;
    }

Windows Azureデータを表示するはずだった中央のビューで、このファイルが表示されないため、このファイルを保存できないと思います。

私はいくつかの方法を考えました...1つ-ファイルを保存しないが、完了する方法がわかりませんConnectionString...2番目にファイルをそこに保存する方法があるかもしれません。

この問題を解決するための提案をもらいたいです...

10倍と私の悪い英語をお詫びします=)

4

3 に答える 3

2

私は恥ずかしいですが、ここで同様の質問を見つけました..正確ではありませんが、それは私に良い方向性を与えました。

最終結果をうさぎ:

[HttpPost]
    public ActionResult UploadCards(HttpPostedFileBase file, string sheetName, int ProductID)
    {
        IExcelDataReader excelReader = null;
        try
        {
            if (file == null || file.ContentLength == 0)
                throw new Exception("The user not selected a file..");

            if (file.FileName.Trim().EndsWith(".xlsx"))
                excelReader = ExcelReaderFactory.CreateOpenXmlReader(file.InputStream);
            else if (file.FileName.Trim().EndsWith(".xls"))
                excelReader = ExcelReaderFactory.CreateBinaryReader(file.InputStream);
            else
                throw new Exception("Not a excel file");

            cardsToUpdate = logic.getUpdateCards(excelReader.AsDataSet().Tables[sheetName], ProductID);

            foreach (var item in cardsToUpdate)
            {
                if (db.Cards.ToList().Exists(x => x.SerialNumber == item.SerialNumber))
                    cardsToUpdate.Remove(item);
            }
            Session["InfoMsg"] = "Click Update to finish";
        }
        catch (Exception ex)
        {
            Session["ErrorMsg"] = ex.Message;
        }
        finally
        {
            excelReader.Close();
        }
        return View("viewUploadCards", cardsToUpdate);
    }  

すべて10q。

編集:ダウンロード、参照、使用

dllはavalibalehareです。Excel.dll の参照を追加し、Excelを使用して追加します。

于 2013-01-27T20:40:29.967 に答える
0

この問題は、ファイルをディスクに書き込んだことが原因である可能性があります。クラウドプロバイダーは通常、アプリケーションがディスクに書き込むことを許可しません。

あなたの場合、ファイルは一時的にのみディスクに書き込まれ、DBに直接ロードされているようです。アップロードされたファイルからストリームを直接開いて、ディスクに書き込まずにDBに直接書き込むことができるはずです。

セッションでストックしている例外を確認してください。詳細については、そこを参照してください。

于 2013-01-24T17:59:57.827 に答える
0

@hoonzisは正しいです。クラウド内のディスクへのファイルの書き込みは許可されていません(ファイルのパスを取得または設定することはできません)。BLOBストレージを使用する必要があります。これは、ファイルに対してはるかに効率的で、SQLよりも安価です。テーブルストレージサービスを使用することをお勧めします。これはnoSQLですが、azuresqlよりも安価です。ソリューションに必須である場合にのみ、azuresqlを使用してください。

BLOBストレージの詳細についてはこちらをご覧ください:http ://www.windowsazure.com/en-us/develop/net/how-to-guides/blob-storage/

テーブルストレージ:http ://www.windowsazure.com/en-us/develop/net/how-to-guides/table-services/

適切なストレージの選択に関する詳細については、http ://www.windowsazure.com/en-us/develop/net/fundamentals/cloud-storage-scenarios/を参照してください。

于 2013-01-24T18:34:16.243 に答える