2014-04-01 16 views
0

我正在將excel文件導入到sql server數據庫中。代碼工作正常,但我目前的做法是刪除(清除表)表數據。將Excel .xslx文件導入到sql server中:更新表中的難度

  string ssqltable = "tStudent"; 
      string myexceldataquery = "select id,student,rollno,course from [sheet1$]"; 
     try 
     { 
      string sexcelconnectionstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source =" + excelfilepath + "; Extended Properties=\"Excel 12.0; HDR=Yes; IMEX=2\""; 
      string ssqlconnectionstring = "Data Source=DELL\\SQLSERVER1;Trusted_Connection=True;DATABASE=Test;CONNECTION RESET=FALSE"; 

      SqlConnection sqlconn = new SqlConnection(ssqlconnectionstring); 
      SqlCommand sqlcmd = new SqlCommand(@"MERGE tStudent AS target 
           USING (select ID, STUDENT , ROLLNO from @source) as source 
           ON (source.ID = target.ID) 
           WHEN MATCHED THEN 
           UPDATE SET Student = source.Student, 
             ROLLNO = source.ROLLNO 
           WHEN NOT MATCHED THEN 
           INSERT (ID, STUDENT , ROLLNO) 
           VALUES (source.id, source.Student, source.RollNo);", sqlconn); 
      ****************************************** 
      SqlParameter param = new SqlParameter(); 
      sqlcmd.Parameters.AddWithValue("@source", dr); 
      param.SqlDbType = SqlDbType.Structured; 
      param.TypeName = "dbo.tStudent"; 
      ****************************************** 
      sqlconn.Open(); 
      sqlcmd.ExecuteNonQuery(); 
      sqlconn.Close(); 

      //series of commands to bulk copy data from the excel file into our sql table 
      OleDbConnection oledbconn = new OleDbConnection(sexcelconnectionstring); 
      OleDbCommand oledbcmd = new OleDbCommand(myexceldataquery, oledbconn); 

      oledbconn.Open(); 
      OleDbDataReader dr = oledbcmd.ExecuteReader(); 
      SqlBulkCopy bulkcopy = new SqlBulkCopy(ssqlconnectionstring); 
      bulkcopy.DestinationTableName = ssqltable; 

      bulkcopy.WriteToServer(dr); 
      while (dr.Read()) 
      { 
       //bulkcopy.WriteToServer(dr); 
      } 
      oledbconn.Close(); 
      Console.WriteLine(".xlsx file imported succssessfully into database.", bulkcopy.NotifyAfter); 
     } 

請參閱*部分。我已經在SqlParameters中分配了我的OleDb DataRreader dr,但後來在代碼中聲明瞭它。請指導我如何構建我的代碼。

示例將不勝感激。

+0

你想要[插入](http://technet.microsoft.com/en-us/library/dd776381(v = sql.105).aspx)不是更新。在SQL中,UPDATE更改現有值。 – RadioSpace

+0

@RadioSpace我想在Sql中更新。有一段時間,我正在刪除數據並插入它。但現在我想更新這些數據。我覺得我傳入的更新查詢和參數不是一個正確的方法。謝謝。 – user2525244

+0

@ConradFrix我可以使用任何東西,只是我是一個初學者,我想要一些更簡單的代碼。我不熟悉合併和表值參數。謝謝。 – user2525244

回答

1

鑑於您的Excel文件是相同的結構,你的表,要更新,而不僅僅是插入最簡單的方法是使用MergeTable-Valued Paramter

SqlCommand cmd = new SqlCommand(@"MERGE tStudent AS target 
            USING (select ID, STUDENT , ROLLNO from @source) as source 
            ON (source.ID = target.ID) 
            WHEN MATCHED THEN 
            UPDATE SET Student = source.Student, 
              ROLLNO = source.ROLLNO 
            WHEN NOT MATCHED THEN 
            INSERT (ID, STUDENT , ROLLNO) 
            VALUES (source.id, source.Student, source.RollNo);" 
            , sqlconn); 

SqlParameter param cmd.Parameters.AddWithValue("@source", dr); 
param.SqlDbType = SqlDbType.Structured; 
param.TypeName = "dbo.tStudent"; 

你的其他選項涉及循環,使用登臺表,將數據作爲xml數據或字符串數​​據傳遞,或者使用像SSIS這樣的ETL工具。

+0

謝謝..你是一個希望.. 我得到這個錯誤說:「MERGE語句必須以分號(;)結尾。」 我試圖找到解決方案,但無法解決它。 – user2525244

+1

我忘了「;」在sql字符串的末尾。我更新了答案 –

+0

是的,我的Excel和SQL數據具有相同的結構。 以及如何聲明表變量@source?因爲我正在採取excel文件數據。 – user2525244