@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

UPDATEステートメントの構文について

投稿者投稿内容
うえつき
会議室デビュー日: 2004/09/06
投稿数: 14
投稿日時: 2004-11-04 17:53
たぶん初歩的なところだと思うのですが、
いったい何処でつまずいているのか判らないのです。

OSはwindowsXP、Excelのバージョンは2003、
コードは VB.net2003 で作成しております。
http://support.microsoft.com/default.aspx?scid=kb;ja;316934
を参考にして作成したつもりです。

Escelファイルのシートをデータグリッドでwindowsフォーム上に表示しています
変更した行だけUpDateしたいのですが、エクセルのデータに反映されません。
更に、時間のセルの内容がなぜか日付表示(xx/mm/dd)されます
(excelで開くと正しく表示されているんですが…)

Excell シートの内容はこんな感じです
no# 日付  時間   項目  場所
--------------------------------------
1 X月XX日 X時XX分 ABCDE 第1工場
2 X月XX日 X時XX分 ABCDE 第3工場
3 X月XX日 X時XX分 ABCDE 第2工場
4 NULL  NULL

今は以下のようなコードを書いています。
DataGrid には反映されますが元のExcelファイルは更新されません。

Dim CONNECTION_STRING As String = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source="ほにゃほにゃ.xls;" & _
"Extended Properties=""Excel 8.0;HDR=Yes"""
Dim Sheet As String = "SELECT * FROM [seet1$]"

Dim RirekiConnect As New OleDbConnection(CONNECTION_STRING)
Dim Adp As New OleDbDataAdapter(Sheet, RirekiConnect)
Dim Dst As New DataSet

Adp.Fill(Dst, "Myseet")
Adp.UpdateCommand = New OleDbCommand( _
"UPDATE [散布基地$] SET 日付 = ?, 時刻=? WHERE No#= ?", RirekiConnect)
Adp.UpdateCommand.Parameters.Add("@Hizuke", OleDbType.Char).SourceColumn = "日付"
Adp.UpdateCommand.Parameters.Add("@jikoku", OleDbType.Char).SourceColumn = "時刻"
Adp.UpdateCommand.Parameters.Add("@NO", OleDbType.Char)
Dst.Tables(0).Rows(4)("日付") = "11月12日"
Dst.Tables(0).Rows(4)("時刻") = "12時34分"

Adp.Update(Dst, "Myseet")
RirekiConnect.Close()

Adp.Fill(Dst, "Myseet")


これをtry-chach文の中に入れて、出力windowに出てくるエラーは以下のとおり。

------------------------
ErrorCode : -2147217900
Source : Microsoft JET Database Engine
Message : クエリ式 'No#= ?' の 日付の構文エラーです。
StackTrace: at System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
at System.Data.Common.DbDataAdapter.Update(DataSet dataSet, String srcTable)
--------------------------<

Adp.UpdateCommand.Parameters.Add("@Hizuke", OleDbType.Date).SourceColumn = "日付"
Adp.UpdateCommand.Parameters.Add("@jikoku", OleDbType.Char).SourceColumn = "時刻"
にしても同じエラーが出力されます。
また、
Adp.UpdateCommand.Parameters.Add("@jikoku", OleDbType.Char).SourceColumn = "項目"
Dst.Tables(0).Rows(4)("項目") = "ABCDEF"
とすると、今度は「UPDATE ステートメントの構文エラーです。」と出てきます。

どなたか御教示ください・・・
どこから手をつけたらよいか、触りすぎて判らなくなってしまっています。
とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 2004-11-04 18:23
こんにちは。

まずは確実に1つのフィールドずつやって行きましょう。

SourceColumn = "時刻"

項目名が"時間"なのに対してSourceColumn = "時刻" です。

それと WHERE No#= で項目名に"#"が入っているのが気になります。

SQL文が#で変になっていないか項目名から#を外してみてください。

うえつき
会議室デビュー日: 2004/09/06
投稿数: 14
投稿日時: 2004-11-04 18:40
項目が"時間"なのに対してSourceColumn = "時刻"

すいません、Excelの項目は"時刻"です…
WHERE No#= はエクセルの列名、コードともに"No"に訂正しました。

すると、エラーの出力が
Message : パラメータ ?_3 にはデフォルト値はありません。
に変わりました。 
とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 2004-11-04 19:02
では、先ずWHERE条件をなくして全てのレコードを更新してみましょう。

