DOBON.NET DOBON.NETプログラミング掲示板過去ログ

コードの冗長化を無くしたい etc..

環境/言語:[Windows7,VB.Net]
分類:[.NET]

<問題点>
・コードの冗長化を無くしたい
自分なりに、クラスの先頭で
コード[ASP]: 全て選択
1
Dim Cn As New OleDbConnection

としたのですが、内部でエラーになってしまいます。

そもそも、DB操作の知識が浅いせいも有りますが、「こうした方がいい」というアドバイスをいただけたら嬉しいです。

コードは以下。
DBへの追加、更新、削除などを行っています。
プリペアドステートメントも使う予定です。(今回は使う方法を探る前のコードなので使っていません。)
尚、まだこのコードは作成途中なので色々おかしい所はあります。
今回は冗長化を無くすためのアドバイスを頂きたいです。

何回もCnをNewしないようにするにはどうしたらいいでしょうか。
adapterは毎回違うものを使ったほうがいいのでしょうか?


Imports System.Data.OleDb

Public Class 定休日設定

Dim Table As New DataTable
Dim dr As OleDb.OleDbDataReader


Private Sub データ入力_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Me.定休日表TableAdapter.Fill(Me.Sotuken1DataSet.定休日表)

Dim Cn As New OleDbConnection
Dim SQLCm As OleDbCommand = Cn.CreateCommand
Dim Adapter As New OleDbDataAdapter(SQLCm)

Cn.ConnectionString = ("****")
Cn.Open()

SQLCm.CommandText = "SELECT * FROM 定休日表"
Adapter.Fill(Table) '実行

dr = SQLCm.ExecuteReader

If dr.HasRows Then
Do While dr.Read
list_holiday.Items.Add(dr("定休日コード").ToString & " " & dr("年").ToString & "年" & dr("月").ToString & "月" _
& dr("日").ToString & "日 " & WeekdayName(dr("曜日")))
Loop
Else
MsgBox("データなし")
End If


'▼後処理
Adapter.Dispose()
Cn.Dispose()
Cn.Close()


lbl_fullday.Text = MonthCalendar1.SelectionStart.ToShortDateString()
lbl_year.Text = Mid(lbl_fullday.Text, 1, 4)
lbl_month.Text = Mid(Mid(lbl_fullday.Text, 6, 7), 1, 2)
lbl_day.Text = Mid(lbl_fullday.Text, 9, 10)

lbl_fulldayE.Text = MonthCalendar1.SelectionEnd.ToShortDateString()
lbl_yearE.Text = Mid(lbl_fulldayE.Text, 1, 4)
lbl_monthE.Text = Mid(Mid(lbl_fulldayE.Text, 6, 7), 1, 2)
lbl_dayE.Text = Mid(lbl_fulldayE.Text, 9, 10)

Label1.Text = WeekdayName(Weekday(DateSerial(lbl_year.Text, lbl_month.Text, lbl_day.Text)))

End Sub

Private Sub btn_add_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_add.Click

Dim Cn As New OleDbConnection
Dim SQLCm As OleDbCommand = Cn.CreateCommand
Dim Adapter As New OleDbDataAdapter(SQLCm)
Dim Adapter2 As New OleDbDataAdapter(SQLCm)

Dim range As Integer = lbl_dayE.Text - lbl_day.Text '複数日選択判定用変数

Me.定休日表TableAdapter.Fill(Me.Sotuken1DataSet.定休日表)
Cn.ConnectionString = ("****")
'パターン表に追加処理
Cn.Open()

Dim cnt As Integer = list_holiday.Items.Count + 1
Dim weekDayN As Integer = Weekday(DateSerial(lbl_year.Text, lbl_month.Text, lbl_day.Text))

Do While range > -1

SQLCm.CommandText = "INSERT INTO 定休日表 ([定休日コード],[年],[月],[日],[曜日]) VALUES (" & cnt & "," & lbl_year.Text & "," & lbl_month.Text & "," & lbl_day.Text & "," & weekDayN & ")"
Adapter.Fill(Table)
cnt = cnt + 1
lbl_day.Text = lbl_day.Text + 1
range = range - 1
weekDayN = weekDayN + 1
If weekDayN > 7 Then
weekDayN = 1
End If

Loop


'後処理
Adapter.Dispose()
Cn.Dispose()
Cn.Close()

'パターン表再表示
list_holiday.Items.Clear()
Cn.ConnectionString = ("****")
Cn.Open()
SQLCm.CommandText = "SELECT * FROM 定休日表"
Adapter2.Fill(Table)
dr = SQLCm.ExecuteReader
If dr.HasRows Then
Do While dr.Read
list_holiday.Items.Add(dr("定休日コード").ToString & " " & dr("年").ToString & "年" & dr("月").ToString & "月" _
& dr("日").ToString & "日 " & WeekdayName(dr("曜日")))
Loop
End If
'後処理
Adapter2.Dispose()
Cn.Dispose()
Cn.Close()
End Sub

Private Sub btn_delete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_delete.Click
Dim Cn As New OleDbConnection
Dim SQLCm As OleDbCommand = Cn.CreateCommand
Dim Adapter As New OleDbDataAdapter(SQLCm)
Dim Adapter2 As New OleDbDataAdapter(SQLCm)
Dim Adapter3 As New OleDbDataAdapter(SQLCm)


