0

asp.netアップロードファイルツールを使用してSQLサーバーに.csvをアップロードしようとすると、エラーが発生します。アプリケーションはローカルホスト上にあり、SQLServerは同じマシン上にありません。データベース内に適切な列を含むテーブルを作成しますが、データでいっぱいになることはありません。コードエラーは次のとおりです。「ファイル"c:\ users \ visual studio 2010 \ Projects \ webImport \ webImport \ UploadedCSVFiles \ Employee.csv"を開くことができなかったため、一括読み込みできません。オペレーティングシステムのエラーコード3(システムが見つかりません指定されたパス。)

背後にあるコードは次のとおりです。

        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_Click1(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("UploadedCSVFiles") + "\\" + fileInfo.Name;

                //Save the CSV file in the Server inside 'MyCSVFolder' 
                FileUpload1.SaveAs(csvFilePath);
                //Fetch the location of CSV file 
                string filePath = Server.MapPath("UploadedCSVFiles") + "\\";
                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);
                    Label2.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
                {
                    Label3.Text = "File is empty.";
                }
            }
            else
            {
                Label3.Text = "Unable to recognize file.";
            }

        }
    }

Server.MapPathと関係があると思います。保存して実行するファイルを、アプリケーションとは別のサーバーにルーティングすることは可能ですか。それが理にかなっているなら。

4

2 に答える 2

2

TSQL形式の一括読み込みを使用する場合、そのコードはSQLサーバー上で実行されるため、指定するファイルパスはDBサーバーを基準にしています。

あなたの場合、コードプロジェクトのSqlBulkCopyと「FastCSVReader」を確認する必要があると思います。それらは非常にうまく連携します。次に、WebサーバーでCSVを処理し、非常に効率的なAPIを介してバルクストリームをSQLサーバーに送信します。

于 2012-08-01T20:27:09.087 に答える
0

BULK INSERTパスは、サーバーの参照フレームから使用されます。自分のマシンでManagementStudioまたは別のアプリケーションを使用して、実際のSQLサーバーを実行している別のマシンにクエリコードを送信している場合、サーバーはクエリを取得し、サーバーのファイルシステムビューからパスを解決しようとします。

これが意味するのは、私のコンピューターのパスにファイルがある可能性があるということですC:\folder\foo.txt。SQLサーバーを実行しているコンピューターに接続して、を試してみるとBULK INSERT DBO.FOO from 'C:\folder\foo.txt'、サーバーは独自のC:\パーティションを調べて、を見つけようとしますfoo.txt

私はこれを次のいずれかで回避することができました:

  • SQLサーバーを実行している実際のマシンにファイルを一括挿入する
  • ネットワーク共有を使用して、両方のマシンがアクセスできます。ただし、これは帯域幅の面でコストがかかる可能性があります。
于 2012-08-01T20:27:59.503 に答える