2013-07-25 33 views
0

我想更新我創建的表中的文件。我正在使用文件上傳器來插入我的Excel文件並將其上傳到數據庫。但是目前我的代碼每次上傳文件都會創建一個新的數據庫表,我不希望這樣做。我想只更新/替換數據庫表中的整個文件。我該怎麼做呢?如何使用excel文件上傳文件更新sql數據庫表信息

這是我的代碼:

private string GetConnectionString() 
    { 
       return System.Configuration.ConfigurationManager.ConnectionStrings["nConnectionString2"].ConnectionString; 
    } 
    private void CreateDatabaseTable(DataTable dt, string tableName) 
    { 

       string sqlQuery = string.Empty; 
       string sqlDBType = string.Empty; 
       string dataType = string.Empty; 
       int maxLength = 0; 
       StringBuilder sb = new StringBuilder(); 

       sb.AppendFormat(string.Format("CREATE TABLE {0} (", tableName)); 

       for (int i = 0; i < dt.Columns.Count; i++) 
       { 
        dataType = dt.Columns[i].DataType.ToString(); 
        if (dataType == "System.Int32") 
        { 
         sqlDBType = "INT"; 
        } 
        else if (dataType == "System.String") 
        { 
         sqlDBType = "NVARCHAR"; 
         maxLength = dt.Columns[i].MaxLength; 
        } 

        if (maxLength > 0) 
        { 
         sb.AppendFormat(string.Format(" {0} {1} ({2}), ", dt.Columns[i].ColumnName, sqlDBType, maxLength)); 
        } 
        else 
        { 
         sb.AppendFormat(string.Format(" {0} {1}, ", dt.Columns[i].ColumnName, sqlDBType)); 
        } 
       } 

       sqlQuery = sb.ToString(); 
       sqlQuery = sqlQuery.Trim().TrimEnd(','); 
       sqlQuery = sqlQuery + ")"; 

       using (SqlConnection sqlConn = new SqlConnection(GetConnectionString())) 
       { 
        sqlConn.Open(); 
        SqlCommand sqlCmd = new SqlCommand(sqlQuery, sqlConn); 
        sqlCmd.ExecuteNonQuery(); 
        sqlConn.Close(); 
       } 

      } 

    private void LoadDataToDatabase(string tableName, string fileFullPath, string delimeter) 
    { 
       string sqlQuery = string.Empty; 
       StringBuilder sb = new StringBuilder(); 

       sb.AppendFormat(string.Format("BULK INSERT {0} ", tableName)); 
       sb.AppendFormat(string.Format(" FROM '{0}'", fileFullPath)); 
       sb.AppendFormat(string.Format(" WITH (FIELDTERMINATOR = '{0}' , ROWTERMINATOR = '\n')", delimeter)); 

       sqlQuery = sb.ToString(); 

       using (SqlConnection sqlConn = new SqlConnection(GetConnectionString())) 
       { 
        sqlConn.Open(); 
        SqlCommand sqlCmd = new SqlCommand(sqlQuery, sqlConn); 
        sqlCmd.ExecuteNonQuery(); 
        sqlConn.Close(); 
       } 
      } 

    protected void btnImport_Click(object sender, EventArgs e) 
    { 
     if (FileUpload1.HasFile) 
       { 
        FileInfo fileInfo = new FileInfo(FileUpload1.PostedFile.FileName); 
        if (fileInfo.Name.Contains(".csv")) 
        { 

         string fileName = fileInfo.Name.Replace(".csv", "").ToString(); 
         string csvFilePath = Server.MapPath("UploadExcelFile") + "\\" + fileInfo.Name; 

         //Save the CSV file in the Server inside 'MyCSVFolder' 
         FileUpload1.SaveAs(csvFilePath); 

         //Fetch the location of CSV file 
         string filePath = Server.MapPath("UploadExcelFile") + "\\"; 
         string strSql = "SELECT * FROM [" + fileInfo.Name + "]"; 
         string strCSVConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";" + "Extended Properties='text;HDR=YES;'"; 

         // load the data from CSV to DataTable 

         OleDbDataAdapter adapter = new OleDbDataAdapter(strSql, strCSVConnString); 
         DataTable dtCSV = new DataTable(); 
         DataTable dtSchema = new DataTable(); 

         adapter.FillSchema(dtCSV, SchemaType.Mapped); 
         adapter.Fill(dtCSV); 

         if (dtCSV.Rows.Count > 0) 
         { 
          CreateDatabaseTable(dtCSV, fileName); 
          Label1.Text = string.Format("The table ({0}) has been successfully created to the database.", fileName); 

          string fileFullPath = filePath + fileInfo.Name; 
          LoadDataToDatabase(fileName, fileFullPath, ","); 

          Label1.Text = string.Format("({0}) records has been loaded to the table {1}.", dtCSV.Rows.Count, fileName); 
         } 
         else 
         { 
          Label1.Text = "File is empty."; 
         } 
        } 
        else 
        { 
         Label1.Text = "Unable to recognize file."; 
        } 

      } 
      } 

回答

1

創建該表時,如果你的表已經存在,因爲你永遠不會把它們運行它應該給一個錯誤的代碼。

也就是說,一種解決方案可能是添加一個檢查來查看該表是否已經存在於創建新表的代碼中;它應該是這樣的: IF OBJECT_ID('TABLE', 'U') IS NULL其中TABLE它,你要添加的表名,所以代碼可能看起來像:

sb.AppendFormat(string.Format("IF OBJECT_ID({0}, 'U') IS NULL CREATE TABLE {0} (", tableName)); 

另一個,也許會更好,選擇將運行一個查詢,以檢查如果在運行CreateDatabaseTable(dtCSV, fileName);語句之前表已存在。您可以通過執行類似IF OBJECT_ID('tableName', 'U') IS NULL SELECT 1 ELSE SELECT 0(如果該表不存在)返回1,然後有條件地執行CreateDatabaseTable語句來執行檢查。

相關問題