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

テーブルを削除しないため、テーブルが既に存在する場合、テーブルを作成するコードを実行するとエラーが発生するはずです。

つまり、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 に答える