2016-04-20 10 views
0

私は現在、このプログラムを作成しており、ユーザーは開始日と終了日を入力します。その後、プログラムはデータベースのレコードをデータベースから検索します。データベースの開始日は> =ユーザ入力の開始日、dbの終了日は< =ユーザ入力の終了日となります。SQL Serverのdatetimeを比較する際にエラーが発生しました

Dim dateStr As DateTime = dtpStart.Value 
Dim dateEnd As DateTime = dtpEnd.Value 

MsgBox(dateStr) 

con.ConnectionString = "Data Source=MKZSA065\SQLSERVER2008R2,1499;Initial Catalog=inv" 
con.Open() 
MsgBox("server connected") 

cmd.Connection = con 
'cmd.CommandText = "Select column_name as 'Columnname', data_type as'Datatype' from information_schema.columns where table_name = 'inv.dbo.InOutTransaction' AND column_name = 'inv.dbo.InOutTransaction.startDate'" 
'cmd.CommandText = "Select inv.dbo.InOutTransaction.refNo, inv.dbo.Case_Status.deployedBy, CONVERT(varchar(10), inv.dbo.InOutTransaction.startDate, 120) as startDate, CONVERT(varchar(10), inv.dbo.InOutTransaction.endDate, 120) as endDate, inv.dbo.InOutTransaction.item FROM inv.dbo.InOutTransaction inner join inv.dbo.Case_Status ON inv.dbo.InOutTransaction.refNo = inv.dbo.Case_Status.refNo WHERE inv.dbo.InOutTransaction.refNo LIKE 'L%' AND inv.dbo.InOutTransaction.status LIKE 'Out'" 

cmd.CommandText = "Select inv.dbo.InOutTransaction.refNo, inv.dbo.Case_Status.deployedBy, CONVERT(varchar(10),inv.dbo.InOutTransaction.startDate,120) as startDate, CONVERT(varchar(10),inv.dbo.InOutTransaction.endDate,120) as endDate, inv.dbo.InOutTransaction.item from inv.dbo.InOutTransaction inner join inv.dbo.Case_Status ON inv.dbo.InOutTransaction.refNo = inv.dbo.Case_Status.refNo WHERE inv.dbo.InOutTransaction.refNo LIKE 'L%' AND inv.dbo.InOutTransaction.status LIKE '%Out%' AND inv.dbo.InOutTransaction.startDate >= '" & dateStr & "' AND inv.dbo.InOutTransaction.endDate <= '" & dateEnd & "'" 

Dim lrd As SqlDataReader 
Dim li As ListViewItem 

lrd = cmd.ExecuteReader() 

Dim num As Integer = 1 
While lrd.Read() 
    ListView1.BeginUpdate() 

    li = ListView1.Items.Add(num.ToString) 
    li.SubItems.Add(lrd("refNo").ToString) 
    li.SubItems.Add(lrd("deployedBy").ToString) 
    li.SubItems.Add(lrd("startDate").ToString) 
    li.SubItems.Add(lrd("endDate").ToString) 
    li.SubItems.Add(lrd("item").ToString) 
    'li.SubItems.Add(lrd("column_name").ToString) 
    'li.SubItems.Add(lrd("data_type").ToString) 

    num += 1 

    ListView1.EndUpdate() 
    ListView1.EnsureVisible(ListView1.Items.Count - 1) 
End While 

文字列

から日時を変換するとき

