我目前正在使用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。数字,但是我会对这个查询做很多分拆。
答案 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 < > & 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] > 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:哦,最重要的一点,不要使用字符串作为日期。这样做只是在寻找问题。