質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

13128閲覧

ExecuteNonQuery: Connection プロパティは初期化されていません

rarara_123

総合スコア11

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2021/04/20 04:26

編集2021/04/20 05:54

前提・実現したいこと
ExecuteNonQuery: Connection プロパティは初期化されていません
上記のエラーを解消させたいです。

発生している問題・エラーメッセージ

System.InvalidOperationException: 'ExecuteNonQuery: Connection プロパティは初期化されていません。' この例外は、最初にこの呼び出し履歴 System.Data.OleDb.OleDbCommand.ValidateConnection(string) System.Data.OleDb.OleDbCommand.ValidateConnectionAndTransaction(string) System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(System.Data.CommandBehavior, string) System.Data.OleDb.OleDbCommand.ExecuteNonQuery() WindowsApp6.Form1.Button5_Click(Object, System.EventArgs) 場所: Form1.vb System.Windows.Forms.Control.OnClick(System.EventArgs) System.Windows.Forms.Button.OnClick(System.EventArgs) System.Windows.Forms.Button.OnMouseUp(System.Windows.Forms.MouseEventArgs) System.Windows.Forms.Control.WmMouseUp(ref System.Windows.Forms.Message, System.Windows.Forms.MouseButtons, int) System.Windows.Forms.Control.WndProc(ref System.Windows.Forms.Message) ... [呼び出し履歴が切り捨てられました] でスローされました

該当のソースコード

'更新 Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click 'Access接続準備 Dim command As OleDbCommand Dim cnAccess As OleDbConnection = New OleDbConnection() 'SQL、更新 Dim cm As New OleDbCommand("UPDATE table2 Set [出勤時間(時)] = @syukkinJikan where 日付 = @hiduke") '作成した接続文字列を設定 cnAccess.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database2.mdb" 'Access接続開始 cnAccess.Open() 'SQL文の実行 cm.ExecuteNonQuery() '終了 command.Dispose() cnAccess.Close()

別のソースコードではエラーになりませんでした。
下記は別のソースコードです。

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click 'Access接続準備 Dim command As New OleDbCommand Dim cnAccess As OleDbConnection = New OleDbConnection() 'SQL文作成 Dim cm As New OleDbCommand("INSERT INTO table2 ( 日付,[出勤時間(時)],[出勤時間(分)],[退勤時間(時)],[退勤時間(分)],給料) VALUES(@hiduke,@syukkinJikan,@syukkinHun,@taikinJikan,@taikinHun,@TextBox2.Text)", cnAccess) 'パラメーター化 cm.Parameters.Add(New OleDbParameter("@hiduke", hiduke)) cm.Parameters.Add(New OleDbParameter("@syukkinJikan", syukkinJikan)) cm.Parameters.Add(New OleDbParameter("@syukkinHun", syukkinHun)) cm.Parameters.Add(New OleDbParameter("@taikinJikan", taikinJikan)) cm.Parameters.Add(New OleDbParameter("@taikinHun", taikinHun)) cm.Parameters.Add(New OleDbParameter("@TextBox2.Text", TextBox2.Text)) '作成した接続文字列を設定 cnAccess.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database2.mdb" 'Access接続開始 cnAccess.Open() 'SQL文の実行 cm.ExecuteNonQuery() '終了 command.Dispose() cnAccess.Close()

使っているツールのバージョンなど補足情報

ACCESSのバージョン2016
Windows10の64ビット
WindowsForms
Visual Studio2019
NET Framework 4.8
AccessDatabaseEngine.exeインストール済です。

以上になります。
ご教示よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/20 05:05 編集

前のスレッド https://teratail.com/questions/333203 https://teratail.com/questions/333520 https://teratail.com/questions/334065 全部、レスをもらってけど、分からないから取りあえずテキトーに返事を返して分からないまま終わらせてるから、何が問題か理解できてなくて、いつまで経っても、何度も同じ課題の質問を繰り返しても解決できないということを認識しましょう。 きっとまた同じことになって、やっぱり解決できず、また同じ質問をするのではないかと思ってますが、そういうの止めませんか?
rarara_123

2021/04/20 05:26

>うまくいくものといかないもの、何が違うか見比べてください。 >ヒントはエラーメッセージにあります。 何が違うのか見比べてみました。 ①「'SQL、更新」のコードの最後に「cnAccess」を記述することで「cnAccess As OleDbConnection」を使えるようになりました。 ②パラメーターの値を設定しました。 上記2点によりエラーは解消されました。この2点が回答と認識してもよろしいでしょうか?
YAmaGNZ

2021/04/20 05:41

質問のソースを修正後のソースに修正するのはやめてください。 質問のソースを修正してしまうと何が問題だったのかが分からなくなってしまいます。 回答がついていない状態で解決したのであれば、自分で回答をつけて自己解決としてください。 1.cnAccessとは何なのか、それがないと何故エラーとなるのかを理解できるようになってください。 SQLコマンドを実行するにはどういうDBにどうやって接続するのかという情報が必要です。 それを設定するのがConnectionプロパティとなります。 2.パラメーターとはなんなのかを考えてください。 それで必要だと思うのであれば記述してください。 これまでの質問を見る限り、ソースをコピーしてきてなんとなく動いているだけに思えます。 記述したコードにどういう意味があるのかを調べ、考え理解してください。
rarara_123

