• ベストアンサー

VB 2008のSQL文でスペースを削除したい

開発環境 VB2008 PC管理台帳.使用者氏名のスペースを削除して表示させたいのですが、デバッグすると下記のようなエラーがでます。どなたかアドバイスおねがいします。 「String "PC管理台帳.使用者氏名+" から型 'Double' への変換は無効です。」 ちなみにPC管理台帳.使用者氏名には空行があります。 -------------------------------------------------- Private Sub Btn検索_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn検索.Click Dim cn As New OleDb.OleDbConnection Dim dView As New DataView cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source = C;\管理台帳データベース.mdb" dadp = New OleDb.OleDbDataAdapter("SELECT " + Replace(+"PC管理台帳.使用者氏名+", " ", "") + ",PC管理台帳.新PC名,PC管理台帳.部署名,PC管理台帳.マシンベンダ名,PC管理台帳.マシンモデル FROM PC管理台帳 WHERE 新PC名='" + TextBox1.Text + "'", cn) dadp.Fill(dset, "PC管理台帳") 'データベースの表示 DataGridView1.DataSource = dset.Tables("PC管理台帳") End Sub --------------------------------------------------

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

No.2です。 ぐあ、ついつい釣られてダブルクオーテーション前提の書き方にしてしまった(汗) すみません。おっちょこちょいだなぁ俺… No.3の方が書いてるように、 selectCommand = "SELECT REPLACE(PC管理台帳.使用者氏名, ' ', ''), PC管理台帳.新PC名, ... FROM PC管理台帳 ..." で行けますね。REPLACEが使えるのであれば。

その他の回答 (3)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

"SELECT " + Replace(+"PC管理台帳.使用者氏名+", " ", "") + ",PC管理台帳.新PC名,PC管理台帳.部署名,PC管理台帳.マシンベンダ名,PC管理台帳.マシンモデル FROM PC管理台帳 WHERE 新PC名='" + TextBox1.Text + "'"        ↓ "SELECT Replace(PC管理台帳.使用者氏名,' ', '') AS 使用者名,PC管理台帳.新PC名,PC管理台帳.部署名,PC管理台帳.マシンベンダ名,PC管理台帳.マシンモデル FROM PC管理台帳 WHERE 新PC名='" & TextBox1.Text & "'" こんな感じでしょうか。

回答No.2

まず、REPLACE関数は、Access MDBでは使用できないようです。 (ソフトバンク SQLハンドブック第2版で調査) もし使えたとしても、そのSQL文だと検索出来ないですね。 以下、REPLACE関数が使えるDBでの検索と仮定して書きます。 DataAdapterを宣言する前に、SQL文(selectCommandの部分)を String変数に入れて、Debug.Print、またはConsole.WriteLine等で 実際にその変数の中身を確認してみてください。 まともな形になってないはずです。 REPLACE関数の部分は、 REPLACE(PC管理台帳.使用者氏名, " ", "") になるようにしないと。 その書き方ですと、根本的に勘違いなさっているような感じですが、 SQL文はあくまで「DBに渡す『文字列』」です。 VB内部で解析される関数などではありません。 selectCommand = "SELECT REPLACE(PC管理台帳.使用者氏名, """ & _ " " & _ """, """"), PC管理台帳.新PC名, ... FROM PC管理台帳 ..." みたいな形でないと。(意図的に途中で切ってます) (「"」3つで、文字列に直接「"」を代入。4つで直接「""」を代入) ともあれ、REPLACE関数(または類似の関数)が使えない以上、 REPLACEせずにデータを取り込んで、VB側で変換を掛けるしか なさそうです。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

Replace(+"PC管理台帳.使用者氏名+", " ", "") これの"("直後の"+"と、"~使用者氏名+"の"+"がとても気になるんですが… あと、文字列の結合には古風に"&"でやった方が意思が伝わるようです。 "+"を使うと、String型でない(演算可能な型の)場合、加算しようとしますから。

tuyo1980
質問者

補足

("SELECT " Replace("PC管理台帳.使用者氏名", " ", "") ",PC管理台帳.新PC名,PC管理台帳.部署名,PC管理台帳.マシンベンダ名,PC管理台帳.マシンモデル FROM PC管理台帳 WHERE 新PC名='" + TextBox1.Text + "'", cn) をどうかえればいいのか正直わかりません。

