none
改行を含む文字列をExcuteReaderで読み込むとVBのコードに変換される RRS feed

  • 質問

  • Sql server express 版で、nvarchar に改行を含む文字列を登録して、vb.net から ExcuteReader で値を取り出すと、vbのコードに変換されます。数日前までは、そのままの値を返していましたが、急に変換されるようになりました。どこかに変換する、しないの設定があるのでしょうか?ご存知の方がおられましたら、ご教授をお願い致します。

    テスト char(13) char(10) 項目 → "テスト" & VbCrLf & "項目" のように変換されて、値を返してきます。

    よろしくお願い致します。

    2016年2月27日 18:21

回答

  • こんにちは。

    私も試してみました。
    私のほうではSurferOnWwwさんと逆で制御コードで表示されましたね。

    SQLServerはAzureSQLDatabaseを使いました。
    resultの登録値は改行コード込の以下の文字列(nvarchar(max))です。

    select 
        value 
    from 
        DataTbl 
    where 
        id = 1

    環境はVisual Studio 2015 です。
    オプションでは存在しなさそうだったので、VisualStudioのバージョンに依存する動作なのかもしれません。
    どのバージョンで変わったのだろう。
    質問者さんのほうで最近VisualStudioのバージョン変更などはありましたか?
    Update適用なども含めて。

    どちらにせよ、取得結果の動作としては問題ないはずなので、
    バージョンに依存する問題だとした場合は割り切るしかないかもしれませんね。


    2016年2月28日 10:36
    モデレータ

