如何使用上传的文件用excel文件更新sql数据库表信息

时间:2013-07-25 01:59:06

标签: asp.net sql excel

我正在尝试更新我创建的表中的文件。我正在使用文件上传器插入我的Excel文件并将其上传到数据库。但是目前我的代码每次上传文件时都会创建一个新的数据库表,我不希望它这样做。我想只更新/替换数据库表中的整个文件。我该怎么做?

这是我的代码:

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 个答案:

答案 0 :(得分: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语句。