2013-07-25 35 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语句来执行检查。

相关问题