Accessのテーブルに0001を書き込むとゼロサプレスされてしまいます。

タグの編集
投稿者 他路  (社会人) 投稿日時 2011/5/17 15:14:24
お世話になっております。早速ですが教えてください。
VisualBasic2010 と Access2010 を使用しています。

①TextK を、Access2010 で作成された、テーブル(基礎全データ)に新規レコードを作成し
  最初のフィールドに入力しようとしています。ところがテーブルには、ゼロサプレスされた
  (余分なゼロを省略)ものが、入力されてしまいます。
  どこが問題なのでしょうか?
  テーブル(基礎全データ)の全フィールド(27フィールド)は、テキスト型です。
  テーブルに入力する直前の MsgBox(TextK) では、例えば 0001 と表示されますが
  Access2010のテーブルには、 1 が入力されています。
  また、Access2010のテーブルを開いて、手動で、 0001 と入力すると、その通り入力
  されます。

   Com = New OleDb.OleDbCommand("INSERT INTO 基礎全データ Values(" & TextK _
     & ",'','','','','','','','','','','','','','','','','','','','','','','','有効','',yes)",cn)

    を
    .........INTO 基礎全データ Values(" & TextK.PadLeft(4,"0") _    
              & ",'','','','','','','','','','','','','','','','','','','','','','','','有効','',yes)",cn)

  としても、同じでした。


②Com = New OleDb.OleDbCommand("INSERT INTO 基礎全データ Values(" _
          & TextK.PadLeft(4,"0") & ",'','','','','','','','','','','','','','','','','','','','','','','','有効','',yes)",cn)
   で、最初のフィールドに、TextK を入力し残りの26フィールドに空白を入力する
 ようにしています。すっきりとできるコードはあるのでしょうか?

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

---------------------------------------------


         TextK = Trim$(ExtArr(1,2))
        Dim Com As OleDb.OleDbCommand
        Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" _
                          & "Data Source=H:\台帳.accdb;")
         cn.Open()
         Try
MsgBox(TextK)
             Com = New OleDb.OleDbCommand("INSERT INTO 基礎全データ Values(" & TextK.PadLeft(4,"0") & ",'','','','','','','','','','','','','','','','','','','','','','','','有効','',yes)",cn)
             Com.ExecuteNonQuery()
             cn.Close()
             MessageBox.Show("追加しましよ。","通知")
         Catch ex As Exception
             cn.Close()
             MessageBox.Show(ex.Message,"通知")
         End Try

-------------------------------------------------
投稿者 YuO  (社会人) 投稿日時 2011/5/17 16:02:46
>  ①TextK を、Access2010 で作成された、テーブル(基礎全データ)に新規レコードを作成し
>    最初のフィールドに入力しようとしています。ところがテーブルには、ゼロサプレスされた
>    (余分なゼロを省略)ものが、入力されてしまいます。
>    どこが問題なのでしょうか?

まず,「何故起きるか」から。

SQL文において,文字列は'で囲う必要があります (Accessだと"も許されますが)。
今回は,
INSERT INTO 基礎全データ Values(0001,'','','','','','','','','','','','','','','','','','','','','','','','有効','',yes)
というSQL文が発行されたため,0001は数値1として扱われ,さらにテキスト型に変換してINSERT文が発行されています。

回避策ですが,
・'で囲ってINSERTする
・パラメータを使う (推奨)
となります。
パラメータを使う方法については,
MSDN: OleDbParameter クラス (System.Data.OleDb)
http://msdn.microsoft.com/ja-jp/library/system.data.oledb.oledbparameter.aspx

MSDN: OleDbCommand.Parameters プロパティ (System.Data.OleDb)
http://msdn.microsoft.com/ja-jp/library/system.data.oledb.oledbcommand.parameters.aspx
のサンプルを参考にしてください。
# 単純に囲うのは,エスケープが面倒なことになるので割愛。


>  ②Com = New OleDb.OleDbCommand("INSERT INTO 基礎全データ Values(" _
>            & TextK.PadLeft(4,"0") & ",'','','','','','','','','','','','','','','','','','','','','','','','有効','',yes)",cn)
>     で、最初のフィールドに、TextK を入力し残りの26フィールドに空白を入力する
>   ようにしています。すっきりとできるコードはあるのでしょうか?

INSERT文に列名を指定することで必要な列だけを書くことができます。
INSERT INTO テーブル名 ( 列名, ... ) VALUES ( 値, ... )
という形です。
投稿者 しるふぃん  (社会人) 投稿日時 2011/5/17 16:09:20
SQL文発行時に、文字列として値をセットしているのではなく、数値として入力してしまっているのが
原因です。

0001ではなく、'0001'(シングルコーテーション)でくくれば問題ないはずです。

実際には、"Insert Into Vaalues('" & TextK & "','','','','','','','','','','','','','','','','','','','','','','','','有効','',yes)"
な感じになるかと。

②については、YuOさんのおっしゃるとおりですね。
余談ですが、Update文も同じようにできますよ。
投稿者 他路  (社会人) 投稿日時 2011/5/17 16:56:13
YuOさん、しるふぃんさん
ありがとうございます。
解りやすく、丁寧で迅速なアドバイスに感激です。

解決しました。

>SQL文が発行されたため,0001は数値1として扱われ
知りませんでした。

>実際には、"Insert Into Vaalues('" & TextK & "','','','','','','','','','','','','','','','','','','','','','','','','有効','',yes)"
これで、OKでした。
なんとなく、シングルコーテーションで解決できると思っていたのですが
& 'TextK' &  とやってしまい、演算子がありませんというエラーが発生しチンプンカンプンでした。
いま、そのエラーメッセージの意味も解りました。

>パラメータを使う方法については,
YuOさん推奨とありますので、これで解決したく、いま、読んでいるところです。
申し訳けありませんが明朝、結果(又は、質問)をご報告いたします。

>INSERT文に列名を指定することで
できました。

ありがとうございました。取り急ぎ、ご報告いたします。
投稿者 他路  (社会人) 投稿日時 2011/5/18 09:25:25
お早うございます。他路です。

パラメータの件、断念しました。まだ、私にはハードルが高いようです。
申し訳けありません。勉強します。

先の件は、最終的に次のようになりました。
おかげさまで、解りやすく、すっきりとなりました。

Com = New OleDb.OleDbCommand("INSERT INTO 基礎全データ (管理番号,有効撤去,CK) Values('" & TextK.PadLeft(4, "0") & "','有効',Yes)", cn)

YuOさん、しるふぃんさん、ありがとうございました。
解決とさせていただきます。