0

我正在尝试更新我创建的表中的文件。我正在使用文件上传器插入我的 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.";
                  }

             }
           }
4

1 回答 1

1

如果表已经存在,则创建表的代码在运行时应该会出错,因为您从不删除它们。

也就是说,一种解决方案可能是添加检查以查看该表是否已存在于创建新表的代码中;它应该类似于: IF OBJECT_ID('TABLE', 'U') IS NULLTABLE要添加的表的名称,因此代码可能如下所示:

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语句。

于 2013-07-25T09:26:56.977 回答