C#で原因不明のエラーが発生しています

このQ&Aのポイント
  • C#で実行中にフィールド定義の構文エラーが発生しており、エラーの原因がわかりません。
  • OleDbCommandを使用してデータベースのテーブルを作成しようとした際に、フィールド定義の構文エラーが発生しています。
  • エラーメッセージによると、「フィールド定義の構文エラーです」という内容です。このエラーの回避方法を教えてください。
回答を見る
  • ベストアンサー

原因不明のエラー発生 C#で困っています。

OleDbCommand com; string cnst = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=WiTiTa.mdb"; string Query; OleDbConnection cn = new OleDbConnection(cnst); Query = "CREATE TABLE TiTa ("; Query = Query + "ID CURRENCY,"; Query = Query + "TITLE TEXT,"; Query = Query + "HOUR TEXT,"; Query = Query + "LOOP_S TEXT,"; Query = Query + "LOOP_E TEXT,"; Query = Query + "LOOP_C TEXT,"; Query = Query + "LOOP_SLEEP TEXT,"; Query = Query + "SLEEP_H TEXT,"; Query = Query + "SLEEP_M TEXT,"; Query = Query + "SLEEP_B TEXT,"; Query = Query + "WAKEUP_H TEXT,"; Query = Query + "WAKEUP_M TEXT,"; Query = Query + "WAKEUP_B TEXT "; Query = Query + ")"; cn.Open(); com = new OleDbCommand(Query, cn); com.ExecuteNonQuery(); //エラー発生 cn.Close(); エラー内容 「フィールド定義の構文エラーです。」 クエリをmdbファイルで直接実行した場合にはエラーは発生しません。 mdbのセキュリティーもACCESS本体の画面から落としてみましたが効果がありません。 なにとぞエラー回避方法を教えてください。SELECT文は実行可能です。

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

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

「HOUR」が予約語じゃないかな?

watata7
質問者

お礼

ご回答のおかげで解決しました。有難うございました。

watata7
質問者

補足

そうです。ベストアンサー候補です。さっそく試してみます。 回答ありがとうございます。

その他の回答 (3)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.3

(1) エラーメッセージで検索する http://www.google.com/search?q=Jet+error+3292 文法的に怒られている? (2) 短いSQLを試して、追加していく。 Query = "CREATE TABLE TiTa (ID CURRENCY)" IDは予約語かな?

  • utun01
  • ベストアンサー率40% (110/270)
回答No.2

"WAKEUP_B TEXT "の最後のスペースを消してみるとどうでしょう? SQL的には関係ない気がしますが、VS系でそんなエラーが出ると聞いたことがあったような・・・?

watata7
質問者

お礼

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

watata7
質問者

補足

ご回答いただき有難うございます。 実行してみましたが同じエラーが発生します。

  • drum_KT
  • ベストアンサー率43% (1108/2554)
回答No.1

違うかもしれませんが。Queryの最後に ; が足りないような…? Query = Query + ")";  を Query = Query + ");"; にしたらどうなります? ちなみに、関係ないですが、テーブルのID列を通貨型にするって相当斬新な気がします。通貨型の値ってことは物の値段なわけで当然重複がありますから、カラムのIDにはなり得ませんよねぇ。まぁ、構文上は通ると思いますけど、何のテーブルなんだろうと考えてしまいました。(笑)

watata7
質問者

お礼

回答ありがとうございます。最後に「;」を付けるのはオラクルっぽいですね。(^^)

watata7
質問者

補足

回答ありがとうございます。実行してみましたが、エラーの発生止まずです。

