専用の 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);
}
今、私の質問は次のとおりです。
INSERT
行ごとにコマンドを送信する方が良いですか (それがSqlCommand
メソッドになります)、それとも特別なコマンドを入力する方が良いDataSet
ですか (2 番目の方法)? SQLサーバーに何千回も挿入するのはかなり「ばかげている」と思いますか?dataAdapter.Update(myDataSet)
<-- Excel のすべての行または行ごとに (上記のコード例に示されているように) 反復処理を行った後、これを行う必要がありますか?これは魔法のようにトランザクションを作成しますか?- どの方法を使用すればよいですか? LINQ to SQL もあります。それを使用しないのはなぜですか (別のレイヤーが原因でパフォーマンスが向上する可能性があります)。
DataSet
Excel ファイルの読み取り中に何らかのエラーが発生した場合、更新は SQL サーバーにプッシュされたままですか、それともすべてが失われますか?
要するに、インポートするデータに変更を加えながら、Excelファイルを行ごとにSQLサーバーにインポートしたい(そして、SSISパッケージを使用したくない[データ変換以外に、もっと多くのことをしているため) Sharepoint にインポートしてワークフロー] または BizTalk を起動するなどの Excel ファイルを使用して)
»»美しく行うには?
結局、 Aspose Cells を購入しました。Aspose には、自由に使える非常に優れたツール セットがあります。