VB.NET2015(C#)からSQL Serverに対して複数のコマンドを実行する(ADO.NET)

Select文で複数のデータを検索し、必要があればUpdate文で値を更新してしまおうと思ったのですが、
「この Command に関連付けられている DataReader が既に開かれています…」
とエラーが出てしまい、Update文を実行することが出来ませんでした。

どうやら、Select文の実行中(While文で検索結果をReadしている間)にはUpdate文は実行出来ない様なのです。
それでは面倒なので、調べてみたら「MultipleActiveResultSets=True」を追加すれば良いことが判明。

 

VB.NET2015からSQL Serverのデータを更新する(ADO.NET)

SQLでデータを更新する場合は、INSERT文を使用します。
SqlCommandクラスを作成し、CommandTextにSQL文を指定して、ExecuteNonQuery()を実行します。

使い方は、
・Dim command As System.Data.SqlClient.SqlCommand = Con.CreateCommand()
 にて、グローバル変数のconからSqlCommandクラスを作ります。
・command.CommandText =
 ”UPDATE FileList SET Name = @Name,Date = @Date,Size = @Size”
 にて、変更する項目と変更値を入力します。
 @名称とすることで、パラメータ変数とすることができます。
・command.Parameters.Add(“@Name”, SqlDbType.NVarChar).Value = “名称”
 パラメータ変数に値をセットするために、Parameters.Addを行います。
 Addの引数は、パラメータ名、データ型(SqlDbType)を指定し、
 .Valueに値を代入するだけです。
・command.ExecuteNonQuery()を実行します。

ここで注意点は、上記ソースを実行すると、データベース上のすべての内容が指定した値に書き換えられてしまいます。
UPDATE <テーブル名> SET <列名>= <式> WHERE <条件>
の様に、WHEREに条件を指定することで、特定の項目だけ書き換える事ができます。

いままで使ってきたテーブルには、行を特定する値がありませんでしたので、キーとなるIdの項目を追加しました。SQL ServerではIDENTITYの指定を行うことで、自動採番として追加毎に自動でインクリメントされる項目を作ることができます。後はWHERE Id=1といった指定をすることで、特定の行のみ書き換える事が出来ます。

以上が、基本的な使い方となりますので、SQL文を使いExecuteReader()かExecuteNonQuery()を使うことで大抵の事は出来るのでは無いでしょうか。

VB.NET2015からSQL Serverのデータを取得する(ADO.NET)

SQLでデータを取得するには、SELECT文を使用します。
SqlCommandクラスを作成し、CommandTextにSQL文を指定して、ExecuteReader()を実行します。

使い方は、
・Dim command As System.Data.SqlClient.SqlCommand = Con.CreateCommand()
 にて、グローバル変数のconからSqlCommandクラスを作ります。
・command.CommandText = “SELECT * FROM FileList”
 にて、実行するSQL文を取得します。テーブルの全項目を取得するため、*を指定します。
 条件を指定する場合、例えばサイズが1000未満であれば
 ” WHERE Size < 1000″を追加します。
・Dim reader As System.Data.SqlClient.SqlDataReader = command.ExecuteReader()
 SqlDataReaderクラスを作り、ExecuteReader()を実行します。
・reader.Read()がTrueの間、データを読み込む。
 条件に一致するデータが複数ある場合、繰り返し実行してデータを読み込みます。
 配列としてIndexを指定するか名前を指定すれば必要なデータを得ることができます。
 当然ですが、存在しない名前やIndexを指定するとエラーになります。

条件を指定する場合は、パラメータ変数を使うなど、SQLインジェクションに気をつけましょう。

 

行頭のスペースを残す

自動整形機能により、行頭のスペースが勝手に削除されてしまうようです。

TinyMCE Advanced プラグインをインストールして、

段落タグの保持
保存時に <p> と <br /> タグを削除せず、テキストエディタ上に表示する テキストエディターの自動補完を停止し、より高度なコーディングが可能です。 しかし、まれに予想できない振る舞いをするため、常用前に充分テストを行ってください。 なおテキストエディター内での改行は出力に含まれます。このため空の行や HTML タグ内の改行、複数の <br /> タグは使用しないでください。

の項目にチェックを入れるとスペースが残ります。

Luxeritas 付属のシンタックスハイライター

Luxeritasを使用していて気がつかなかった事が。

標準でシンタックスハイライターの機能があることを。

[highlight_vbnet]
‘パラメータの指定
Private Sub AddSqlParameter(ByRef command As System.Data.SqlClient.SqlCommand, Name As String, Type As SqlDbType, Value As Object)
Dim param As System.Data.SqlClient.SqlParameter
param = command.CreateParameter()
param.Direction = ParameterDirection.Input
param.ParameterName = Name
param.SqlDbType = Type
param.Value = Value
command.Parameters.Add(param)
End Sub
[/highlight_vbnet]

こんな感じです。しかし、テーマを変えると表示されなくなるので、プラグイン版を使うことに。

VB.NET2015(C#)からSQL Serverにデータを追加する(ADO.NET)

SQLでデータを追加する場合は、INSERT文を使用します。
SqlCommandクラスを作成し、CommandTextにSQL文を指定して、ExecuteNonQuery()を実行します。

使い方は、
・Dim command As System.Data.SqlClient.SqlCommand = Con.CreateCommand()
 にて、グローバル変数のconからSqlCommandクラスを作ります。
・command.CommandText =
 ”INSERT INTO FileList (Name,Date,Size) VALUES (@Name,@Date,@Size)”
 にて、実行するSQL文を指定します。ここでポイントはVALUESの中身です。
 @名称とすることで、パラメータ変数とすることができます。
・command.Parameters.Add(“@Name”, SqlDbType.NVarChar).Value = “名称”
 パラメータ変数に値をセットするために、Parameters.Addを行います。
 Addの引数は、パラメータ名、データ型(SqlDbType)を指定し、
 .Valueに値を代入するだけです。

少し面倒ですが、省略しないとこんな感じで書くのが正解らしい。
 Dim param As System.Data.SqlClient.SqlParameter
 param = command.CreateParameter()
 param.Direction = ParameterDirection.Input
 param.ParameterName = “@Name”
 param.SqlDbType = SqlDbType.NVarChar
 param.Value = “名称”
 command.Parameters.Add(param)

SQL文に値を書き込まず、この様にパラメータ変数を介すことで、SQLインジェクションを防げるらしいです。

VB.NET2015(C#)からSQL Serverに接続する(ADO.NET)

VB.NETからSQLに接続するには、ADO.NETを使用すれば良いらしい。
System.Data.SqlClient.SqlConnectionクラスを使って行います。

使い方は、
・Data Source:サーバーの名前またはIPアドレス\インスタンス名を指定(\は円記号)
 例は、SQL Server Express のインスタンス名 SQLEXPRESSに接続する場合。
 サーバーマシン上で動かす場合、サーバーの名前は . でOKらしい。
・Initial Catalog:データベースの名前。その名の通りです。
・Integrated Security:認証の指定を行います。
 SSPIはWindows認証で接続する場合に使います。trueでも良いです。
 サーバーと実行側のユーザー情報が一致していれば、使用できると思います。
 ユーザー情報を指定する場合は、
 Integrated Security = false;User ID=user;Password=pass;
 の様に指定することが可能。