2017-03-20 3 views
-1

私は今、いくつかの時間のためにこれをしようとしてきた、 は、だから私のMSアクセスデータベースに私はカウントゲスト予約のVisual StudioのMSアクセス

Table named "reservations" and inside the table are 
Name(sid,jen) 
Roomtype(single,double) 
Arrivaldate(3/20/17, 3/20/17) 
Departuredate(3/21/17, 3/21/17) 

を持っていると私のVisual Studioの形で私は

2 labels = lblsingle , lbldouble 
1 button named btnok and 
Datetimepicker named Datetimepicker1 (properties format set to "Short") 
を持っています

Private sub Form1_Load 

Dim time as DateTime = DateTime.Now 
Dim format As String = "MM/d/yyyy" 
Datetimepicker1.Text = time.ToString(format) 

Private sub btnok_click 

Con.open 

Dim cmb As new OleDbCommand("SELECT COUNT (*) FROM [reservations] WHERE [Roomtype] = 'Single' AND [Arrivaldate] = " & Datetimepicker1.Text & " ",Con) 
Dim dr As OleDbDataReader = cmb.ExecuteReader 
Dim userfound As Boolean = False 

While dr.Read 
    userfound = True 
    lblsingle.text = (dr(0).ToString()) 
End While 
Con.Close() 
End Sub 
End Class 

は、だからここに私のコードです。 私はdatetimepicker1で日付3/20/17を選択したときに何が起こりたいのですか?私のlblsingle.textは "1"になるはずです。私のデータベースでは、datetkmepicker1と同じ日付の単一のものがあるからです。しかし、結果は "0"です.........私は実際に私のdatetimepicker1と私のmsアクセスの日付を異なるものにする何かがあると思います、 助けてください....私は時間形式を変更する必要がありますか?どこか?

+0

ドン」 '.Text'を使いこなす - [DateTimePicker.Value]を使う(https://msdn.microsoft.com/en-us/library/system.windows.forms.datetimepicker.value(v = vs.110) .aspx)プロパティを使用して日付/時刻値を取得および設定します。 – Filburt

+0

oledbcommandに2つの "#"記号が残っていることが判明しました。現在は作業中です – sid

答えて

0

最初に、「プライベートサブbtnok_click」はボタンのクリックを処理しません。処理するには

あなたの実装が(プロト)、以下に示すべきであるとして、「ボタンをクリックしてください」:

Private Sub button1_Click(sender As Object, e As System.EventArgs) Handles button1.Click 
.. 
.. 
.. 
.. 
End Sub. 

ビジネスロジックに来る:更新/あなたのラベルをインクリメントしたい場合は

質問の説明に基づいて、 "DatTimePicker"の値が変更されるとすぐにラベルを更新/増分します。

しかし、コードでは、 "OK"ボタンをクリックしてそれをしようとしています。

あなたは「DateTimePickerの」から日付を選択すると、イベント(プロト)の下に扱う、ラベルを更新したい場合:

Private Sub DateTimePicker1_ValueChanged(sender as Object, e as EventArgs) _ 
    Handles DateTimePicker1.ValueChanged 

.. 
.. 
.. 
.. 

End Sub 
0

あなたが日時ではなくテキストとして日付を処理する必要があります。

Dim time as DateTime = DateTime.Today 
Dim format As String = "yyyy'/'MM'/'/dd" 

Datetimepicker1.Value = time 

Private sub btnok_click 

Con.open 

Dim cmb As new OleDbCommand("SELECT COUNT (*) FROM [reservations] WHERE [Roomtype] = 'Single' AND [Arrivaldate] = #" & time.ToString(format) & "# ",Con) 
+0

なぜ日付/時刻をテキストとして扱わないのか、型付きパラメータを使用しないコードを表示していますフォーマット文字列? – Filburt

+0

日付の値をSQLに連結する場合は、連結する前に適切な文字列式に変換する必要があります。私はパラメータを使用することを好むでしょうが、質問者は異なった選択の理由があるかもしれません。 – Gustav

0

Do は、日付と時刻のテキスト表現を使用します。ユーザーのレンダリング出力(またはCSVファイルのようなテキスト出力としてのシリアル化)以外のすべての目的にDateTimeを使用します。

あなたの制御のためのDateTime値の取り扱い

使用してください。値を取得し、あなたのコントロールを設定するには、Valueプロパティ:

Datetimepicker1.Value = DateTime.Now 

データベースクエリの日付と時刻の値の処理

は、データベースクエリにDateTimeの値を渡すために(入力した)パラメータを使用します。

Dim cmb As new OleDbCommand("SELECT COUNT (*) FROM [reservations] WHERE [Roomtype] = 'Single' AND [Arrivaldate] = ?", Con) 
cmb.Parameters.Add(Datetimepicker1.Value) 

OleDbCommandは位置パラメータを使用します。つまり、パラメータを追加するときにプレースホルダの順序を一致させる必要があります。

Dim roomtype As String 
roomtype = "Single" 

Dim cmb As new OleDbCommand("SELECT COUNT (*) FROM [reservations] WHERE [Roomtype] = ? AND [Arrivaldate] = ?", Con) 
cmb.Parameters.Add(roomtype) 
cmb.Parameters.Add(Datetimepicker1.Value) 

あなたが取得しようとするすべてはあなたがOleDbDataReaderクラスを必要としない、count(*)であれば、カウント(*)

のようなスカラー結果を取得簡素化 - あなたのコマンド聞かせExecuteScalar

lblsingle.Text = cmb.ExecuteScalar() 
+0

客室タイプと到着日がなぜ疑問符ですか? – sid

+0

OleDbCommandは、パラメータ値のプレースホルダとして '?'を使用し、パラメータの順序に依存します(私のコード例のように)。 SqlCommandはあなたのクエリが '... [Roomtype] = @roomtype ...'のようになるように名前付きパラメータを使うことを許可します。一般に、パラメータ化されたクエリを使用すると、Sql Injection攻撃を防ぐのに役立ちます。[Exploits Of A Mom](https://xkcd.com/327/) – Filburt

+0

Btw: '.ExecuteScalar() 'あなたのOleDbdataReaderの代わりに? – Filburt

関連する問題