Me.定休日表TableAdapter.Fill(Me.Sotuken1DataSet.定休日表)
'選択した行の削除
Cn.ConnectionString = ("****")
Cn.Open()

SQLCm.CommandText = "DELETE FROM 定休日表 WHERE 定休日コード = " & list_holiday.SelectedIndex.ToString + 1

Dim range As Integer = list_holiday.SelectedIndices.Count

Do While range > 0

SQLCm.CommandText = "INSERT INTO 定休日表 ([定休日コード],[年],[月],[日],[曜日]) VALUES (" & cnt & "," & lbl_year.Text & "," & lbl_month.Text & "," & lbl_day.Text & "," & weekDayN & ")"
Adapter.Fill(Table)
cnt = cnt + 1
lbl_day.Text = lbl_day.Text + 1
range = range - 1
weekDayN = weekDayN + 1
If weekDayN > 7 Then
weekDayN = 1
End If

Loop

Adapter.Fill(Table)

Adapter.Dispose()
Cn.Dispose()
Cn.Close()


'選択した行が一番下以外の場合繰り上げ処理を行う
Dim i As Integer
i = list_holiday.SelectedIndex.ToString + 1
Cn.ConnectionString = ("****")
Cn.Open()

SQLCm.CommandText = "update 定休日表 set 定休日コード = 定休日コード -1 where 定休日コード > " & i
Adapter2.Fill(Table)
Adapter2.Dispose()
Cn.Dispose()
Cn.Close()

'パターン表再表示
list_holiday.Items.Clear()
Cn.ConnectionString = ("****")
Cn.Open()
SQLCm.CommandText = "SELECT * FROM 定休日表"
Adapter3.Fill(Table)
dr = SQLCm.ExecuteReader
If dr.HasRows Then
Do While dr.Read
list_holiday.Items.Add(dr("定休日コード").ToString & " " & dr("年").ToString & "年" & dr("月").ToString & "月" _
& dr("日").ToString & "日 " & WeekdayName(dr("曜日")))
Loop
End If
'後処理
Adapter3.Dispose()
Cn.Dispose()
Cn.Close()
End Sub

Private Sub weekend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_weekend.Click

'土日を判定し、休み登録

Dim today As Date = DateTime.Today
Dim cnt As Integer = list_holiday.Items.Count + 1
Dim firstOfMonth As Date = DateSerial(lbl_year.Text, lbl_month.Text, 1) '月初
Dim endOfMonth As Date = DateSerial(lbl_year.Text, lbl_month.Text + 1, 0) '月末
'MsgBox(WeekdayName(endOfMonth))

If Weekday(firstOfMonth) = 7 Then '土曜日

For i As Integer = firstOfMonth.Day To endOfMonth.Day

Next

ElseIf Weekday(firstOfMonth) = 1 Then '日曜日

Else 'その他

End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.Close()
End Sub

Private Sub 定休日表BindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Me.Validate()
Me.定休日表BindingSource.EndEdit()
Me.TableAdapterManager.UpdateAll(Me.Sotuken1DataSet)

End Sub

Private Sub MonthCalendar1_DateChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles MonthCalendar1.DateChanged

lbl_fullday.Text = MonthCalendar1.SelectionStart.ToShortDateString()
lbl_year.Text = Mid(lbl_fullday.Text, 1, 4)
lbl_month.Text = Mid(Mid(lbl_fullday.Text, 6, 7), 1, 2)
lbl_day.Text = Mid(lbl_fullday.Text, 9, 10)

lbl_fulldayE.Text = MonthCalendar1.SelectionEnd.ToShortDateString()
lbl_yearE.Text = Mid(lbl_fulldayE.Text, 1, 4)
lbl_monthE.Text = Mid(Mid(lbl_fulldayE.Text, 6, 7), 1, 2)
lbl_dayE.Text = Mid(lbl_fulldayE.Text, 9, 10)

Label1.Text = WeekdayName(Weekday(DateSerial(lbl_year.Text, lbl_month.Text, lbl_day.Text)))

End Sub
End Class
■No32052に返信(まーくんさんの記事)
> 尚、まだこのコードは作成途中なので色々おかしい所はあります。
> 今回は冗長化を無くすためのアドバイスを頂きたいです。

何をしようとしているのか分からない上、アップされたコードが長すぎて読む
気力が湧いてきません。

まず、ご自分でおかしいと思われる点を修正して、コードはご自分が冗長と思
っている点を説明するのに必要最小限に絞って、どの部分が冗長と思うのかを
説明するようにできませんか?

ざっと見たところ、Visual Studio のウィザードを使って作った型付 DataSet
+ TableAbapter、普通の DataTable + DataAdapter、さらには DataReader ま
で使っているところが、「冗長」を通り越してメチャクチャな感じがしますが、
何をしようとしているのか分からないので、はっきりしたことは言えません。
この投稿はマルチポストです。もし元記事の投稿者にマルチポストの心当たりがない場合は、すぐに返信でお知らせください。

●マルチポストされている場所
http://dixq.net/forum/viewtopic.php?f=3&t=14462

----------
この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのルールについて」をお読みください。

●書き込みのルールについて
http://dobon.net/vb/bbs/index.html
No32052 の投稿は、「http://dixq.net/forum/viewtopic.php?f=3&t=14462」で投稿されている記事をコピペしたいたずらの可能性が極めて高いです。

DOBON.NET | プログラミング道 | プログラミング掲示板