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

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

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

3597閲覧

StringBuilderとString.Formatを一緒に使いたい。

yyy

総合スコア49

SQL

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/08/12 05:54

編集2016/08/12 06:25

###前提・実現したいこと
StringBuilderとString.Formatを一緒に使いたい。

追加レコード、削除レコードに関しては正常に動作する。

以下の更新されたレコード の部分でコメントアウトにしてあるコードを通るように修正したい。
(現在は代わりにその下に書いてある部分8行を実行して動作させている。)

###該当のソースコード(ウィンドウを閉じるときにMDBファイルに書き込みをする)

VB.NET

1

Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed

Dim SQLCm As OleDbCommand = Cn.CreateCommand Dim Table As DataTable = DirectCast(DataGridView1.DataSource, DataTable) '例外処理 Try For Each Row As DataRow In Table.Rows 'Dim SQL As String = "" Dim SQL As StringBuilder = New StringBuilder() '●SQL文の生成 Select Case Row.RowState Case DataRowState.Added '▼追加されたレコード SQL.Append("INSERT INTO tblL ( ") SQL.Append("SELFLG") SQL.Append("a") SQL.Append("b") SQL.Append("c") SQL.Append("d") SQL.Append("e") SQL.Append("f") SQL.Append("g") SQL.Append(")") SQL.Append(String.Format("VALUES({0},{1},{2},{3},{4},{5},{6},{7})", Type(Row("SELFLG"), FuncParam1.paramElse), Type(Row("a"), FuncParam1.paramElse), Type(Row("b"), FuncParam1.paramString), Type(Row("c"), FuncParam1.paramString), Type(Row("d"), FuncParam1.paramString), Type(Row("e"), FuncParam1.paramString), Type(Row("f"), FuncParam1.paramString), Type(Row("g"), FuncParam1.paramString))) '▼削除されたレコード Case DataRowState.Deleted SQL.Append("DELETE FROM tblL WHERE ") SQL.Append(" IDNo = " & Row("IDNo", DataRowVersion.Original)) '▼更新されたレコード Case DataRowState.Modified SQL.Append("UPDATE tblL SET ") 'SQL.Append(String.Format(", SELFLG = {0}", Type(Row("SELFLG"), FuncParam1.paramElse))) 'SQL.Append(String.Format(", a = {0}", Type(Row("a"), FuncParam1.paramString))) 'SQL.Append(String.Format(", b = {0}", Type(Row("b"), FuncParam1.paramString))) 'SQL.Append(String.Format(", c = {0}", Type(Row("c"), FuncParam1.paramString))) 'SQL.Append(String.Format(", d = {0}", Type(Row("d"), FuncParam1.paramString))) 'SQL.Append(String.Format(", e = {0}", Type(Row("e"), FuncParam1.paramString))) 'SQL.Append(String.Format(", f = {0}", Type(Row("f"), FuncParam1.paramString))) 'SQL.Append(String.Format(", g = {0}", Type(Row("g"), FuncParam1.paramElse)))

SQL.Append(" SELFLG = '" & Type(Row("SELFLG"), FuncParam1.paramElse) & "', ")
SQL.Append(" a = '" & Type(Row("a"), FuncParam1.paramString) & "', ")
SQL.Append("b = '" & Type(Row("b"), FuncParam1.paramString) & "', ")
SQL.Append("c = '" & Type(Row("c"), FuncParam1.paramString) & "', ")
SQL.Append("d = '" & Type(Row("d"), FuncParam1.paramString) & "', ")
SQL.Append("e = '" & Type(Row("e"), FuncParam1.paramString) & "', ")
SQL.Append("f = '" & Type(Row("f"), FuncParam1.paramString) & "', ")
SQL.Append("g = " & Type(Row("g"), FuncParam1.paramElse))
SQL.Append("WHERE")
SQL.Append("IDNo = " & Row("IDNo", DataRowVersion.Original))

Case Else Continue For End Select '●更新実行 SQLCm.CommandText = SQL.ToString Cn.Open() SQLCm.ExecuteNonQuery() Cn.Close() Next Catch ex As Exception MessageBox.Show(ex.Message, "エラーが発生しました", MessageBoxButtons.OK, MessageBoxIcon.Error) Finally '▼後処理 Table.Dispose() Adapter.Dispose() SQLCm.Dispose() Cn.Dispose() End Try End Sub
Type()は、Functionで定義→Type(列,列の型名) String.Formatの使い方、StringBuilderの使い方はそれ単体ではわかるが、組み合わせようとするとわからなくなってしまう。 (単体が理解できていない可能性があるかもしれない…?) ###追記 「String.Formatを使うと文字連結の見やすさが上がり、間違いにくくなる」と聞き、使おうとしているのですが、イミディエイトウィンドウでSQLを調べるとガタガタで非常に気になります(スペースの入り方など、表示上合わせるとこっちがバラバラになる)。 通常見るところではないので、大丈夫ならいいのですが、SQL文に変換されたときにスペースの数などは関係ないのですか? (これまではあけるときはスペース1つ分と思ってきたので…。)

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

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

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

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

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

guest

回答2

0