すべての返信

  • こんにちは。

    vbCrLf = \r\n = char(13)+char(10)
    なので、変換される動作は正しいと思うのですが、
    数日前まではどのような動作になっていたのでしょうか。
    詳細を教えてください。

    また、その数日間でどういった変更を加えたのかも教えてください。

    2016年2月27日 18:32
    モデレータ
  • > vb.net から ExcuteReader で値を取り出すと、vbのコードに変換されます。

    > テスト char(13) char(10) 項目 → "テスト" & VbCrLf & "項目" のように変換されて、
    > 値を返してきます。

    それは具体的にどうやって確認しましたか?

    「ExcuteReader」しただけでは読めないので、そこから Console やプリンタに出力するなど読める形にしていると想像していますが、そのプロセスを「数日前」と変えたということはないですか?

    可能であればそのあたりのコードを開示できませんか?

    あと、質問者さんの環境(OS, .NET, Visual Studio, SQL Server のバージョンなど)を書いてください。

    2016年2月28日 0:28
  • ご回答ありがとうございます。

    プログラムの中にSQL文を直接書かずに、テーブルに保存しようとしてして、nvarcharにSQL文を保存しています。

    少し前までは、保存したSQL文を読みだして、そのまま実行できていましたが、急にできなくなり、

    色々試していると、単純に文字列にchar(13)等の制御コードが含まれているとVB用のコードに変換して返してきました。

    データ取得部分のプログラムは変更していませんので、知らずに何か設定変更したかは分からない状況です。

    例えば、テーブルには以下のような感じで単純に文字列を char(13 char(10) で改行して記録しておきまして、

    テスト

    項目

    SqlDataReder を生成して、Read して、変数に読み込んでいます。

    数日前までは、前日のようにバイナリデータそのまま取得していましたが、

    現在は、 以下のような文字列が返ってきます。文字列はが行ごとに""でくくられて、&でVbCrLfになっています。 

    "テスト" & VbCrLf & "項目"

    この部分のプログラムは変更しておらず、取得後の部分を修正しておりました。

    フリーソフトとかで取得したデータをVB用のコードに変換するようなものがありますが、

    それのような感じで、VB用のコードが返ってきて困っています。

    返ってきた文字列を再度バイナリの制御文字に変換することはできますが、それもどうかと考えております。

    2016年2月28日 3:22
  • ご回答ありがとうございます。

    具体的な情報を記載せず質問してしまい失礼致しました。

    環境は以下です。

    Window7、Visual Studio Community 2015、SQL Server 2012 Express、.NET Framework 2.0

    プログラムでは以下の部分で、SqlDataReaderを設定して、

            dim ioReader As SqlDataReader

            Dim Cmd As SqlCommand = Cn.CreateCommand()

            Cmd.CommandTimeout = 30
            Cmd.CommandText = inSQL

            ioReader = Cmd.ExecuteReader()

    以下の部分で、データを取得状態をみたいので、テーブル変数に手動でまとめています。

            Dim sr As SqlDataReader = Nothing

            Dim tbl As DataTable

            Try

                    For i As Integer = 0 To sr.FieldCount - 1
                        tbl.Columns.Add(sr.GetName(i))
                    Next

                    Do While sr.Read() = True
                        Dim rw = tbl.Rows.Add()

                        For i As Integer = 0 To sr.FieldCount - 1
                            rw.Item(i) = sr.Item(i)
                        Next
                    Loop

                    sr.Close()

    SQL文をプログラム中に直書きしたくなかったので、テーブルに記録してプログラム中に読み出して

    実行するようにしていましたので、テーブルには nvarchar(max) にSQL文を保存しています。

    数日前までは、このプログラムで登録したSQL文を取得して、そのまま実行できていましたが、

    急に、取得内容が以下のように単純な改行を含んだ文字列が右のようにVB用のコードに変換されます。

    データ取得部分は変更していませんので、関係する環境を変更したか?は分からない状況です。

    データ        →  "テスト" & VbCrLf & "項目"

    項目

    何かご存知でしたら、ご教授をお願い致します。

    2016年2月28日 4:17
  • 提示されたコードが動くとは思えないのですが(接続が Open されてないし、sr は Nothing のままだし・・・)、それはとりあえず置いといて、最初の私の質問に答えていただけないでしょうか?

    DataTable に SQL Server から取得した文字列を格納したらしいというのはわかりました。でも、肝心なところ、

    > データ → "テスト" & VbCrLf & "項目"

    をどうやって確認したかに答えていただいてないです。

    プログラム中の DataTable から問題の文字列を Console やプリンタに出力するなどして読める形にしていると想像していますが、それはどのようにしているのですか? そのやり方を「数日前」と変えたというのが原因ではないかと想像しているのですが・・・

    2016年2月28日 5:11
  • ご回答ありがとうございます。

    提示しましたコードは、全部だと長いので関係しそうな部分を抜粋しておりました。

    取得したデータの確認は、SqlDataReader の Read メソッドで読み取った Item で

    取得した内容をデバッグで止めて、変数内容を確認すると、VBのコード風の内容となっております。

    普通なら、登録した内容がそのまま返ってくるはずですので。

    テーブルには、データ取得用のSELECT文を設定しており、取得した文字列で

    データベースへSQL文を実行しています。当然クエリ実行時に構文エラーとなります。

    このあたりのプログラムは修正しておりませんでしたので、困っておりました。

    設定関係で、VBのコードに変換するようなオプションか?何かが影響しているのか?と考えておりました。

    何かご存知であれば、よろしくお願い致します。

    2016年2月28日 7:42
  • > 取得したデータの確認は、SqlDataReader の Read メソッドで読み取った Item で
    > 取得した内容をデバッグで止めて、変数内容を確認すると、VBのコード風の内容となっております。

    Visual Studio のデバッガで見ると "テスト" & VbCrLf & "項目" と表示されると言ってます?

    自分の環境(Vista SP2 32-bit, Visual Studio 2010 Professional, .NET 4, SQL Server 2008 Express)で試した限りそういうことはなかったのですが、何か違うんでしょうね。

    やったことは、以下の通りです。

    (1) 以下のコメントアウトしたコードで nvarchar(50) のフィールド Name に VB.NET のコードで言うと "テスト" & VbCrLf & "項目" という改行コードを含む文字列をインサートします。

    Option Strict Off
    Imports System.Data.SqlClient
    
    Module Module1
    
        Sub Main()
            Dim connString As String = "Data Source=.\SQLEXPRESS;Initial Catalog=TestDatabase;Integrated Security=True"
            Dim selectQuery As String = "SELECT [Id], [Name], [Price] FROM [Table]"
            Dim insertQuery As String = "INSERT INTO [Table] ([Id], [Name], [Price]) VALUES (@Id, @Name, @Price)"
    
            Using conn As New SqlConnection(connString)
                conn.Open()
                'Using cmd As New SqlCommand(insertQuery, conn)
                '    cmd.Parameters.AddWithValue("@ID", 12)
                '    cmd.Parameters.AddWithValue("@Name", "テスト" & vbCrLf & "項目")
                '    cmd.Parameters.AddWithValue("@Price", 1000)
                '    cmd.ExecuteScalar()
                'End Using
    
                Using cmd As New SqlCommand(selectQuery, conn)
                    Using reader As SqlDataReader = cmd.ExecuteReader()
                        If reader IsNot Nothing Then
                            While reader.Read()
                                Dim id As Integer = reader.Item(0)
                                Dim name As String = reader.Item(1)
                                Dim price As Decimal = reader.Item(0)
                                Console.WriteLine("Id = {0}, Name = {1}, Price = {2}", id, name, price)
                            End While
                        End If
                    End Using
                End Using
            End Using
        End Sub
    
    End Module

    (2) SQL Server Management Studio (SSMS) で見ると以下の通り上のコメントアウトしたコードでデータがインサートされているのが確認できます。改行コードは空白として表示されています。

    (3) 次に上のコードのコメントアウトしてない部分をデバッグ実行し、ブレークポイントで止めて問題のデータを見ると以下のようになっています。SSMS に表示されたのと同様に改行コードは空白として表示されています。

    (4) コンソールに出力すると以下の画像のように改行されます。間違いなく改行コードが入っているのが分かります。

    質問者さんの環境で上記と同様なことを試して、その結果とどこがどう違うか確認してください。

    2016年2月28日 10:28
  • こんにちは。

    私も試してみました。
    私のほうではSurferOnWwwさんと逆で制御コードで表示されましたね。

    SQLServerはAzureSQLDatabaseを使いました。
    resultの登録値は改行コード込の以下の文字列(nvarchar(max))です。

    select 
        value 
    from 
        DataTbl 
    where 
        id = 1

    環境はVisual Studio 2015 です。
    オプションでは存在しなさそうだったので、VisualStudioのバージョンに依存する動作なのかもしれません。
    どのバージョンで変わったのだろう。
    質問者さんのほうで最近VisualStudioのバージョン変更などはありましたか?
    Update適用なども含めて。

    どちらにせよ、取得結果の動作としては問題ないはずなので、
    バージョンに依存する問題だとした場合は割り切るしかないかもしれませんね。


    2016年2月28日 10:36
    モデレータ
  • デバッガ上での Visual Studio のバージョンの違いによる改行コードの見え方の違いという話のようですね。

    VS2010: "テスト  項目"
    VS20??: テスト char(13) char(10) 項目
    VS2015: "テスト" & VbCrLf & "項目"

    という感じなのでしょうか。

    質問者さんの言われる、

    > テーブルには、データ取得用のSELECT文を設定しており、取得した文字列で
    > データベースへSQL文を実行しています。当然クエリ実行時に構文エラーとなります。

    は上記の問題とは関係なくて別のところに問題の原因がありそうですが、デバッガ上での見え方が変わったので混乱したということだったのでしょうか。

    2016年2月28日 10:57
  • SurferOnWww さん、Tak1wa さん

    ご回答ありがとうございました。

    テストまで作業頂きまして、ありがとうございました。

    デバッガ上の見え方だけではなくて、取得したデータ自体が変更されています。

    Tak1waさんがおしゃっておられるように、バージョンの問題かもしれません。

    Visual Studio のアップデータは特に行っておりませんが、何かしらのアップデートの影響かもしれません。

    オプション等の設定も特にないようですので、別のバージョンでも試してみます。

    色々、お手数頂きまして、誠にありがとうございました。

    2016年2月28日 12:46
  • > デバッガ上の見え方だけではなくて、取得したデータ自体が変更されています。

    それはどうやって確認しましたか?

    DB そのものに何もしてない、コードも変えてないとすると、SqlDataReader で読んできたデータに違いが出ることがありえないと思っていますが、実際にそういうことが起こるとすると、そのあたりは非常に興味があります。

    これで終わりにしないで、せめて「取得したデータ自体が変更されています」というのをどうやって確認したか、それは確かだと判断した根拠などを書いてからにしていただけませんか?

    このフォーラムはユーザー同士の情報共有の場所として提供されているということで、質問者さんにも情報の提供をお願いします。

    2016年2月28日 13:09
  • SurferOnWww さん

    ご回答ありがとうございました。

    再度データの動きをキチンと調べましたところ、ご指摘のようにデバッグ上の見え方の問題のようでした。

    データの確認はデバック時の画面上での確認とイミディエイトウィンドウでの ?strSql のような変数内容の表示で

    簡易的に行っており、取得後のSQL文でのエラー発生が構文エラーでしたので原因をこれと決めつけておりました。

    取得したデータを一旦ファイルに吐き出すと、元の状態となっており、SQLのエラーはSQL文組み立て時の問題でした。

    表示形式の変更で混乱していたようで、ご指摘頂きまして、ありがとうございました。

    しかし、デバッグ上での変数内容をコピーして、メモ帳等で確認する場合に見え方が変わっていると

    本当はどうなっているか?をファイルに吐き出す等の方法でチェックする必要があり、

    便利なのかは疑問です。

    • 編集済み ntcmt 2016年2月28日 17:55
    2016年2月28日 17:27
  • デバッガ上での見え方の問題だけだったとのこと、情報提供をありがとうございました。

    > しかし、デバッグ上での変数内容をコピーして、メモ帳等で確認する場合に見え方が変わって
    > いると本当はどうなっているか?をファイルに吐き出す等の方法でチェックする必要があり、
    > 便利なのかは疑問です。

    そのあたりは考え方次第だと思います。

    デバッガで文字列の内容を調べるといった局面で、例えば今回の例のように "テスト" と "項目" の間に改行コードが入っている場合、それが "テスト  項目" と表示されて空白の部分が何だか分からないより、"テスト" & vbCrLf & "項目" と表示された方がデバッガの情報としては有益だと自分は思います。

    「本当はどうなっているか?」は VS2015 のデバッガでは "テスト" & vbCrLf & "項目" と表示されると認識しておけば、「ファイルに吐き出す等」は必要ないはずですから。

    2016年2月29日 2:11
  • 今回のように実際に実行するSQLを確認したいとかの場合、改行が改行として表示されないことや、簡単にコピーができないのでは当然不便ですが、そういう目的のためにビジュアライザーという機能があります。

    ウォッチなどして変数内容を表示しているところに、虫めがねマークのようなものが出ていると思います。
    そこをクリックすると、専用のビジュアライザーでデータ内容を表示できます。

    ※今回のように文字列データの場合はテキストビジュアライザー

    ビジュアライザーというのは、要は各種データ形式(というか型というか)に対応した専用データビューアーで、たとえばDataSet、DataTableのようなテーブルデータや、Xmlや、テキストを見やすい方法で表示することができるものです。

    ※でもDataTableの表示とかは昔からバグバグだったりしますが


    • 編集済み なちゃ 2016年2月29日 7:44
    2016年2月29日 7:44