更新するフィールドもString型の『場所』

にしてパラメータの設定で

Adp.UpdateCommand.Parameters.Add("@Product", OleDbType.VarChar, 255, "場所")

にしたらどうですか?

とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 2004-11-04 19:30
引用:

うえつきさんの書き込み (2004-11-04 18:40) より:
項目が"時間"なのに対してSourceColumn = "時刻"

すいません、Excelの項目は"時刻"です…
WHERE No#= はエクセルの列名、コードともに"No"に訂正しました。

すると、エラーの出力が
Message : パラメータ ?_3 にはデフォルト値はありません。
に変わりました。 



Adp.UpdateCommand.Parameters.Add("@NO", OleDbType.Char)
ここで列が指定されていないのでは?

Dst.Tables(0).Rows(4)("日付") = "11月12日"
Dst.Tables(0).Rows(4)("時刻") = "12時34分"

それとここで行をしていするとWHERE条件の意味がないのではないでしょうか
うえつき
会議室デビュー日: 2004/09/06
投稿数: 14
投稿日時: 2004-11-04 19:38
引用:
先ずWHERE条件をなくして全てのレコードを更新してみましょう


ごめんなさい、それは
Adp.UpdateCommand = New OleDbCommand( "UPDATE [散布基地$] , RirekiConnect)
でよろしいんでしょうか…
これだと、「UPDATE ステートメントの構文エラーです。」と出てきます。

また、 SET 場所= ?, WHERE 場所= ?",
Dst.Tables(0).Rows(4)("場所") = "ほにゃらら"

にしてもUPDATE ステートメントの構文エラーです。」と出てきます。
DataGridには文字列が表示されるんですけどね…

引用:
Adp.UpdateCommand.Parameters.Add("@NO", OleDbType.Char)
ここで列が指定されていないのでは?

Dst.Tables(0).Rows(4)("日付") = "11月12日"
Dst.Tables(0).Rows(4)("時刻") = "12時34分"

それとここで行をしていするとWHERE条件の意味がないのではないでしょうか



…確かにRows()を指定するとおっしゃるとおりですね、
Adp.UpdateCommand.Parameters.Add("@NO", OleDbType.Char, 255, "NO")
とすると同時実行処理違反になります。
今からRows()の指定を外してテストしてみます。
…最終的には日付がNull値のセルの行番号を取得して行指定したいのですが。

丁寧なご指摘有難うございます。
[ メッセージ編集済み 編集者: うえつき 編集日時 2004-11-04 19:42 ]

[ メッセージ編集済み 編集者: うえつき 編集日時 2004-11-04 19:54 ]
とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 2004-11-04 19:46
作成されるSQLをチェックしましょう

UPDATE [散布基地$] SET 場所 = ?

で、

Adp.UpdateCommand.Parameters.Add("@Product", OleDbType.VarChar, 255, "場所")

です。WHERE条件はなしです。ですから他のパラメータの設定もコメントにして下さい
うえつき
会議室デビュー日: 2004/09/06
投稿数: 14
投稿日時: 2004-11-04 20:50
大変お手数おかけしています…
申し訳ないのですが、SQL文が作成される際にチェックするにはどのようにするのが適当かお教えください。

一応、以下のコードを書いてみました。

Dim CMD As New OleDbCommand
CMD.Connection = RirekiConnect
CMD.CommandText = "UPDATE [散布基地$] SET 場所 = ?"
Adp.UpdateCommand = CMD
Adp.UpdateCommand.Parameters.Add("@Product", OleDbType.VarChar, 255, "場所")
Dst.Tables(0).Rows(3)("場所") = "ほにゃほにゃ"
Adp.Update(Dst, "Myseet")
Adp.Fill(Dst, "Myseet")

とりあえず、UPDATE はできた模様で、Excelファイルに保存できました。
ただし、"場所"の列が全行"ほにゃほにゃ"になってしまいました。

次はWHERE条件を入れてUpdateStatementを作成してみます
…でも、根本的に時刻のデータが日付のデータとして認識されるのには変わりないような。


コードを触りすぎて何がなんだか判らなくなっていましたけれど、
なんだか落ち着いてきました。

スキルアップ/キャリアアップ(JOB@IT)