質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

2617閲覧

DBの内容をC#を使って既存のExcelに上書き保存したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/11/05 06:56

編集2018/11/05 09:55

C#を学び始めて2週間くらいです。
SQLのDBの内容を既存のエクセルファイルをSFDで手動で選び上書き保存をしたいんですが,
・現在の状況としてデバックで操作して全体的な動作はするが、データが一切書き込まれず、既存のエクセルファイルがロックされてしまい読み取り専用になってしまう。
・while文のところだけ動作をしない。

ご教授頂きたいです。

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using Microsoft.Office.Core; using System.Data.SqlClient; using Microsoft.Office.Interop.Excel; namespace 課題1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //DB接続用 SqlConnection con = new SqlConnection(); SqlCommand com = new SqlCommand(); private void button1_Click(object sender, EventArgs e) { con.ConnectionString = "割愛 //接続先を開く con.Open(); //SQL文を発行する SqlCommand com = new SqlCommand("割愛); //SQLを実行する。 SqlDataReader reader = com.ExecuteReader(); System.IO.FileInfo fi = new System.IO.FileInfo(@ファイルのパスを入れてます"); //Excelファイルのパス Microsoft.Office.Interop.Excel.Application Ex = new Microsoft.Office.Interop.Excel.Application(); //ファイルを開く Microsoft.Office.Interop.Excel.Workbook wb = Ex.Workbooks.Open(Filename: fi.FullName); try { //Sheetを指定 ((Worksheet)wb.Sheets[1]).Select(); } catch(Exception ) { //エラー処理 //Appを閉じる wb.Close(false); Ex.Quit(); } //変数宣言 Range CellRange; int i = 0; //DBからデータを読み込む while (reader.Read()) { for (int l = 0; l < 10; l++) { CellRange =Ex.Cells[i + 2, l + 1] as Range; CellRange.Value2 = reader.GetValue(l); } i++; } SaveFileDialog SFD = new SaveFileDialog(); SFD.Filter = "Excelファイル|*.xls"; if (SFD.ShowDialog() != DialogResult.OK) { return; } //Appを閉じる wb.Close(true); Ex.Quit(); } private void button2_Click(object sender, EventArgs e) { this.Close(); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2018/11/05 07:05

「うまく書けません」ではなく、もう少し具体的に書けませんか?
guest

回答1

0

ベストアンサー

現在の状況としてデバックで操作して全体的な動作はするが、データが一切書き込まれず、既存のエクセルファイルがロックされてしまい読み取り専用になってしまう。

Microsoft.Office.Interop.Excelを使用する場合、適切にオブジェクトを開放しないと、Excelのプロセスが残りファイルが開きっぱなしになります。
提示されたコードですと、オブジェクトの開放が一切されていないのでプロセスが残りファイルがロックされているのだと思います。
オブジェクトの開放に関しては、検索してみてください。
エクセルファイルを作成するだけで、エクセルでの表示は行わないというのであれば、ClosedXMLなどのエクセルファイルを扱えるライブラリを使用する方が楽だと思います。

また、エクセルファイルを開き、データを書き込んだ後に保存を行っていません。
Workbook.SaveAsを調べてみてください。

while文のところだけ動作をしない。

SQLは正常に実行されていると思われますが、そのSQLにてデータを取得できているのでしょうか?
取得した結果件数が0件となっていないでしょうか?
reader.HasRowsプロパティがtrueか確認してみてください。

投稿2018/11/05 11:14

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/11/09 03:36

返答に遅れてしまい申し訳ございません。 参考にさせていただいて解決できました。 ご指摘等ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問