自己解決

Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed Dim SQLCm As OleDbCommand = Cn.CreateCommand Dim Table As DataTable = DirectCast(DataGridView1.DataSource, DataTable) '例外処理 Try For Each Row As DataRow In Table.Rows 'Dim SQL As String = "" Dim SQL As StringBuilder = New StringBuilder() '●SQL文の生成 Select Case Row.RowState Case DataRowState.Added '▼追加されたレコード SQL.Append("INSERT INTO tblL ( ") SQL.Append("SELFLG") SQL.Append("a") SQL.Append("b") SQL.Append("c") SQL.Append("d") SQL.Append("e") SQL.Append("f") SQL.Append("g") SQL.Append(")") SQL.Append(String.Format("VALUES({0},{1},{2},{3},{4},{5},{6},{7})", Type(Row("SELFLG"), FuncParam1.paramElse), Type(Row("a"), FuncParam1.paramElse), Type(Row("b"), FuncParam1.paramString), Type(Row("c"), FuncParam1.paramString), Type(Row("d"), FuncParam1.paramString), Type(Row("e"), FuncParam1.paramString), Type(Row("f"), FuncParam1.paramString), Type(Row("g"), FuncParam1.paramString))) '▼削除されたレコード Case DataRowState.Deleted SQL.Append("DELETE FROM tblL WHERE ") SQL.Append(" IDNo = " & Row("IDNo", DataRowVersion.Original)) '▼更新されたレコード Case DataRowState.Modified SQL.Append("UPDATE tblL SET ") 'SQL.Append(String.Format(", SELFLG = {0}", Type(Row("SELFLG"), FuncParam1.paramElse))) SQL.Append(String.Format(", a = '{0}'", Type(Row("a"), FuncParam1.paramString))) SQL.Append(String.Format(", b = '{0}'", Type(Row("b"), FuncParam1.paramString))) SQL.Append(String.Format(", c = '{0}'", Type(Row("c"), FuncParam1.paramString))) SQL.Append(String.Format(", d = '{0}'", Type(Row("d"), FuncParam1.paramString))) SQL.Append(String.Format(", e = '{0}'", Type(Row("e"), FuncParam1.paramString))) SQL.Append(String.Format(", f = '{0}'", Type(Row("f"), FuncParam1.paramString))) SQL.Append(String.Format(", g = '{0}'", Type(Row("g"), FuncParam1.paramElse))) SQL.Append("WHERE") SQL.Append("IDNo = " & Row("IDNo", DataRowVersion.Original)) Case Else Continue For End Select '●更新実行 SQLCm.CommandText = SQL.ToString Cn.Open() SQLCm.ExecuteNonQuery() Cn.Close() Next Catch ex As Exception MessageBox.Show(ex.Message, "エラーが発生しました", MessageBoxButtons.OK, MessageBoxIcon.Error) Finally '▼後処理 Table.Dispose() Adapter.Dispose() SQLCm.Dispose() Cn.Dispose() End Try End Sub

投稿2016/08/12 08:09

yyy

総合スコア49

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

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

0

こんにちは。

String.FormatとStringBuilderを同時に使いたい場合は、StringBuilder.AppendFormat メソッドというものを使うことも出来ます。

ただ、問題が混在していませんか?
例えばString.Formatを使っている部分(コメントアウト側)と代替実装している部分を比較しているとシングルクォーテーションの違いがありますが影響していないでしょうかね。(MDBの場合はあってもなくてもどちらでも良かったような気もする・・・)

どういったエラーが発生するのですか?
そっちが本質的な問題だと思うのですが。

投稿2016/08/12 06:01

編集2016/08/12 06:03
Tak1wa

総合スコア4791

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

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

yyy

2016/08/12 06:19

回答いただきありがとうございます。 StringBuilder.AppendFormat メソッドですか…。少し調べてみます。 シングルクォーテーションの違い→どうなのでしょう?コードが通らないので、まだそのあたりは見ていません。 列:cで演算子がありません。 というエラーが出ています。
Tak1wa

2016/08/12 06:39

試しに実行できる環境も質問者さんしか持っていないと思いますし、もう少しエラー情報などが欲しいところです。 他の方からの回答も待ってみてください。
yyy

2016/08/12 07:05

{0}→'{0}'としたところ、通りました。 最初にご指摘いただいた通り、シングルクォーテーションがなかったことが原因だったようです(確認不足で申し訳ありません)。 '{0}'←これ、大分不細工なのでなんとかしたいのですけど、そうすると StringBuilder.AppendFormat メソッドを使うのがいいのでしょうか・・・。
Tak1wa

2016/08/12 07:38

何を躊躇っているのかよくわからないですが、VB14以上であれば$"{変数など}"という形式の文字列補完機能が利用できます。そちらはどうでしょうか。 そもそもクエリをStringBuilderで組み立てているのが問題というのであれば、O/Rマッパーなどについて調べてみてはどうでしょう。(MDBで使えるものを調べたことはないですが。)
yyy

2016/08/12 08:09

使用したことがないメソッドを使うのに躊躇するのはある意味当然かと思いますが、あまり経験がありませんのでご考慮ください。 $"{変数など}"という形式の文字列補完機能 文字列が有効ではないというエラーが出てしまいましたし、調べても何もヒットしませんでしたので、先の完成したコードを使用します。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問