- PR -

データベースにチェックボックスの情報の追加の仕方

投稿者投稿内容
Oregonian
会議室デビュー日: 2004/02/25
投稿数: 15
投稿日時: 2004-02-26 11:33
はじめましてイクザスさん。
昨日からいまだに格闘しております(笑)。

で、早速Parameterを使ってやってみたのですが
今度は違うエラーがでてしまい、エラーを見つけ
られないでいます。

エラー
Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.OleDb.OleDbException: Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.

Source Error:


Line 142: //Fill data set
Line 143: DataSet dataSet = new DataSet();
Line 144: ad.Fill(dataSet, "User");
Line 145: //PrintTable(dataSet);
Line 146:

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
コード

String strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + Request.PhysicalApplicationPath + "TRCIDB.mdb;Mode=ReadWrite|Share Deny None;";
String select = "SELECT UIdNum, Usename, Name, usrpwd, Admin FROM User";


//Create a connection
OleDbConnection cn = new OleDbConnection(strConnect);
cn.Open();

//Create an adapter
OleDbDataAdapter ad = new OleDbDataAdapter(select, cn);


//Build the insert command
ad.InsertCommand = new OleDbCommand("INSERT INTO User" + "(Uername, Name, usrpwd, Admin)VALUES" + "(@Username, @Name, @usrpwd, @Admin)", cn);
//System.Data.OleDb.OleDbCommand command = new OleDbCommand(select, new OleDbConnection(select));

//Build parameters for each column in User table
OleDbParameter parameter = null;

//Username
parameter = ad.InsertCommand.Parameters.Add(new OleDbParameter("@Username", OleDbType.VarChar));
parameter.SourceColumn = "Username";
parameter.SourceVersion = DataRowVersion.Current;

//Name
parameter = ad.InsertCommand.Parameters.Add(new OleDbParameter("@Name", OleDbType.VarChar));
parameter.SourceColumn = "Name";
parameter.SourceVersion = DataRowVersion.Current;

//Password
parameter = ad.InsertCommand.Parameters.Add(new OleDbParameter("@usrpwd", OleDbType.VarChar));
parameter.SourceColumn = "usrpwd";
parameter.SourceVersion = DataRowVersion.Current;

//Admin
parameter = ad.InsertCommand.Parameters.Add(new OleDbParameter("@Admin", OleDbType.Boolean));
parameter.SourceColumn = "Admin";
parameter.SourceVersion = DataRowVersion.Current;

//Fill data set
DataSet dataSet = new DataSet();
ad.Fill(dataSet, "User");
//PrintTable(dataSet);

//Add new row
DataRow newRow = dataSet.Tables["User"].NewRow();
newRow["Usename"]=txtUsername.Text;
newRow["Name"] = txtName.Text;
newRow["usrpwd"]=txtPassword.Text;
newRow["NAdmin"] = chkbxAdmin.Checked;
dataSet.Tables["User"].Rows.Add(newRow);

