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

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

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

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Q&A

解決済

2回答

11824閲覧

DBに画像を登録したい

yamaguti

総合スコア185

C#

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

1グッド

1クリップ

投稿2017/10/28 17:35

お世話になります。

情報管理画面を作成しているのですが、画像登録ではまってしまっています。

128行目のパラメータの部分で
CS0029 型 'System.Drawing.Image' を 'System.Data.DbType' に暗黙的に変換できません

上記のエラーが発生します。
画像やファイルを登録したことがなく、登録のしかたがいまいち理解できておりません。
ご教示のほどよろしくお願いいたします。

C#

1using System; 2using System.IO; 3using System.Collections.Generic; 4using System.ComponentModel; 5using System.Data; 6using System.Drawing; 7using System.Linq; 8using System.Text; 9using System.Threading.Tasks; 10using System.Windows.Forms; 11using System.Data.SQLite; 12 13namespace 基幹システム.対人管理 14{ 15 16 public partial class Taizintouroku : Form 17 { 18 public Taizintouroku() 19 { 20 InitializeComponent(); 21 22 #region 対人コードを自動付番 23 DateTime CD = DateTime.Today.Date; 24 25 System.Random r = new System.Random(1000); 26 27 int i = r.Next(9); 28 29 string ran = i.ToString(); 30 string Day = CD.ToString(); 31 string DayCD = Day.Substring(0, 10); 32 33 string DayCD2 = DayCD.Replace('/',' '); 34 35 //char[] removeChars = new Char[] { '\r', '\n' }; 36 37 //foreach(char c in removeChars) 38 //{ 39 // DayCD = DayCD.Replace(c.ToString(), "/"); 40 //} 41 42 string KokyakuCd = ran + DayCD2; 43 44 txttaizincd.Text = KokyakuCd; 45 #endregion 46 47 txttaizincd.Enabled = false; 48 } 49 50 public void button1_Click(object sender, EventArgs e) 51 { 52 //ダイアログを開く 53 DialogResult dr = openFileDialog1.ShowDialog(); 54 55 pictureBox1.Image = Image.FromFile(openFileDialog1.FileName); 56 //ファイルのアドレスを取得 57 var pic = openFileDialog1.FileName; 58 //バイト型に変更 59 byte[] gazou = File.ReadAllBytes(pic); 60 61 if (dr == DialogResult.OK) 62 { 63 //string filepass = dr.GetType.filepass; 64 65 } 66 // var a = picpic; 67 //return a; 68 } 69 70 private void btntouroku_Click(object sender, EventArgs e) 71 { 72 73 string dbpath = Application.StartupPath + @"\kabukanri.db"; 74 using (SQLiteConnection con = new SQLiteConnection("Data Source=" + dbpath)) 75 { 76 con.Open(); 77 DataTable datatable = new DataTable(); 78 79 using (SQLiteTransaction trans = con.BeginTransaction()) 80 { 81 //給料テーブルinsert用 82 StringBuilder sql = new StringBuilder(); 83 SQLiteCommand cmd = con.CreateCommand(); 84 85 #region 対人テーブル insert文  86 sql.AppendLine("insert "); 87 sql.AppendLine("into 対人テーブル( "); 88 sql.AppendLine(" CD"); 89 sql.AppendLine(" , 名前"); 90 sql.AppendLine(" , 生年月日"); 91 //sql.AppendLine(" , 年齢"); 92 sql.AppendLine(" , 郵便番号"); 93 sql.AppendLine(" , 住所"); 94 sql.AppendLine(" , 顔写真"); 95 sql.AppendLine(" , 性別"); 96 sql.AppendLine(" , 備考"); 97 sql.AppendLine(" , DEL_FLG"); 98 sql.AppendLine(") "); 99 sql.AppendLine("values ( "); 100 sql.AppendLine(" @CD"); 101 sql.AppendLine(" , @名前"); 102 sql.AppendLine(" , @生年月日"); 103 //sql.AppendLine(" , @年齢"); 104 sql.AppendLine(" , @郵便番号"); 105 sql.AppendLine(" , @住所"); 106 sql.AppendLine(" , @顔写真"); 107 sql.AppendLine(" , @性別"); 108 sql.AppendLine(" , @備考"); 109 sql.AppendLine(" , 0"); 110 sql.AppendLine(")"); 111 112 cmd.Parameters.Add("CD", System.Data.DbType.String); 113 cmd.Parameters.Add("名前", System.Data.DbType.String); 114 cmd.Parameters.Add("生年月日", System.Data.DbType.String); 115 cmd.Parameters.Add("年齢", System.Data.DbType.String); 116 cmd.Parameters.Add("郵便番号", System.Data.DbType.String); 117 cmd.Parameters.Add("住所", System.Data.DbType.String); 118 cmd.Parameters.Add("顔写真", System.Data.DbType.Binary); 119 cmd.Parameters.Add("性別", System.Data.DbType.String); 120 cmd.Parameters.Add("備考", System.Data.DbType.String); 121 122 cmd.Parameters["CD"].Value = txttaizincd.Text; 123 cmd.Parameters["名前"].Value = txtname.Text; 124 cmd.Parameters["生年月日"].Value = txtsenedate.Text; 125 //cmd.Parameters["年齢"].Value = txtage.Text; 126 cmd.Parameters["郵便番号"].Value = txtadd.Text; 127 cmd.Parameters["住所"].Value = txtzyusyo.Text; 128 cmd.Parameters["顔写真"].DbType =pictureBox1.Image; 129 if(radioButton1.Checked == true) 130 { 131 cmd.Parameters["性別"].Value = 1; 132 } 133 else if(radioButton2.Checked == true) 134 { 135 cmd.Parameters["性別"].Value = 2; 136 } 137 cmd.Parameters["備考"].Value = txtbiko.Text; 138 139 cmd.CommandText = sql.ToString(); 140 cmd.ExecuteNonQuery(); 141 trans.Commit(); 142 MessageBox.Show("登録が完了しました。"); 143 #endregion 144 } 145 } 146 } 147 148 private void txtage_Validating(object sender, CancelEventArgs e) 149 { 150 151 } 152 #region 年齢を出すメソッド 153 private static int GetAge(DateTime txtsenedate, DateTime today) { 154 int age = today.Year - txtsenedate.Year; 155 //誕生日がまだ来ていなければ、1引く 156 if (today.Month < txtsenedate.Month || 157 (today.Month == txtsenedate.Month && 158 today.Day < txtsenedate.Day)) 159 { 160 age--; 161 } 162 return age; 163 } 164 #endregion 165 166 private void txtsenedate_Validated(object sender, EventArgs e) 167 { 168 #region 年齢を自動計算 169 if (txtsenedate.TextLength < 10) 170 { 171 //seinenTip = new ToolTip(this.components); 172 seinenTip.SetToolTip(txtsenedate,"生年月日はYYYY/MM/DD形式で入力してください"); 173 return; 174 } 175 176 string i = txtsenedate.Text; 177 DateTime a = DateTime.Parse(i); 178 179 DateTime birthDate = a; 180 //現在の日付 181 DateTime today = DateTime.Today; 182 183 //年齢を計算する 184 int age = GetAge(birthDate, today); 185 186 int age2 = age; 187 txtage.Text = age2.ToString(); 188 189 } 190 #endregion 191 private void txtsenedate_TextChanged(object sender, EventArgs e) 192 { 193 194 } 195 196 private void button3_Click(object sender, EventArgs e) 197 { 198 199 } 200 } 201}
Magkinh👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/10/28 23:36 編集

128行目と言われても行番号を振ってないと分からないのですが。(行番号を振ってほしいと言っているわけではありません。どの行かわかるようにしてほしいだけです)
guest

回答2

0

ベストアンサー

cmd.Parameters["顔写真"].DbType =pictureBox1.Image;
この行を指していると思いますが

なぜこの行だけDbTypeに値を入れようとしているのでしょう?

また、button1_Click内でDBに入れるためにImageをByte配列にしているのだと思いますが、実際にDBへ登録する時にbyte[] gazouを使わずpictureBox1.Imageを使っているのはなぜでしょう?

DbParameter クラス(System.Data.SQLiteのヘルプではありませんが)
このあたりを参照してご自身が説明できれば、解決に至ると思います。

投稿2017/10/29 00:53

YAmaGNZ

総合スコア10242

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

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

0

System.Drawing.Imageはいわば画像イメージを表すクラスなので、SQLite3のBLOBの型と合致しません。例えば、対人テーブルの構成が以下のようになっていることを前提としますと、

SQL

1CREATE TABLE 対人テーブル ( 2 CD TEXT 3 名前 TEXT 4 .... 5 顔写真 BLOB 6 ... 7)

質問者様のコードでは以下のようにしているので、

C#

1cmd.Parameters.Add("顔写真", System.Data.DbType.Binary);

値としてはbyte[]型をセットします。顔写真の画像ファイルをSQLite3データベースに保存したいということだと思いますので、

C#

1cmd.Parameters["顔写真"].Value = new byte[]; // 顔写真の画像ファイルのバイト列

とのようになります。PictureBoxの画像イメージのバイト列を扱うには、以下のサイトの記事が参考になります。
バイト配列→画像オブジェクト/画像オブジェクト→バイト配列の変換を行うには?
こちらのコードを利用させていただくとして、DBの対人テーブルの顔写真カラムに保存(INSERT)するときは

C#

1ImageConverter conv = new ImageConverter(); 2data = (byte[])conv.ConvertTo(pictureBox1.Image, typeof(byte[])); 3cmd.Parameters["顔写真"].Value = data;

反対に、SELECTでDBから取り出し、例えばPictureBoxにセットするときは

C#

1... 2DataTable datatable = new DataTable(); 3SQLiteCommand cmd = con.CreateCommand(); 4 5cmd.CommandText = "SELECT CD, 名前, 顔写真 FROM 対人テーブル WHERE CD='1'"; 6var reader = cmd.ExecuteReader(); 7DataTable dt = new DataTable(); 8dt.Load(reader); 9if (dt.Rows.Count > 0) 10{ 11 DataRow row = dt.Rows[0]; 12 13 // Debug.Assertで型が正しいか検証 14 Debug.Assert(row.ItemArray[0] is string); 15 string cd = (string)row.ItemArray[0]; 16 17 Debug.Assert(row.ItemArray[1] is string); 18 string name = (string)row.ItemArray[1]; 19 20 // PictureBoxのImageにセット 21 Debug.Assert(row.ItemArray[2] is byte[]); 22 byte[] data = (byte[])row.ItemArray[2]; 23 24 ImageConverter conv = new ImageConverter(); 25 Image img = (Image)conv.ConvertFrom(data); 26 pictureBox1.Image = img; 27 28 Debug.WriteLine(string.Format("CD={0}, Name={1}", cd, name)); 29} 30...

のようになるかと。当方ではVisual Studio 2017 + .NET Framework 4.6.1 の環境で確認しました。

蛇足ですが、PictureBoxのImageプロパティに新しいイメージをセットするときは、リソースリークを防ぐ為に適切にDispose()をするようご注意ください。上記の例ではそれはしていません。

投稿2017/10/29 00:39

dodox86

総合スコア9183

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問