簡體   English   中英

將Excel數據導入SQL

[英]Importing excel data to SQL

我正在使用ASP.net制作一些應用程序,但是我遇到了麻煩,問題是用戶應該導入excel文件(文件的樣式始終相同),但是在excel文件中有一個帶有一堆名稱的單元格,看起來像這樣

 ID         Names
  1       Mick Jagger
          Elton John
  2       James Hetfield
          Axl Rose

依此類推,所以每個單元格有2個或更多名稱...到目前為止,我已將excel文件導入到DataSet中

sqlCMD.Connection.Open();
            using (OleDbConnection excelConnection = new OleDbConnection(excelConnString))
            {
                using (OleDbCommand cmd = new OleDbCommand("Select " + CompanyID + ", * 
                                                            From [Sheet1$]"
                 , excelConnection))
                {
                    OleDbDataAdapter daSheet = 
                    new OleDbDataAdapter(cmd.CommandText, excelConnection);

                    DataTable table;
                    table = new DataTable();
                    daSheet.Fill(table);
                    PreparedData.Tables.Add(table);
                }
            }

因此,在成功導入之后,我將導入到數據集中的對象列表很棒,但是每個單元格中有兩個或兩個以上的名稱給我帶來了麻煩,因為在對象值中這樣寫:“ Mick Jagger \\ n Elton John”,所以我正在嘗試替換它,並將其添加回數據集(我嘗試制作新的數據集,但效果不佳)

        int Rows = PreparedData.Tables[0].Rows.Count;
        int Columns = PreparedData.Tables[0].Columns.Count;

        for (int i = 0; i < Rows; i++)
        {
            for (int s = 0; s < Columns; s++)
            {
                if (s == 4 || s == 5 || s == 6 || s == 7)
                {
                    object ValueToReplace;
                    object Replaced;

                    ValueToReplace = PreparedData.Tables[0].Rows[i].ItemArray[s];
                    Replaced = ValueToReplace.ToString().Replace("\n", ";");

                    PreparedData.Tables[0].Rows[i].ItemArray[s] = Replaced;
                }
            }
        }

關鍵是,最后我想使用(正在運行)將修改后的數據導入到我的SQL表中

     SqlBulkCopy bulkcopy = new SqlBulkCopy(sqlCMD.Connection);
     bulkcopy.DestinationTableName = "Excel_Import";
        try
        {
            bulkcopy.WriteToServer(FixedData);
        }
        catch (Exception e)
        {

        }

那么,您能幫我一下,給我建議如何修改嗎

PreparedData.Tables[0].Rows[i].ItemArray[s] = Replaced;

當您引用ItemArray屬性時,NET框架將在當前行中構建數據的副本。 如果嘗試使用它來設置新值,請在副本上而不是在原始行數據上設置值。

這是Reference源中ItemArray屬性的源代碼

    public object[] ItemArray {
        get {
            int record = GetDefaultRecord();
            _table.recordManager.VerifyRecord(record, this);
            object[] values = new object[_columns.Count];
            for (int i = 0; i < values.Length; i++) {
                DataColumn column = _columns[i];
                VerifyValueFromStorage(column, DataRowVersion.Default, column[record]);
                values[i] = column[record];
            }
            return values;
        }

如您所見,每次引用ItemArray屬性時,都會創建一個對象數組的新副本並填充數據。 現在,即使您更改此數組中的條目,也不會更改DataRow類維護的內部數據。 您所做的更改對於DataRow來說根本是未知的。

但是解決方案非常簡單,只需使用

 ValueToReplace = PreparedData.Tables[0].Rows[i][s].ToString();
 PreparedData.Tables[0].Rows[i][s] = ValueToReplace.Replace("\n", ";");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM