Yes/Noで回答可能な質問への選択回答をSQLserver2012にbit型データとして格納したい
- 評価
- クリップ 0
- VIEW 2,257
ASP.NET Webフォームアプリに関するご質問です(Visual Stdio 2010を使用、OSはWindows7)。
以下のようなフォームでなされた回答(ラジオボタンで選択された選択肢)をデータベース(SQLserver2012を使用)に格納したいです。
ただし、各質問に対する格納内容はそれぞれ、
「はい」を選択 → 1
「いいえ」を選択 → 0
「回答しない」を選択 → NULL
です。
その場合、質問への回答一覧を格納する、VB側の配列のデータ型はどのようにすればよいのでしょうか。
当初String型としていたのですが、データベースへの格納処理がなされていなかったので、
Boolean型として試したところNULLは格納できないとのことでした。
※回答にてNULL許容型の使用をご指摘いただきましたが、
恥ずかしながら記載のSelect構文とあわせての記述の仕方がわかりません。
(Select構文のやり方でない別の方法が適切なんでしょうか・・・?)
その点も教えていただけるとありがたいです。
それとも、テーブルデザインでデータ型をbit型から別の型に改善したほうがよいのでしょうか。
(想定の回答選択肢がすべてYes/Noに未回答を加えたものでしたので、bit型としたのですが・・・)
初級者ゆえそうしたデータ型の特性等にも詳しくないため、ぜひご回答いただきたいです。
よろしくお願いします。
Imports System.Data.SqlClient
Partial Class Self_list_testSub
Inherits System.Web.UI.Page
Protected Sub SelfFin_Btn_Click(sender As Object, e As System.EventArgs) Handles SelfFin_Btn.Click
Dim count As Integer = 0
Dim answer(4) As Boolean 'データ型はどうすれば?
'繰り返し文の記載(不十分な点です)
For count = 0 To 4
Select Case RadioButtonList.SelectedValue
Case 1
answer(count) = 1
Case 0
answer(count) = 0
Case Else
answer(count) = "NULL"
End Select
Next count
Dim newid As Integer = GetNewID()
Dim dtToday As DateTime = DateTime.Today
'最後にtbl_testRgにデータを格納します
Dim strSQL As String
strSQL = "INSERT INTO tbl_testRg" &
" (ID, result1, result2, result3, result4, result5, date)" &
" VALUES(" & newid & "," & answer(0) & "," & answer(1) & "," & answer(2) & "," & answer(3) & "," & answer(4) & "," & answer(5) & "," & dtToday & ")"
Dim cnStr As String = System.Configuration.ConfigurationManager.
ConnectionStrings("○○○○○○ConnectionString").ConnectionString
Using connection As New SqlConnection(cnStr)
Dim command As New SqlCommand(strSQL, connection)
connection.Open()
Try
command.ExecuteNonQuery()
Catch ex As Exception
lblMsg.Text = "エラー発生のため、処理を中止します! </ br>" & ex.Message
End Try
connection.Close()
End Using
End Sub
'格納用に新しいIDを取得します。
Private Function GetNewID() As Integer
'戻り値用定義(-1は失敗時用)
Dim ret As Integer = -1
Dim cnStr As String = System.Configuration.ConfigurationManager.
ConnectionStrings("○○○○○○ConnectionString").ConnectionString
Using connection As New SqlConnection(cnStr)
Dim SQL As String
SQL = "SELECT ISNULL(MAX(Self_ID),0)+1 FROM tbl_testRg"
Dim command As New SqlCommand(SQL, connection)
Try
connection.Open()
Dim result As Object = Nothing
result = command.ExecuteScalar()
If result IsNot Nothing Then ret = CInt(result)
connection.Close()
Catch ex As Exception
End Try
End Using
Return ret
End Function
End Class
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
Null許容型のBoolean型を使ってみてはどうでしょうか?
' 宣言方法
Dim i As Boolean?
Dim j? As Boolean
Dim k As Nullable(Of Boolean)
If i.HasValue Then
' 値がNull(VBではNothing)でない場合
Dim l = i.Value ' こうするとBoolean型として取り出せる
End If
上記回答は見当違いなので忘れて下さい。
今気づいたんですが、
配列のインデックス指定がそもそもの原因ではないでしょうか?
下のように変更したらどうなりますか?
' ソース引用一部修正
'Dim answer(4) As Boolean
Dim answer(4) As String
'繰り返し文の記載(不十分な点です)
'For count = 0 To 4
For count = 0 To answer.Length - 1 '配列などのループ処理上限は要素数(LengthやCount)から取得する方が変更に強い
Select Case RadioButtonList.SelectedValue
Case 1
answer(count) = "1"
Case 0
answer(count) = "0"
Case Else
answer(count) = "NULL"
End Select
Next count
'中略
'最後にtbl_testRgにデータを格納します
Dim strSQL As String
' 下記SQLのanswer(5)は余計では?
' strSQL = "INSERT INTO tbl_testRg" &
' " (ID, result1, result2, result3, result4, result5, date)" &
' " VALUES(" & newid & "," & answer(0) & "," & answer(1) & "," & answer(2') & "," & answer(3) & "," & answer(4) & "," & answer(5) & "," & dtToday & ")"
strSQL = "INSERT INTO tbl_testRg" &
" (ID, result1, result2, result3, result4, result5, date)" &
" VALUES(" & newid & "," & answer(0) & "," & answer(1) & "," & answer(2) & "," & answer(3) & "," & answer(4) & "," & "," & dtToday & ")"
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/09/04 18:09
Dim answer(4) As Nullable(Of Boolean)
のように宣言するとして、
Select Case RadioButtonList.SelectedValue
Case 1
answer(count) = 1
Case 0
answer(count) = 0
Case Else
answer(count) = "NULL"
End Select
のSelect構文にあわせて記述するとどのようになるのでしょうか・・・。
2016/09/04 19:37 編集
Null許容型のBooleanに入れることができる値はTrue、False、またはNothingとなります。
ただコードを読み返してみましたが、INSERT部でうまくいってないんですね。
むしろSQLを組み立てる際に使ってるのでString型の方がやり易い気がしてきたのですが、元々のString型の時はINSERTが動かなかったということでしょうか?
「0」、「1」、または「NULL」を設定したら動きそうな気がしたのですが^^;
2016/09/04 20:16
確認お願いします。
2016/09/05 08:16
配列のインデックスは確かにミスでした。修正いたしました。
また、いただいているコードのようにBoolean型でなくString型として
格納する値を"1"、"0"、"NULL"として試しているとすんなりデータベースに格納されたので、Stringu型の方で進めたいと思います。
ありがとうございます。