[ メッセージ編集済み 編集者: Oregonian 編集日時 2004-02-26 11:42 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-26 13:32
引用:

Oregonianさんの書き込み (2004-02-26 11:33) より:

Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.

Line 142: //Fill data set
Line 143: DataSet dataSet = new DataSet();
Line 144: ad.Fill(dataSet, "User");
Line 145: //PrintTable(dataSet);
Line 146:


 SQL文が違う、というエラーが、DataAdapter.Fillメソッドででているのだから、SELECT文が間違っていると思われます。スペースが全角だったりしませんか?
イクザス
会議室デビュー日: 2003/12/11
投稿数: 16
お住まい・勤務地: 静岡
投稿日時: 2004-02-26 13:47
引用:

Oregonianさんの書き込み (2004-02-26 11:33) より:
エラー
Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.OleDb.OleDbException: Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.

Source Error:


Line 142: //Fill data set
Line 143: DataSet dataSet = new DataSet();
Line 144: ad.Fill(dataSet, "User");
Line 145: //PrintTable(dataSet);
Line 146:

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー



私もあまり詳しくないので、見当違いならすいません。
Fillでデータを持ってくると思っていますので、DataAdapterのSelectCommandが使用されると思います。
InsertCommand以外のコマンド(SelectCommand、DeleteCommand、UpdateCommand)も
設定してみてください。
--------------------------------------------------------------------
デザイナで自動生成させると、そこら辺も作ってくれるんですけどねぇ・・・。
イクザス
会議室デビュー日: 2003/12/11
投稿数: 16
お住まい・勤務地: 静岡
投稿日時: 2004-02-26 14:04
追記

または、作成したOleDbCommandをExecuteNonQueryすることでInsertできませんか?


デザイナで作成したコマンドを基にOleDbCommandを作成して、ExecuteNonQueryすることで
私はACCESSのテーブルに追加することが出来ましたよ。
Oregonian
会議室デビュー日: 2004/02/25
投稿数: 15
投稿日時: 2004-02-26 14:36
>Jittaさん
スペースは調べてみましたがきちんと
半角になっていました。
前のコードも新しいコードもSQL文が
おかしいのですかね?

>イクザスさん
下ような感じでやってみました。

objCommand.CommandText = "INSERT INTO User( Username, Name, usrpwd, Admin ) values( '" + username + "','" + name + "','" + password + "'," + isAdmin + ")";
objCommand.ExecuteNonQuery();

しかし、これにすると前のコードと同じで
objCommand.ExecuteNonQuery();
にエラーがで出ます。ExecuteNonQuery()を使った場合は
テキストボックスだけだと値はAccessにInsertできるのですが、
チェックボックスの値(TrueかFalse)をいれようとすると
エラーになります。

そこで思ったのが、ExecuteNonQuery()はStringしかできない
のかと・・・。コンパイルエラーはでないんですけどね。
ほんとわかりません。

イクザス
会議室デビュー日: 2003/12/11
投稿数: 16
お住まい・勤務地: 静岡
投稿日時: 2004-02-26 15:02
Parametersと組み合わせでも出来ませんか?

私は下記のコードでチェックボックスの値をInsert出来ましたよ。
コード:

System.Data.OleDb.OleDbCommand testInsertCommand1;
testInsertCommand1 = new OleDbCommand();
testInsertCommand1.CommandText = "INSERT INTO [商品マスター] (商品名, 生産中止) VALUES (?, ?)";
testInsertCommand1.Connection = this.oleDbConnection1;
testInsertCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter("商品名", System.Data.OleDb.OleDbType.VarWChar, 50, "商品名"));
testInsertCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter("生産中止", System.Data.OleDb.OleDbType.Boolean, 2, "生産中止"));

testInsertCommand1.Parameters["商品名"].Value = "テスト1";
testInsertCommand1.Parameters["生産中止"].Value = CheckBox1.Checked;

this.oleDbConnection1.Open();

int iCnt = testInsertCommand1.ExecuteNonQuery();

this.oleDbConnection1.Close();


※コネクションはデザイナを使用して作成しています。

細かい設定などの説明は省きますが、この生産中止の部分がACCESSでBooleanに設定されています。

------------------------------------------------------------------------------
追記
私もまだまだ勉強中な為、CommandTextとParametersの書き方にはもっといい方法が
有るかもしれません。


[ メッセージ編集済み 編集者: イクザス 編集日時 2004-02-26 15:07 ]
まゆりん
ぬし
会議室デビュー日: 2002/08/12
投稿数: 539
お住まい・勤務地: よこはま
投稿日時: 2004-02-26 15:04
もし可能であれば、
Userテーブルの「Admin」列名を変えてみてはどうでしょうか?
#Adminという名称が予約語っぽいと思ったので。。。
_________________
まゆりん @ わんくま同盟
Blog る。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-02-26 15:37
引用:

Oregonianさんの書き込み (2004-02-26 11:33) より:

String select = "SELECT UIdNum, Usename, Name, usrpwd, Admin FROM User";
new OleDbCommand("INSERT INTO User" + "(Uername, Name, usrpwd, Admin)VALUES" + "(@Username, @Name, @usrpwd, @Admin)", cn);



NAL-6295です。

SELECT文がUsenameで、INSERT文がUernameになっている。
つまり、項目名の記述ミス。
ってことは無いですか?
ただの転記ミスであればすいません。

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