変換が、私は関数datestrは想像どのように私は何をすべき:(

+4

日付 'date'、' datetime'、またはあなたのDBMSで使用可能な他の日付データ型に適切なデータ型を使用してください。 – HoneyBadger

+1

IF - これは難しいことです。実際に日付のために文字列を使用する必要がある場合は、必ずISO形式を使用してください。 –

+1

誰もが知っているので、そのパスワードを変更することを検討したいと思うかもしれません。 –

答えて

3

USE PARAMETERISED QUERIES

が、私は、これがいかに重要であるかを十分に強調することはできませんあなたのエラーを解決するだけではなく、しかし、パフォーマンス、および一般的なアプリケーションのセキュリティのために。

だからではなく、あなたが次に

"inv.dbo.InOutTransaction.startDate >= @StartDate AND inv.dbo.InOutTransaction.endDate <= @EndDate" 

を使用し、あなたのSqlCommandオブジェクトにパラメータを追加する必要があります

"inv.dbo.InOutTransaction.startDate >= '" & dateStr & "' AND inv.dbo.InOutTransaction.endDate <= '" & dateEnd & "'" 

の:

cmd.Parameters.Add("@StartDate", SqlDbType.DateTime).Value = dateStr 
cmd.Parameters.Add("@EndDate", SqlDbType.DateTime).Value = dateEnd 

これは、暗黙の必要がないことを意味しSqlCommandは2つの日付パラメータを想定しており、2つのDateTimeオブジェクトを渡します。突然、日付の形式と文化的な変化は無関係です。さらに、SQL Serverはキャッシュされたプランを使用でき、渡された開始日と終了日の値が異なるたびにクエリを再コンパイルする必要はありません。

IDisposableオブジェクトを処理する場合は、特にUsingを使用することをお勧めします。特に、このような管理されていないオブジェクトの場合は、それがうまくいけば、控えめに言って

それはエラーが散らばっている場合は、私のvb.Netご容赦ください
Dim dateStr As DateTime = dtpStart.Value 
Dim dateEnd As DateTime = dtpEnd.Value 

Dim sql as String = "Select inv.dbo.InOutTransaction.refNo, " & _ 
        "  inv.dbo.Case_Status.deployedBy, " & _ 
        "  CONVERT(varchar(10), " & _ 
        "  inv.dbo.InOutTransaction.startDate,120) as startDate, " & _ 
        "  CONVERT(varchar(10),inv.dbo.InOutTransaction.endDate,120) as endDate, " & _ 
        "  inv.dbo.InOutTransaction.item " & _ 
        "from inv.dbo.InOutTransaction " 
        " inner join inv.dbo.Case_Status " & _ 
        "  ON inv.dbo.InOutTransaction.refNo = inv.dbo.Case_Status.refNo " & _ 
        "WHERE inv.dbo.InOutTransaction.refNo LIKE 'L%' " & _ 
        "AND inv.dbo.InOutTransaction.status LIKE '%Out%' " & _ 
        "AND inv.dbo.InOutTransaction.startDate >= @StartDate " & _ 
        "AND inv.dbo.InOutTransaction.endDate <= @EndDate" 


Using con As new SqlConnection("Data Source=MKZSA065\SQLSERVER2008R2,1499;Initial Catalog=inv;User ID=inv_admin;Password=inv_admin123") 
Using cmd As New SqlCommand(sql, con) 

    con.Open() 
    cmd.Parameters.Add("@StartDate", SqlDbType.DateTime).Value = dateStr 
    cmd.Parameters.Add("@EndDate", SqlDbType.DateTime).Value = dateEnd 

    Using lrd As SqlDataReader = cmd.ExecuteReader() 

     Dim num As Integer = 1 
     Dim li As ListViewItem 

     While lrd.Read() 
      ListView1.BeginUpdate() 

      li = ListView1.Items.Add(num.ToString) 
      li.SubItems.Add(lrd("refNo").ToString) 
      li.SubItems.Add(lrd("deployedBy").ToString) 
      li.SubItems.Add(lrd("startDate").ToString) 
      li.SubItems.Add(lrd("endDate").ToString) 
      li.SubItems.Add(lrd("item").ToString) 
      'li.SubItems.Add(lrd("column_name").ToString) 
      'li.SubItems.Add(lrd("data_type").ToString) 

      num += 1 

      ListView1.EndUpdate() 
      ListView1.EnsureVisible(ListView1.Items.Count - 1) 
     End While 
    End Using 
End Using 

、私は長い時間でそれを使用していないので、さびた午前:だからあなたのようなもので終わるかもしれませんしかし、ポイントを取得するのに十分です

+0

それは働いた!どうもありがとうございます! –

0

失敗したときにエラーが発生しました DATEFORMATの設定に関係なく、YYYYMMDDの形式をそのまま使用してください。

大声申し訳ありません
関連する問題