Accessのテーブルに0001を書き込むとゼロサプレスされてしまいます。 への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 他路  (社会人)
投稿日時
2011/5/17 16:56:13
YuOさん、しるふぃんさん
ありがとうございます。
解りやすく、丁寧で迅速なアドバイスに感激です。
解決しました。
>SQL文が発行されたため,0001は数値1として扱われ
知りませんでした。
>実際には、"Insert Into Vaalues('" & TextK & "','','','','','','','','','','','','','','','','','','','','','','','','有効','',yes)"
これで、OKでした。
なんとなく、シングルコーテーションで解決できると思っていたのですが
& 'TextK' & とやってしまい、演算子がありませんというエラーが発生しチンプンカンプンでした。
いま、そのエラーメッセージの意味も解りました。
>パラメータを使う方法については,
YuOさん推奨とありますので、これで解決したく、いま、読んでいるところです。
申し訳けありませんが明朝、結果(又は、質問)をご報告いたします。
>INSERT文に列名を指定することで
できました。
ありがとうございました。取り急ぎ、ご報告いたします。
ありがとうございます。
解りやすく、丁寧で迅速なアドバイスに感激です。
解決しました。
>SQL文が発行されたため,0001は数値1として扱われ
知りませんでした。
>実際には、"Insert Into Vaalues('" & TextK & "','','','','','','','','','','','','','','','','','','','','','','','','有効','',yes)"
これで、OKでした。
なんとなく、シングルコーテーションで解決できると思っていたのですが
& 'TextK' & とやってしまい、演算子がありませんというエラーが発生しチンプンカンプンでした。
いま、そのエラーメッセージの意味も解りました。
>パラメータを使う方法については,
YuOさん推奨とありますので、これで解決したく、いま、読んでいるところです。
申し訳けありませんが明朝、結果(又は、質問)をご報告いたします。
>INSERT文に列名を指定することで
できました。
ありがとうございました。取り急ぎ、ご報告いたします。
投稿者 しるふぃん  (社会人)
投稿日時
2011/5/17 16:09:20
SQL文発行時に、文字列として値をセットしているのではなく、数値として入力してしまっているのが
原因です。
0001ではなく、'0001'(シングルコーテーション)でくくれば問題ないはずです。
実際には、"Insert Into Vaalues('" & TextK & "','','','','','','','','','','','','','','','','','','','','','','','','有効','',yes)"
な感じになるかと。
②については、YuOさんのおっしゃるとおりですね。
余談ですが、Update文も同じようにできますよ。
原因です。
0001ではなく、'0001'(シングルコーテーション)でくくれば問題ないはずです。
実際には、"Insert Into Vaalues('" & TextK & "','','','','','','','','','','','','','','','','','','','','','','','','有効','',yes)"
な感じになるかと。
②については、YuOさんのおっしゃるとおりですね。
余談ですが、Update文も同じようにできますよ。
投稿者 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 ( 値, ... )
という形です。
> 最初のフィールドに入力しようとしています。ところがテーブルには、ゼロサプレスされた
> (余分なゼロを省略)ものが、入力されてしまいます。
> どこが問題なのでしょうか?
まず,「何故起きるか」から。
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 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
-------------------------------------------------
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
-------------------------------------------------
パラメータの件、断念しました。まだ、私にはハードルが高いようです。
申し訳けありません。勉強します。
先の件は、最終的に次のようになりました。
おかげさまで、解りやすく、すっきりとなりました。
Com = New OleDb.OleDbCommand("INSERT INTO 基礎全データ (管理番号,有効撤去,CK) Values('" & TextK.PadLeft(4, "0") & "','有効',Yes)", cn)
YuOさん、しるふぃんさん、ありがとうございました。
解決とさせていただきます。