関連するQ&A

  • VC# においてDBについての質問です

    お目に頂きありがとうございます. Visual Studio C# .NETのデータベースプログラミングの初歩の部分でつまずいてしまい,手助けしてください; private OleDbConnection cn; private OleDbCommand cmd; private void Make() { String id1 = idText1.Text, passwd = passwdText1.Text; /* make up Connection. */ cn = new OleDbConnection(); cn.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;" + "Data Source=D:\\Work\\Visual Studio .NET 2003\\otherApplication1\\Custom.mdb"; cn.Open(); // レコードの追加 try { cmd = new OleDbCommand("INSERT INTO Table_custom values(id1, passwd, 0)", cn); cmd.ExecuteNonQuery(); } catch(Exception ex) { MessageBox.Show("そのIDはダメ☆"); this.Dispose(); } } レコード内に入っているIDと被らなければ,入力されたID・パスワード・0(初期値)をテーブルに代入しようとしています. しかし何故か代入がされず,catch文に入ってしまいます. どうしてでしょうか? 尚,テーブルのキーは,ID(Primary Key), Passwd, Balance です. よろしくお願い致します

  • OleDbDataAdapterのエラー

    OS:Windows7 Visual Studio2012Professional いつもこちらでお世話になっています。 OleDbプロバイダーのOleDbDataAdapterでAccessファイルからDataSetへデータを取込む作業をしています。 下記のコードで、一度はDataSetへデータを取り込めたのですが、接続文字列を変更したところ、変更前の接続文字列(パス)を参照に行ってしまいエラーになります。 リビルドしたり、プロジェクトを作成し直したりしましたが、やはり変更前の接続文字列を使用してしまいます。 【コード】 private void Form1_Load ( object sender, EventArgs e ) {  string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\hoge変更後\○○.mdb;"  string sql = @"SELECT * FROM Table;";  DataSet ds = new DataSet();  OleDbConnection cn = new OleDbConnection();  cn.ConnectionString = connectionString;  OleDbCommand cmd = new OleDbCommand();  using (OleDbDataAdapter da = new OleDbDataAdapter()) {  cmd.Connection = cn;  cmd.CommandText = sql;  da.SelectCommand = cmd;  da.Fill( ds ); ← ここで『System.Data.OleDb.OleDbException』エラー   } this.dataGridView.DataSource = ds.Tables[0]; } 【エラー】 System.Data.OleDb.OleDbException はハンドルされませんでした。 HResult=-2147467259 Message=パス 'D:\hoge前\○○.mdb' は正しくありません。パス名に間違いがないことと、ファイルが置かれたサーバーに接続していることを確認してください。 Source=Microsoft JET Database Engine ErrorCode=-2147467259 どなたか原因がおわかりになりますでしょうか。 どうぞよろしくお願いいたします。

  • SQLを連続発行する時の正しい(?)書き方は?

    Microsoft Visual Basic 2010 Express の質問です。 ExcelVBAや、AccessVBAで作成したプログラムを、VBに移そうと思っています。 ネットや本のサンプルを、自分のやりたいことに修正しつつ、一応、動作としては希望通りなのですが、元々VBAで簡易に作ったものだけに、本来なら注意すべきインスタンスの管理などがおざなりになっています。 動作は一応正常ですが、果たしてこれで良いのか不安でもありますので質問させていただきます。 大抵の本やサンプルには、複数のSQLを連続で発行するようなものは載っていませんが、いくつものSQLを順次発行していく処理をする時は、どのように記述するのが正しいでしょうか? 例えば、Access2010データベース、C:\test.accdb には、別のテーブルからリンクしたテーブル genpon があるとします。これをコピーしたテーブル、tb01を作る場合、 ------------------------------------ Dim com As OleDb.OleDbCommand Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection( _ "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=C:\test.accdb;") cn.Open() ''現在のデータを削除 com = New OleDb.OleDbCommand("DROP TABLE [tb01];", cn) com.ExecuteNonQuery() ''現在のデータを削除 com = New OleDb.OleDbCommand("SELECT * INTO [tb01] FROM [genpon];", cn) com.ExecuteNonQuery() ------------------------------------ SQLとしては、現テーブルをDROPして、SELECT * INTO を発行すれば希望通りで、上記もその通り動きますが、NEWでインスタンス作成を繰り返しているのは、やってはいけない事ではないでしょうか? さらに、例えばこのコードの続きとして、FOR~NEXTや、DO~LOOPで繰り返しを設け、その中でINSERT INTO を発行しながら、データを登録するような処理を加える場合、このままでは NEWをループの回数分、繰り返す事になります。 プロシージャの中で、ループなどで複数のSQLを発行する場合、記述として正しい作法がありましたら、教えてください。

  • VB.NETからAccessテーブルの文字列を操作する際・・

    VB2005からAccessのmdbのテーブルのあるカラムより数バイトを切り出して別のカラムにコピーするだけの単純なプログラムなのですが、以下のように30バイトや34バイトで切り出しているにもかかわらず16バイトしか入ってきません。 cn.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0;" _ & "Data Source = d:\csmain\cstool\egz0omen.mdb" cn.Open() com = cn.CreateCommand() com.CommandText = "select カラムA from T_テーブル" dread = com.ExecuteReader Do While (dread.Read()) com = New OleDb.OleDbCommand("update T_テーブル set カラムB = LeftB(カラムA, 30), " _ & " カラムC = LeftB(カラムA, 34) , " _   & " カラムE = LeftB(カラムA, 36) ") com.Connection = cn com.ExecuteNonQuery() Loop <実行結果> カラムA             123456789012345 カラムB~カラムE全て 12345678 試しにバイト数を10バイトずつ増やして、30→40、34→44、36→46にしても結果は同じでした。 宜しくお願い致します。

  • ASP.NET OleDbConnectionが定義がされていません

    ACCESS2003 で 以下のサンプルを実行すると OleDbConnectionが定義がされていません。 というエラーが発生していて対処方法をしらべ てもわかりませんでした。 何方かご教授ください。よろしくお願いいたします。 Public Sub InsertRow(ByVal connectionString As String, _ ByVal insertSQL As String) Using connection As New OleDbConnection(connectionString) Dim command As New OleDbCommand(insertSQL) command.Connection = connection Try connection.Open() command.ExecuteNonQuery() Catch ex As Exception Console.WriteLine(ex.Message) End Try End Using End Sub 以下のOleDbConnectionオブジェクトの作成は行いました。 http://www.atmarkit.co.jp/fdotnet/aspexp/aspexp03/aspexp03_01.html

  • VB.NETでパラメータクエリを使用してAccessに値を設定

    こんにちは。 社員番号をNumとして、ボタンクリック時に社員番号が100099の人の名前を抽出したいのですが、「("?Num",'100099')」のカンマで「式が必要です。」となってしまいます。テキストの通りにやっているのですが、うまくいきません。テキストに載ってないこととしては、社員番号がテキスト型なので、「’」で囲んでみました。 どうすれば正しく実行できるでしょうか?以下はコーディングの一部です。 よろしくお願いいたします。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Name As String Dim cm As OleDb.OleDbCommand Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _ & "C:\VB_DB\SampleDB2.mdb;Persist Security Info=False") 'パラメータクエリを作成する cm = New OleDb.OleDbCommand("SELECCT 氏名 FROM 社員 " _ & "WHERE 社員番号=?Num", cn) 'パラメータクエリで使う値を設定する cm.Parameters.Clear() cm.Parameters.Add("?Num",'100099') 'パラメータクエリを実行する Name = cm.ExecuteScalar()

  • VB2005でMDBに接続方法

    お世話になります。 VB2005でアクセスに接続したいのですが、 よく理解できません。 こんな感じで、ネットで見たのを 記述したのですが、なんかエラーになります。 VB6みたいに参照設定が必要なのでしょうか? (記述例) Dim Cn As New OleDbConnection  ↑で警告?になる。 ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\データ.mdb") Dim SQLCm As OleDbCommand = Cn.CreateCommand ↑参照コンポーネントがみつかりませんでした。 と怒られます。 宜しくお願いいたします。

  • ASP.NET で意味不明のエラーが発生!教えてください

    web.configに以下の定義をしました。 Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=|DataDirectory|\db1.mdb" 以下をメインの処理で設定 Using connection As New OleDbConnection(connectionString) 「connectionString」で以下のメッセージが 表示されます。どのようにしたらエラーが解決できるのでしょうか? 教えてください。 This application is currently offline. To enable the application, remove the app_offline.htm file from the application root directory

  • sqlでのIIFの使用方法

    accsessのテーブルデータで4列10000レコードのデータを作成し 先頭列にチェックボックスを配置したうえでvb2008 express editionで作成したソフトのdatagridview上でデータを表示し、使う人がチェックボックスをチェックすることにより、選択したレコードデータを別ファイルに保存できるようにしています。mdbのテーブル名は"No1"です。データ連結はdatatableを使用しています。そこで、datagridviewのチェックボックスの変化をmdbテーブルに反映させる処理をdatagridviewのcellcontentclickイベントに Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & basePath) Dim SQLCM As OleDbCommand = Cn.CreateCommand SQLCM.CommandText = "UPDATE No1 SET iif(チェック = False, チェック = True , チェック = False) WHERE ID = " & e.RowIndex + 1 Cn.Open() SQLCM.ExecuteNonQuery() Cn.Close() と書き込んで処理しようとしていますが、UPDATEステートメント構文エラーと表示され処理できません。TRUEに変更する処理は Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & basePath) Dim SQLCM As OleDbCommand = Cn.CreateCommand SQLCM.CommandText = "UPDATE No1 SET チェック = True WHERE ID = " & e.RowIndex + 1 Cn.Open() SQLCM.ExecuteNonQuery() Cn.Close() でうまくいってます。IIFの使用方法が間違っていると思うのですが。どなたかお教えねがえないでしょうか。開発環境は、Vista Home premium、mdbはaccess2003で作成しています。

  • 二つのMDBファイルの間のデータのやり取り

    おせわになります。みなさんの知恵を貸してください。 いかがシステム構成です。 A.mdb(テーブル:Work1) B.mdb(テーブル:Work2) A.mdbはカレントデータベースです。B.mdbはDSN=KANRIで アクセスしたいです。 現在Work1のデータをWork2に追加したいのですが、どのような方法が考えられますか? ちなみに以下のコードを書いてみました。 -------------------------------------------------- Dim cn1 As New ADODB.Connection, cn2 As New ADODB.Connection Dim rs1 As New ADODB.Recordset, rs2 As New ADODB.Connection Dim com As New ADODB.Command, mysql As String Set cn1 = CurrentProject.Connection cn2.ConnectionString = "provider=MSDASQL;DSN=KANRI" mysql = "insert into Work2 select * from Work1" com.activeconnection = cn2 com.commandtext = mysql com.Execute Set com = Nothing rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing cn1.Close: Set cn1 = Nothing cn2.Close: Set ch2 = Nothing -------------------------------------------------- Work1は見当たらないとエラーが出ました。 どなたか教えてください。 rs1.EoF Loop をまわしながら一行ずつ追加するしかないでしょうか?