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

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

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

ファイルシステムからファイル、データベースからレコードを削除することまたはメモリ内のオブジェクトの割り当てを取り消すことをさします。もしくは、HTTPプロトコルのDELETEを指すこともあります。

SQL

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

VB.NET

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

Q&A

5回答

3563閲覧

【急募】VB.NETにてSQLのDELETE文を実行してもデータが削除されません・・・。

ninomics

総合スコア12

DELETE

ファイルシステムからファイル、データベースからレコードを削除することまたはメモリ内のオブジェクトの割り当てを取り消すことをさします。もしくは、HTTPプロトコルのDELETEを指すこともあります。

SQL

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

VB.NET

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

1グッド

1クリップ

投稿2019/06/21 02:35

編集2019/06/21 04:33

現在、VB.NETにてアプリを作成しております。
そこでデータベースに接続し、指定の行を削除するSQL文を実行しているのですが、コンパイルエラー無しで実行が完了します。

がしかし、データベースからデータが削除されません。
ソースコードの内容にも問題が見つからず、どうにか救いの手を差し伸べていただけますと幸いです。

「実際のソースコード」

Private Sub deleteAdd() Try Dim empList As New ArrayList Dim empName As New ArrayList Dim St As String Dim Cn As New System.Data.SqlClient.SqlConnection Dim SQL As SqlClient.SqlCommand Dim ServerName As String = Form1.db_connection(1) 'サーバー名(またはIPアドレス) Dim DatabaseName As String = Form1.db_connection(2) 'データベース Dim Integrated_Security As String = Form1.db_connection(3) 'セキュリティコード St = "Server=" & ServerName & ";Initial Catalog=" & DatabaseName & ";Integrated Security=" & Integrated_Security & ";" Cn.ConnectionString = St Cn.Open() SQL = Cn.CreateCommand SQL.Connection = Cn SQL.CommandType = CommandType.Text SQL.CommandText = "DELETE FROM SJOYC_STF WHERE STF_FNAME = '" & TextBox1.Text & "'" SQL.ExecuteNonQuery() SQL.Dispose() Cn.Close() Cn.Dispose() TextBox1.Text = "" Catch ex As Exception MsgBox("データベースへの接続に失敗しました。", MsgBoxStyle.Exclamation) End Try End Sub
oppeke👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/06/21 03:03 編集

コードは ``` と ``` で囲ってください。インデントされて見やすくなりますので。回答者・閲覧者に見てもらわないと話が始まらないのですから、見てもらえる努力をしましょう。 あと、あなたの開発環境(OS, .NET, Visual Studio, DB サーバーのバージョン・エディションなど)を書いてください。
m.ts10806

2019/06/21 03:19

急ぎでと書かれても知りません。要件とも関係ないので削ってください。 急ぎだからと質問内容を手抜きしていいわけではありません。そのぶん時間を浪費するだけです。急がば回れ。 むしろ急いでいることを伝えることで通常は足が遠退きます。
ninomics

2019/06/21 04:24

はい、そうですね。以後気を付けます。 がしかし、回答内容に質問内容への指摘をしている時点で回答内容として不適切であり、むしろそちらの方が「回答内容を手抜きしている状態」に近しいのでは? 自分が発した批判は、必ず自分に返ってくるという超基本的な世の原理を理解してから、健全なプラットフォームの利用に徹しましょうね。
Orlofsky

2019/06/21 04:24

急ぐならお金を払って助っ人を呼びましょう。
m.ts10806

2019/06/21 04:26

勘違いされてるようですが こちらは「質問への追記・修正選択の依頼」のコメント欄です。 回答でもなんでもありません。質問内容の不備や追記してほしいことを回答者がコメントする欄ですよ。 指摘されたことに対しては質問を編集して対応するのが通常の利用の仕方です。
ninomics

2019/06/21 04:30