関連するQ&A

  • VB 2008 Express Editionでデータの抽出ができない

    VB 2008 Express Editionでデータの抽出ができません。 「Btn検索」ボタン押下時に「TextBox1.text」のデータで抽出を行いたいのですがデバッグして「TextBox1.text」にデータを入力して「Btn検索」ボタンを押下すると 「OledbExceptionはハンドルされませんでした。1つ以上の必要な値のパラメータが設定されていません」と表示されてしまいます。 ちなみにソースは下記になります。 -------------------------------------------------------------- Private Sub Btn検索_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn検索.Click Dim cn As New OleDb.OleDbConnection Dim dView As New DataView Dim strRec As String cn.ConnectionString= "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source = C;\管理台帳データベース.mdb" dadp = New OleDb.OleDbDataAdapter("SELECT * FROM PC管理台帳 WHERE 新PC名=TextBox1.Text", cn) dadp.Fill(dset, "PC管理台帳") 'データベースの表示 DataGridView1.DataSource = dset.Tables("PC管理台帳") End Sub -------------------------------------------------------------- ちなみに下記のようにTextBox1.Textを'1111'とかにするとうまく抽出できます。 dadp = New OleDb.OleDbDataAdapter("SELECT * FROM PC管理台帳 WHERE 新PC名='1111'", cn) となたかアドバイスお願いします。

  • VB2008データベース

    非接続型データベースでUpdateをする文を書いていますがUpdateでエラーが出てしまいます。  OleDbCommandBuilder の参照をネットで確認等していますがエラーの内容がわかりません。 データベース参考書等にも下記と同じ文例でかいてあります。 どなたか教えてください。 *VB2008で開発しています。 Dim cn As OleDb.OleDbConnection Dim Buf As String Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet Dim dTbl As DataTable Dim cBuild As OleDb.OleDbCommandBuilder Buf$ = DefCnSt$ & X_SystemFile$ & ";Jet OLEDB:Database Password=" & XdtPs$ cn = New OleDb.OleDbConnection(Buf$) dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 物件", cn) dSet = New DataSet("物件") dAdp.Fill(dSet, "物件") dTbl = dSet.Tables("物件") dTbl.Rows(2)(1) = "ABC" cBuild = New OleDb.OleDbCommandBuilder(dAdp) dAdp.Update(dSet, "物件") <-ここでエラーが出ます。

  • GridViewのデータソースの入れ方がわかりません

    OleDb.OleDbDataAdapter' が定義されていません DataSet' が定義されていません。 OleDb.OleDbConnection' が定義されていません。 OleDb.OleDbDataAdapter' が定義されていません 以上の エラーが出ます 定義の、意味がわかりません 教えてください お願いします WinXP Microsoft Visual Web Developer 2008 ASPX Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet = New DataSet("顧客台帳") Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\*******\*****.mdb;") 'データセットに取得し、DataGridViewに関連付ける dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 顧客台帳", cn) dAdp.Fill(dSet, "顧客台帳") Me.GridView1.DataSource = dSet.Tables("顧客台帳") End Sub

  • データセットへの取得について

    VB2005はじめたばかりです。 MDBからデータを抽出してデータセットへのところでエラーとなります。 Private Sub Button1_Click Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet = New DataSet("t_社員") Dim cn As OleDb.OleDbConnection _ = New OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\VB2005\SampleDB.mdb;") dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 社員 where 社員番号=>101", cn) dAdp.Fill(dSet, "t_社員") ★ここでエラーとなってしまいます。【where 社員番号=>101", 】をトルと正常となります。 恐れ入りますがご指摘いただけますでしょうか。

  • Datagridviewのコンボボックスにつきまして

    vb2005です。 DataGridViewコントロールのデータセットにデータベースのテーブルをセットしています。 そのDataGridViewの1列目にコンボボックスを設定し、 そのコンボボックスのデータセットにも別のテーブルをセットしたいのです。 Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As New DataSet Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=C:\DB.mdb;") dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 商品", cn) dAdp.Fill(dSet, "t_商品") DataGridView1.DataSource = dSet.Tables("t_商品") dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 品種", cn) dAdp.Fill(dSet, "t_品種") Dim col As System.Windows.Forms.DataGridViewComboBoxColumn = DataGridView1.Columns(1) ・・・・★ col.DataSource = dtSet.Tables("t_品種") col.DisplayMember = "品種名" col.ValueMember = "品種コード" 上記のように記述しているのですが、★の部分で、下記のエラーになります。 型 'System.Windows.Forms.DataGridViewTextBoxColumn' のオブジェクトを型 'System.Windows.Forms.DataGridViewComboBoxColumn' にキャストできません データソースを指定したDataGridViewの列にはコンボボックス等の設定は 出来ないのでしょうか?

  • データグッドビュー編集後のエラーについて

    VB初心者です。 (1)フォームロード時にアクセスのデータベースにアクセスし、データグリッドビューに表示 (2)フォーム上のデータグリッドビューを編集 (3)データベースに登録ボタン押下すると、フォーム上にあるデータグリッドビューをアクセスのデータベースに反映(update) というプログラムを作成中ですが、データベースに登録ボタンを押下すると「オブジェクト参照がオブジェクト インスタンスに設定されていません。」とのエラーが出ます。 ネットで色々調べたのですが、よくわかりませんでした。 このエラー内容が分かる方、ご教示の程よろしくお願いします。 PC環境はWINXP+VS2008です。 Imports System.IO Imports System.Data.OleDb Public Class Form1 Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet = New DataSet("T_資料") Public Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load '▼フォームロード時の処理 Dim cn1 As New OleDb.OleDbConnection("Provider=""Microsoft.Jet.OLEDB.4.0"";Data Source=" & Application.StartupPath & "\登録.mdb;") Dim cmd1 As New OleDb.OleDbCommand("SELECT * FROM T_資料", cn1) cn1.Open() Dim dAdp As OleDb.OleDbDataAdapter dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM T_資料", cn1) dAdp.Fill(dSet, "T_資料") DataGridView1.DataSource = dSet.Tables("T_資料") End Sub Public Sub cmd_Db_reg_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_Db_reg.Click '▼「データベースに登録」ボタンを押下したときの処理 Try Dim adapter As New tourokuDataSetTableAdapters.T_資料TableAdapter() dAdp.Update(dSet, "T_資料") MessageBox.Show("更新に成功しました。") Catch ex As Exception MessageBox.Show("更新に失敗しました。" + vbCr + ex.Message) End Try End Sub End Class

  • DataGridViewからDBの更新

    DataGridViewの内容を変更してボタンを押したらDBを更新する ということをしたいのですが とあるサンプルコードには Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet = New DataSet("t_商品") Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection( _ "Provider=Microsoft.ACE.OLEDB.12.0;" _ & "Data Source=C:\VB2008\SampleDB.accdb;") 'データセットに取得してデータを表示する dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 商品", cn) dAdp.Fill(dSet, "t_商品") Me.DataGridView1.DataSource = dSet.Tables("t_商品") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim dTbl As DataTable Dim dRow As DataRow Dim i As Integer 'DataGridからデータソースを取得する dTbl = Me.DataGridView1.DataSource '編集された行をコミットする For Each dRow In dTbl.Rows If dRow.RowState <> DataRowState.Unchanged Then dRow.AcceptChanges() End If Next End Sub End Class となっているのですがこのまま使用しても更新されません 全くの他力本願な質問ですがよろしくおねがいします イミデイトにはグリッド内容をnchange」になっています?

  • MDBのフィールド数が多いとエラーになります。

    下記のコードは、 (1)フォームロード時にアクセスのデータベースにアクセスし、データグリッドビューに表示 (2)フォーム上のデータグリッドビューを編集 (3)データベースに登録ボタン押下すると、フォーム上にあるデータグリッドビューをアクセスのデータベースに反映(update) という作業を行うプログラムです。 このコードを実行した場合、アクセスのデータベース(登録.mdb)のフィールド数の100以上になると、「クエリーが複雑すぎます」とのエラーが出て、データベース(登録.mdb)の更新が行えません。 何とかエラーを出なくする方法は無いでしょうか? PC環境はWINXP+VS2008です。 Imports System.IO Imports System.Data Imports System.Windows.Forms Public Class Form1 Public dAdp As OleDb.OleDbDataAdapter Public dSet As DataSet = New DataSet("T_資料") Public Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load ''▼フォームロード時の処理 Dim cn1 As New OleDb.OleDbConnection("Provider=""Microsoft.Jet.OLEDB.4.0"";Data Source=" & Application.StartupPath & "\登録.mdb;") Dim cmd1 As New OleDb.OleDbCommand("SELECT * FROM T_資料", cn1) cn1.Open() dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM T_資料", cn1) dAdp.Fill(dSet, "T_資料") Me.DataGridView1.DataSource = dSet.Tables("T_資料") cn1.Close() End Sub Public Sub cmd_Db_reg_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_Db_reg.Click '▼「データベースに登録」ボタンを押下したときの処理 Try Dim Builder As New OleDb.OleDbCommandBuilder(dAdp) Builder.GetUpdateCommand() dAdp.Update(dSet.Tables("T_資料")) MessageBox.Show("更新に成功しました。") Catch ex As Exception MessageBox.Show("更新に失敗しました。" + vbCr + ex.Message) End Try End Sub End Class

  • OLE でACCESSデータを取得するとメモ型の内容255文字で切れてしまう

    お世話になります。 ■開発環境  VisualBasic2008 Express Edition  ACCESS2003(データ) ■質問内容  VBでaccessのmdbからデータを取得し、画面に表示しようと  しています。  ところが、メモ型の項目が255文字で切れてしまいます。  webでいろいろと調べましたが、jetエンジンの問題かなという  ところまではたどり着いたのですが、具体的にどうすれば改善  できるのかわかりません。  わかる方教えていただけないでしょうか。  よろしくお願いいたします。 ■ソース Dim SQL As String Dim Cn As OleDb.OleDbConnection = New OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="c:\message.mdb;") Dim dAdp As OleDb.OleDbDataAdapter Dim dView As DataView Dim dSet As DataSet = New DataSet("Detail") SQL = "SELECT M_ID,M_Title,M_Detail FROM MESSAGE_TBL " dAdp = New OleDb.OleDbDataAdapter(SQL, Cn) dAdp.Fill(dSet, "Detail") dView = New DataView(dSet.Tables("Detail"), "", "", DataViewRowState.CurrentRows) DataGridView1.DataSource = dView M_ID : 数値型、M_Title : テキスト型、M_Detail : メモ型 DataGridView1に表示されるときには、M_Detailが255文字になっています。     また、 'MessageBox.Show(Len(dSet.Tables("Detail").Rows(1)(2)))     で見たときにすでに255文字に切れていました。

  • VBにExcelを読み込む

    VBにExcelデータを取り込んでからSQL ServerにINSERTしたいんですが、 読み込みに時間がかかりすぎるんですが、どういったやり方だとうまくいきますか? データをまとめてVBに取得できればいいんですが。 Accessだとちょっと問題があって出来ない。 Private Sub Excel() Dim i, j As Integer Dim dSet As DataSet = New DataSet Dim dAdp As OleDb.OleDbDataAdapter Dim cn As OleDb.OleDbConnection Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Dim SQL As String Dim Seru1 As String Dim Seru2 As String Dim Seru3 As String cn = New OleDb.OleDbConnection( _ "provider=Microsoft.Jet.OLEDB.4.0; " & _ "data source='" & lblファイル.Text & "'; " & _ "Extended Properties=Excel 8.0;") '「Sheet1」シートのデータを取得する dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM [Sheet1$]", cn) dAdp.Fill(dSet) For i = 0 To dSet.Tables(0).Rows.Count() - 1 For j = 0 To dSet.Tables(0).Columns.Count() - 1 Debug.Write(dSet.Tables(0).Rows(i)(j) & ControlChars.Tab) Next Debug.WriteLine("") xlApp = CreateObject("Excel.Application") 'xlApp.Visible = True 'アプリケーションの表示 'Set book = app.Workbooks.Add '新規作成 xlBook = xlApp.Workbooks.Open(lblファイル.Text) 'ファイルを開く xlSheet = xlBook.Worksheets(1) 'シート1を選択 'Debug.WriteLine(xlSheet.Cells(1, 1).Value) '値を読み出す Seru1 = i Seru2 = i Seru3 = i If Not i = 0 Then If Not i = 1 Then sqlConn = objclass2.gFunc_OpenSqlConn() sqlCmd = sqlConn.CreateCommand() '初期化 imtxtExcelコード2.Text = "" imtxtExcel1.Text = "" imtxtExcelコード1.Text = "" '読み出し imtxtExcelコード2.Text = xlSheet.Range("A" + Seru1).Value imtxtExcel1.Text = xlSheet.Range("B" + Seru2).Value imtxtExcelコード1.Text = xlSheet.Range("C" + Seru3).Value SQL = "" SQL = SQL & "INSERT INTO W_Excel( " SQL = SQL & "コード1,コード2,備考 ) " SQL = SQL & "SELECT " SQL = SQL & "'" & imtxtExcelコード2.Text & "'," SQL = SQL & "'" & imtxtExcel1.Text & "'," SQL = SQL & "'" & imtxtExcelコード1.Text & "'" sqlCmd.CommandText = SQL sqlCmd.ExecuteNonQuery() End If End If xlSheet = Nothing xlBook.Close() 'Book を閉じる xlBook = Nothing xlApp.Quit() 'Quit メソッドを使って Excel を終了します。 xlApp = Nothing Next End Sub End Class

専門家に質問してみよう