2021/04/20 07:01

失礼しました。ソースを元に戻しました。 1について、Connectionプロパティを使ってDBに接続してSQLコマンドを実行するためにも、変数を設定しなければいけないので、その変数をcnAccessとしました。変数がなければDBに接続してもSQLコマンドを実行することが出来ません。このように理解しております。 2について、パラメーターを記述しなければエラーになりますので今回は記述することにしました。
YAmaGNZ

2021/04/20 07:29

2についてエラーとなったから記述したということですが、どのようなエラーになりましたか? 今回の「Connection プロパティは初期化されていません」というエラーとパラメータは関係ありません。 もし挙げられた2箇所を修正して「Connection プロパティは初期化されていません」が直ったと思っているのであれば、パラメータとは何なのかを理解していないことになります。
rarara_123

2021/04/20 08:26

パラメーターを記述しなければ「System.Data.OleDb.OleDbException: '1 つ以上の必要なパラメーターの値が設定されていません。'」このエラーが出ました。 >もし挙げられた2箇所を修正して「Connection プロパティは初期化されていません」が直ったと思って>いるのであれば、パラメータとは何なのかを理解していないことになります。 2箇所を修正してエラーが解消されたと考えておりました。 パラメーターは値を受け取るための変数と理解してます。
YAmaGNZ

2021/04/20 08:40

では何故必要のないパラメータの記載までしてあったのでしょうか?
rarara_123

2021/04/20 08:54

記載してあるパラメーターを全部ワンセットだと考えてました。 記載が必要なのは「cm.Parameters.Add(New OleDbParameter("@hiduke", hiduke))」と「 cm.Parameters.Add(New OleDbParameter("@syukkinJikan", syukkinJikan))」になると思います。
guest

回答3

0

自己解決

大変申し訳ございません。
エラー解消した時点でクローズしておくべきでした。
こちらはクローズをさせていただきます。

投稿2021/04/23 07:07

rarara_123

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/24 01:24

「解決した方法」というマークを付けるなら、表題の「ExecuteNonQuery: Connection プロパティは初期化されていません」を解決した方法をここに書いてからにしてください。
guest

0

申し訳ございません、最初の回答を編集しました。

投稿2021/04/23 04:22

編集2021/04/23 06:03
MasayaIshihara

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/23 05:22

既に回答をつけてるのであれば、そちらを編集した方がよいと思われます。
YAmaGNZ

2021/04/23 06:00

OleDbType.DateTimeもありません。もし指定するならOleDbType.DBDateになる可能性がありますが、もともと質問にデータ型が提示していないのでデータ型を指定する書き方だと質問者さんの型と異なる可能性もあります。
guest

0

スカラ変数が代入されてないからでは?

cm.Parameters.Add("@syukkinJikan", oleDBtype.DateTime).Value = DateTime
cm.Parameters.Add("@hiduke", OleDBtype.DateTime).Value = DateTime

追記

実データがわからないのでエスパー返信します。

Dim cm As New OleDbCommand("UPDATE table2 Set [出勤時間(時)] = @syukkinJikan where 日付 = @hiduke") ここでスカラ変数(@syukkinjikanと@hiduke)を宣言しているので 値をいれる必要があります。

cm.Parameters.Add("@syukkinJikan", oleDBtype.DBTime).Value = syukkinjikan
'DateTime.syukkinjikan.toString("hhmmss")
cm.Parameters.Add("@hiduke", oleDBtype.DBDate).Value = hiduke
'DateTime.hiduke.toString("yyyymmdd")

投稿2021/04/22 05:38

編集2021/04/23 06:45
MasayaIshihara

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rarara_123

2021/04/22 07:26

上記を記述してみたところ、「DataTimeはOleDbTypeのメンバーではありません」とエラーが出たので、「Dim command As New OleDbCommand, OleDbType」と、OleDbTypeを変数にすることによりエラー解消したのですが、「Dataは構造体型であり、式として使用することはできません」とエラーが出てしまいます。
退会済みユーザー

退会済みユーザー

2021/04/23 05:33 編集

> MasayaIshiharaさん 今回のエラーメッセージはCommandオブジェクトにConnectionオブジェクトが設定されていない事に起因するエラーなので、質問の解決法としてはズレていると思います。(パラメータの設定に問題があるのは確かですが) YAmaGNZさんが質問の追記・修正依頼に2021/04/20 13:35につけたコメントは、それの確認を促すためのものだと思うので、多分それで解決していると思いますが。
退会済みユーザー

退会済みユーザー

2021/04/24 01:41 編集

このスレッドの本題「ExecuteNonQuery: Connection プロパティは初期化されていません」ではないのですが気になったので一言・・・ > Dim cm As New OleDbCommand("UPDATE table2 Set [出勤時間(時)] = @syukkinJikan where 日付 = @hiduke") > ここでスカラ変数(@syukkinjikanと@hiduke)を宣言しているので値をいれる必要があります。 それは SQL Server や MySQL で使う名前付きパラメータです。OleDb + JET + Access で使うのは疑問符 (?) による位置パラメータマーカなので、そもそも SQL 文が間違っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問