'''で囲ってみたのですが、インデントが修正されません。 一体これはなぜ、修正されないのでしょうか・・・・・・・・・・・。
m.ts10806

2019/06/21 04:31

質問者さんが書かれた ' は「シングルクォート」 SurferOnWwwさんの書かれた ` は「バッククォート」です。 もし分からないのであればコード部分を選択し<code>ボタンを押してください。「コードブロック」と呼ばれるものです。 また「【急募】」はタイトルから削除してください。
ninomics

2019/06/21 04:31

大変失礼致しました。 こちらの勘違いであり、利用経験が短いこともあり、規則やマナーを理解しておらず、モラルに欠けた発言をしてしまったことを、この場を借りて謝罪いたします。
m.ts10806

2019/06/21 04:32

ヘルプは一読されたほうが良いでしょう。 https://teratail.com/help 質問や回答を見やすくするための「マークダウン」機能の紹介やPCからだと右側に「質問するときのヒント」がありますので。
ninomics

2019/06/21 04:34

インデントを修正しました。 厳しいご指摘をいただきまして、誠にありがとうございました。
Orlofsky

2019/06/21 04:40

COMMITが追加されていません。 えすぱあきぼんぬではまともなコメントは付きません。
ninomics

2019/06/21 04:46

commitを追加していないのは、無しでも他のFormは正常に実行されるからなのですが、この認識は間違いでしょうか? 試しに先ほどcommitを追加してみたところ、やはり削除されませんでした。
退会済みユーザー

退会済みユーザー

2019/06/21 04:55 編集

あなたの開発環境(OS, .NET, Visual Studio, DB サーバーのバージョン・エディションなど)を書いてください・・・とお願いしましたが無視ですか? 特に DB サーバーのバージョン・エディションは重要で、例えば LocaDB ですと照合順序の問題で N プレフィックスを付けないと日本語はダメということがあるのですよ。
ninomics

2019/06/21 04:54

・OSはWindows ・VB.NETを使用 ・Microsoft SQL server Management studio 18 になります。
退会済みユーザー

退会済みユーザー

2019/06/21 04:56

話が通じてないようです。SQL Server のバージョン・エディションは何ですか?
ninomics

2019/06/21 05:00

10.16.1000です。
m.ts10806

2019/06/21 05:04

基本的に質問に追記してください こちらのコメント欄はデフォルト非表示であるため必ず目につくわけではありません たいていの回答者は質問だけ読んで回答します
退会済みユーザー

退会済みユーザー

2019/06/21 05:27

> 10.16.1000です。 そういうバージョンは自分の知る限り無いと思うのですが。以下の記事を参考に調べられませんか? https://sql-oracle.com/sqlserver/?p=208 エディションも書いてください。エディションというのが何かは下記の記事参照。 https://ja.wikipedia.org/wiki/Microsoft_SQL_Server それから、OS, .NET, Visual Studio のバージョンが何かについても答えられていませんよ。
退会済みユーザー

退会済みユーザー

2019/06/21 05:42 編集

SSMS からコマンドで DELETE できたそうですが、その時のコマンドと、コードの SQL.CommandText は全く同じか、デバッグして調べてみてください。 その前に、WHERE 句を付けない単純な SELECT クエリなら問題なく実行され結果も期待通りになるのか教えてください。
退会済みユーザー

退会済みユーザー

2019/06/21 05:40 編集

ちょっと本題から外れますが、クエリはパラメータ化しましょう。SQL インジェクション防止に必須です。あと、副次的な効果として、照合順序の問題で N プレフィックスを付けなければダメと言うところも、パラメータ化すれば問題なくなります。 そもそも、個人的には、パラメータ化してないクエリは議論の対象外と思っています。
ninomics

2019/06/21 06:47

他のメソッドでは、まったく同じ接続文字列を使用してデータベースからテーブルを取得して表示ができているため、DELETE文だけが実行できないという状態です。
退会済みユーザー

退会済みユーザー

2019/06/21 06:55

他の質問にも答えてください。
退会済みユーザー

退会済みユーザー

2019/06/21 07:52

タイトルの「急募」を削除する気はなしですか?
guest

回答5

0

単純にTextBox1.Textに入力された内容にマッチしないんでは?
空白が含まれるとか。(Trimしてないし)


コメントで書いたけど反応なくなったので、こっちに追記しておきます。(後で検索してきて同様の問題を解決したい人のために)

この手の問題での調査を行う場合、プログラム上にミスがあってSQLそのものが発行されていなかったり、発行されているSQLが想定していたものと違ったりするケースを真っ先に疑うべきだと思いますので、SQL Server Profilerを使ってDBMSに実際に発行されたSQLを確認するのは非常に有効な手段です。

SQL Server Profilerは簡単に起動できますし、数回クリックして必要なフィルタをかければ良いだけですので、使い方を覚えておいて損はありません。
(ただ、DBにそれなりに負荷をかけるケースがあり、本番環境で使ってえらい目にあった事例を聞いたことがあるので、あくまで開発時に使うツールだと思っておいた方が良いです)

投稿2019/06/21 03:10

編集2019/06/21 13:08
gentaro

総合スコア8949

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

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

ninomics

2019/06/21 04:36

内容は適切な内容がしっかりと挿入されており、SQL文自体にはまったく問題ナシの状態です。
gentaro

2019/06/21 05:03

SQL Serverならプロファイラ起動して実行されてる(かどうかも含めて)SQLを確認してください。
guest

0

COMMITしてみる。

投稿2019/06/21 02:41

sazi

総合スコア25195

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

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

ninomics

2019/06/21 02:46

コミットは何度もしている状態でして・・・・・・。 ソースに問題があるのかな、、、、と感じている次第です・・・。
sazi

2019/06/21 02:54

コード上にはCOMMITは見当たりませんが?
sazi

2019/06/21 02:58

DBMSは何でしょう? コミットモードはどうなっていますか?
ninomics

2019/06/21 04:20

Microsoft SQL server Management studioです。 テーブル更新にて内容を確認しつつ、コーディングを行っております。
sazi

2019/06/21 04:28

SQL.CommandTextの内容をManagement studioで直接実行すると削除されますか?
ninomics

2019/06/21 04:32

はい、しっかりと実行されます。 試しにそのままDELETE文をコピペして実行したのですが、正常に動作し、内容が削除されました。
ninomics

2019/06/21 05:02

自動コミットモードはオフにしております。 ちなみに、コード上でもCOMMITを実行するべきなのでしょうか?
sazi

2019/06/21 05:04 編集

オートコミットになっているならcommitは不要です。 ExecuteNonQuery()は実行された行数を返しますから、1以上になっているか確認して見て下さい。
ninomics

2019/06/21 06:45

実行された行数を確認したところ、「0」でした。 削除が行われていないことが判明しました。
sazi

2019/06/21 06:52

接続先を確認して下さい。
ninomics

2019/06/21 06:56

別のメソッドにてテキストボックスに、同じ接続文字列を使用してテーブル全表示が可能なため、接続先に問題があることでは無さそうです。
sazi

2019/06/21 07:34

確認しているManagement studioの接続先は、合っていますか?
guest

0

dbmsの実行ログを確認してみてはどうでしょうか?それにより問題が解決されるかと思います。

投稿2019/06/22 12:57

akirafudo6

総合スコア341

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

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

0

VB.NET

1SQL.CommandText = "DELETE FROM SJOYC_STF WHERE STF_FNAME = '" & TextBox1.Text & "'"

TextBox1.Text の内容を表示してみては?
SJOYC_STF.STF_FNAME に存在しないデータだから、0件 DELETE の正常処理に1票。

投稿2019/06/21 18:14

Orlofsky

総合スコア16415

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

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

0

データベースへの接続に失敗しました 

のメッセージが出ていない事とtryの最後まで(TextBox.Text=""まで)処理が進んでもDeleteできないものとしてお答えします。

1.読み込みなどのSQLでは処理が実行されるか?

SQL.CommandText = "DELETE FROM SJOYC_STF WHERE STF_FNAME = '" & TextBox1.Text & "'" SQL.ExecuteNonQuery()

SQL.CommandText = "select * from SJOYC_STF" Dim dr As SqlClient.SqlDataReader dr = SQL.ExecuteReader() dr.Read() Form1.Text = dr("STF_FNAME") dr.Close()

これでForm1のタイトルバーに文字が入るか?

2.エラーメッセージが出ていないので接続はされていると思うのだけれども接続されているか?
Serverは、名前付きインスタンスサーバー名\インスタンス名または、既定のインスタンスサーバー名
と正しくなっているか?
ManagementStudioのオブジェクトエクスプローラー画像参照。サーバー名\SQLEXPRESSなど。
また、Server=ではなくData Source=と名前を変えてみる。
Integrated Securityは私の知識が無いのかもしれませんがセキュリティコードとは何でしょう?
ここに入る値は、trueまたはfalseまたはSSPIなどの文字と思われますがどうでしょうか?

イメージ説明

また、ManagemntStudioでselect @@Versionで実行するとSQLServerのバージョンを確認できます。

追加

他のメソッドでは、まったく同じ接続文字列を使用してデータベースからテーブルを取得して表示ができている

であるならForm1.db_connection(1)あたりが正しく入っていれば問題無さそうですね。
読み込みの所、*が無かったので申し訳ありません。selectでは問題なくデータが読めますか?
このdeleteメソッド内で行って見てください。他とは同じ事をしているように見えても実は何か
delete()メソッド内だけ何かあるのかもしれません。sqlconnectionや接続文字列、sqlcommandなどをこのメソッド内で宣言しているので。

あと、以下の様にNewを付けないとオブジェクト参照がオブジェクト インスタンスに設定されていません。と言うエラーがSQL.Connection = Cnで出ませんか?

'Dim SQL As SqlClient.SqlCommand Dim SQL As New SqlClient.SqlCommand()

投稿2019/06/21 05:29

編集2019/06/21 08:01
shinami

総合スコア334

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問