从字符串VB.net转换日期和/或时间时出错

时间:2015-05-18 19:34:06

标签: sql vb.net date dateadd

我目前正在使用visual studio express 2013 for windows desktop。我有一个相当简单的错误的问题。我正在尝试运行一个sql命令,从日期时间选择器中选择一个日期,然后将时间设置为早上6点和下午3点。然后,select查询将在这些时间之间提取所有数据条目。但是,我的字符串未转换为日期时间。我把一个消息框放入并检查,以确保我的字符串看起来正确,它确实。我也已经将这个sql代码放入我的sql server管理工作室,以便仔细检查它是否工作,这一切都很顺利。这是我的代码:

   'SQL 1st shift statement
            'Eff Statement
            Dim Time As Date = DTPStart.Value.ToString("yyyy-MM-dd")
            Using conn1 As New SqlConnection(connstring)
                conn1.Open()
                Using comm1 As New SqlCommand("SELECT ((sum([MINUTES])/60)/@HoursWorked) as Efficiency FROM table1 " _
                                              & "Left Join table2 on table1.PartNumber + '-' =table2.PART_NUMBER " _
                                              & "WHERE Time BETWEEN (DATEADD(HH, 6, @Start)) AND (DATEADD(HH, 15, @Start)) " _
                                              & "AND Sequence = 25 AND Assemble = 1 AND PartNumber is not null and [MINUTES] > 29", conn1)
                    comm1.Parameters.AddWithValue("@Start", DTPStart.Value.ToString("yyyy-MM-dd"))
                    comm1.Parameters.AddWithValue("@HoursWorked", WorkingHours)
                    Dim dt As New DataTable
                    Dim sql As New SqlDataAdapter(comm1)
                    sql.Fill(dt)
                    Dim EFF As String = CDbl(dt.Rows(0)(0)).ToString("N2")
                    labeleff.Text = EFF
                End Using
                conn1.Close()
            End Using

此代码应自动生成一个eff。数字,但是我会对这个查询做很多分拆。

1 个答案:

答案 0 :(得分:0)

使用此代码,您可以采取一些措施来简化您的工作。

不是连接一串字符串来创建SQL查询,而是可以利用VB.NET直接输入XML的能力 - 唯一的缺点是使用<,>和& XML中的字符。

无需使用SQL的方法来获取开始和结束时间:您可以在VB代码中以更灵活的方式进行操作。

由于您显然只想要一个结果,您可以使用ExecuteScalar - 它是专门为此设计的。

最后,我强烈建议使用AddWithValue not - 当它推断错误的类型传递给SQL服务器时,它会回来咬你。最好添加一个New SqlParameter。哦,我怀疑在联接中你应该指定table1.Sequence等而不只是Sequence

因此...

Dim dayStartTime As New TimeSpan(6, 0, 0)
Dim dayEndTime As New TimeSpan(15, 0, 0)

Dim theDate As DateTime = DTPStart.Value.Date
Dim startTime As DateTime = theDate.Add(dayStartTime)
Dim endTime As DateTime = theDate.Add(dayEndTime)

Dim workingHours As Double = (endTime - startTime).TotalHours

    ' N.B. As this is XML, you must use &lt; &gt; &amp; for <, >, & '
Dim sqlText = <sql>
                     SELECT (SUM([MINUTES]) / 60.0 / @HoursWorked) AS Efficiency FROM table1
                      LEFT JOIN table2 ON table2.PART_NUMBER = table1.PartNumber + '-' 
                      WHERE [Time] BETWEEN @StartTime AND @EndTime 
                        AND Sequence = 25
                        AND Assemble = 1
                        AND PartNumber IS NOT NULL
                        AND [MINUTES] &gt; 29
              </sql>.Value

Using conn1 As New SqlConnection(connstring)
    Using comm1 As New SqlCommand(sqlText, conn1)

        comm1.Parameters.Add(New SqlParameter With {.ParameterName = "@StartTime", .SqlDbType = SqlDbType.DateTime, .Value = startTime})
        comm1.Parameters.Add(New SqlParameter With {.ParameterName = "@EndTime", .SqlDbType = SqlDbType.DateTime, .Value = endTime})
        comm1.Parameters.Add(New SqlParameter With {.ParameterName = "@HoursWorked", .SqlDbType = SqlDbType.Float, .Value = workingHours})

        conn1.Open()
        Dim efficieny As Object = comm1.ExecuteScalar
        conn1.Close()

        If efficieny IsNot Nothing Then
            labeleff.Text = CDbl(efficieny).ToString()
        Else
            ' query did not return a result '
        End If

    End Using

End Using

ETA:哦,最重要的一点,不要使用字符串作为日期。这样做只是在寻找问题。