2016-11-20 9 views
-1

アクセスデータベースでSUMの列を作成しようとしていますが、やや機能します。
column5およびcolumn6は日付です。 2015年11月15日の日付と19/11/2016の日付を持つレコードがあるとします。私が15/11/2016として 'OdDate'を選択し、19/11/2016として 'DoDate'を選択すると、レコードが合計されます。この問題は、2011年5月15日から2011年10月15日に選択すると問題になります。20/11/2016、この場合、スカラーは19/11/2016のレコードを返します.2011年11月15日のレコードは無視されます。さらに数日を選択すると、エラーdbnullがスローされます。
私はなぜdbnullエラーをスローするのか分かりますが、私が知りたいのは、15/11/2016から20/11/2016までを選択すると15/11/2016のレコードを無視するのはなぜですか? dbnullエラー、20/11/2016日付のレコードがありません。代わりに、19/11/2016のレコードのみを返します。DBnull、ms-accessのエラー

Dim provider As String 
    Dim dataFile As String = My.Application.Info.DirectoryPath 
    provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source =" 
    dataFile = ("Database\Baza-Original.accdb") 

    Dim SqlQry1 As String = "SELECT SUM(Column2 + Column3 + Column4) FROM [Table] WHERE Column1 = @1 BETWEEN Column5 = @2 AND Column6 = @3" 

    Using myconnection As New OleDbConnection(provider & dataFile) 
     myconnection.Open() 

     Dim cmd1 As New OleDbCommand(SqlQry1, myconnection) 
     cmd1.Parameters.AddWithValue("@1", CB.SelectedItem) 
     cmd1.Parameters.AddWithValue("@2", OdDate.Value.Date) 
     cmd1.Parameters.AddWithValue("@3", DoDate.Value.Date) 

     If cmd1.ExecuteScalar() Then 

      Dim field As Int32 

      field = cmd1.ExecuteScalar() 
      LBL.text = field 

      myconnection.Close() 
      MsgBox("msg1. ", MsgBoxStyle.Information, "successful") 
     Else 
      MsgBox("msg2. ", MsgBoxStyle.Critical, "Unsuccessful!") 
      Return 
     End If 

    End Using 
+3

WHERE要素とBETWEEN要素が文字化けして見えます。それは 'どこにColumn1 = @ 1とSOMEDATECOLは@ 2と@ 3の間にあるべきですか? col 5と6はSUMの一部です。値も日付ですか? – Plutonix

+0

WHERE column1部分はおそらく必要ではありませんが、私はあなたが何をしているのか分かりません。 http://www.tutorialspoint.com/sql/ – Plutonix

+0

column1は私が合計しようとしているレコードの名前です、column1に異なる名前のレコードがあります、私はcolumn5と6を編集しました、私はキリル文字を置き換えていました。正直な間違いをした。 – Taffs

答えて

2

BETWEENオペレータは使いやすいと思われますが、注意する必要があります。それに加えて、日付の比較は、人間の中で行う方法とは対照的に、厳密に数学的に行われます。

:パラメータを設定する Can we stop using AddWithValue() already?

SELECT SUM(Column2 + Column3 + Column4) 
FROM [Table] 
WHERE Column1 = @1 
AND Column5 >= @2 AND Column6 < @3 

を、コードで - それは働くことができますコードを作るために努力する価値はないので

また、AddWithValueは、予期しない結果を与えることができ、使用すべきではありません

cmd1.Parameters.Add(New OleDbParameter With {.ParameterName = "@3", .OleDbType = OleDbType.Date, .Value = OdDate.Value.Date.AddDays(1)}) 
+1

argsからあなたのためのparamを作成する 'Add'のオーバーロードがあります:' cmd.Parameters.Add( "@p1"、OleDbType.Date).Value = someDTVar' 'AddWithValue'は約 – Plutonix

+0

のようです@Plutonixそれは本当ですが、毎回動く方法を使いやすく、コード内での外観の整合性を保ちます(精度やサイズなどのパラメータが必要な場合)。 –

+0

同じ結果が得られます。 = 1という名前のレコードを1つだけ合計し、残りを無視します。 – Taffs

関連する問題