3

専用の SQL Server データベースに Excel ファイル (約 1000 レコードのみ) をインポートしています。Excel からの受信データで作業する必要があるため (行ごとに GUID を追加し、いくつかのデータ変換を行います)、行ごとに行いたいのですが、一括インポートしたくありません (ただし、トランザクションに対して何もありません)。

私はそれを正しく行う方法について混乱しています。SQLCommand次のようなパラメータで を使用できます。

SqlCommand sqlCommand = new SqlCommand("insert into TestTable(GUID,Name,Pricing) values(@GUID,@Name,@Pricing)", sqlConn);
foreach (DataRow dr in ds.Tables[0].Rows) //<-- this is my Excel file to iterate through
{
 sqlCommander.Parameters.Clear();
 String refGUID = Guid.NewGuid().ToString();
 sqlCommander.Parameters.AddWithValue("GUID", refGUID);
 sqlCommander.Parameters.AddWithValue("Name", dr.ItemArray[0]);
 sqlCommander.Parameters.AddWithValue("Pricing", dr.ItemArray[1]);
 sqlCommander.ExecuteNonQuery();
}

または、次のように「接続」モードを使用できます。

SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT GUID, Name, Pricing FROM TestTable", sqlConn);
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);

DataSet myDataSet = new DataSet();
dataAdapter.Fill(myDataSet, "TestTable");
foreach (DataRow dr in ds.Tables[0].Rows) //<-- this is my Excel file to iterate through
{
 DataRow row = myDataSet.Tables[0].NewRow();
 row["GUID"] = refGUID;
 row["Name"] = dr.ItemArray[0];
 row["Pricing"] = dr.ItemArray[1];
 myDataSet.Tables[0].Rows.Add(row);
 dataAdapter.Update(myDataSet);
}

今、私の質問は次のとおりです。

  1. INSERT行ごとにコマンドを送信する方が良いですか (それがSqlCommandメソッドになります)、それとも特別なコマンドを入力する方が良いDataSetですか (2 番目の方法)? SQLサーバーに何千回も挿入するのはかなり「ばかげている」と思いますか?
  2. dataAdapter.Update(myDataSet)<-- Excel のすべての行または行ごとに (上記のコード例に示されているように) 反復処理を行った後、これを行う必要がありますか?これは魔法のようにトランザクションを作成しますか?
  3. どの方法を使用すればよいですか? LINQ to SQL もあります。それを使用しないのはなぜですか (別のレイヤーが原因でパフォーマンスが向上する可能性があります)。
  4. DataSetExcel ファイルの読み取り中に何らかのエラーが発生した場合、更新は SQL サーバーにプッシュされたままですか、それともすべてが失われますか?


要するに、インポートするデータに変更を加えながら、Excelファイルを行ごとにSQLサーバーにインポートしたい(そして、SSISパッケージを使用したくない[データ変換以外に、もっと多くのことをしているため) Sharepoint にインポートしてワークフロー] または BizTalk を起動するなどの Excel ファイルを使用して)
»»美しく行うには?
結局、 Aspose Cells を購入しました。Aspose には、自由に使える非常に優れたツール セットがあります。

4

5 に答える 5

4

SSIS を使用したくないとおっしゃいましたが、SqlBulkCopy を検討しましたか? 次に、.NET 以外は何も必要ありませんが、最速/最も直接的なインポートを引き続き使用できます。

これは DataTable を受け入れるので、DataTable でデータを準備してからトリガーを引くことができます。トランザクションは、オプションでサポートされている IIRC です。より大きなデータの場合は、IDataReader を実装して完全なストリーミング アップロードを提供することもできます (転送中の各行を処理しながら)。

于 2010-10-27T14:52:50.393 に答える
1

dataSet はおそらく INSERT ステートメントをサーバーに送信することになるので、私の意見では、DataSet なしで INSERT ステートメントを送信する方がよいでしょう。個々の行のエラーのチェック、ログ記録など、プロセスをより詳細に制御することもできます。

于 2010-10-27T14:54:52.743 に答える
1

問題の説明を考えると、「インポートするデータに変更を加えながら、Excel ファイルを行ごとに SQL サーバーにインポートしたい」-SSIS は、この仕事に最適なツールです。

Unicode および非 Unicode データの問題を伴う SQL Server Integration Services SSIS を使用した Excel データのインポート

于 2010-10-27T14:51:55.797 に答える
0

処理されたデータ テーブルを XML に変換し、それを SQL サーバーのストアド プロシージャに (1 つのクエリで) 渡し、ストアド プロシージャで XML を解析してレコードを作成することができます。

于 2010-10-27T14:54:57.957 に答える
-1
INSERT INTO [dbo].[TableName]
           ([ColumnName1]
           ,[ColumnName2])
)
SELECT [ColumnName1]
           ,[ColumnName2]

FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0','Data Source= PathToFile.xls;Extended Properties=Excel 8.0')...[Sheet1$]
于 2010-10-27T14:59:22.947 に答える