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

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

ただいまの
回答率

88.37%

Yes/Noで回答可能な質問への選択回答をSQLserver2012にbit型データとして格納したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,257

taketake221

score 17

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

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 & ")"

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 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 編集

    > taketake221さん
    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型の方で進めたいと思います。

    ありがとうございます。

    キャンセル

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

  • ただいまの回答率 88.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る