我一直坚持这个错误,在vb.net中试图连接到SQL并在一天内从表中提取数据,使用参数来执行此操作,datetimepicker - 保存到SQL的数据是自定义日期时间格式dd/MM/yyyy HH:mm:ss
,
当我执行我的代码时,我得到了
“必须声明标量变量”@line“
当我删除代码“WHERE [line] = @line and date> = @startdata AND date< @enddata”时,它可以工作,但显示的所有数据都没有日期范围。
connect()
DataGridView1.AutoGenerateColumns = True
cmd.Parameters.Clear()
cmd.CommandText = @"SELECT board, defect, date, detail_x, detail_y,
detail_width, detail_height
FROM [sqlccmdefects]
WHERE [line] = @line
and date >= @startdata
AND date < @enddata";
cmd.Parameters.Add("@line", SqlDbType.VarChar, 30).Value = Form1.line.Text
cmd.Parameters.Add("@startdata", SqlDbType.DateTime).Value = DateTimePicker1.Value
cmd.Parameters.Add("@enddata", SqlDbType.DateTime).Value = DateTimePicker2.Value
cmd.ExecuteScalar()
Dim dataAdapter1 = New SqlDataAdapter(cmd.CommandText, con.ConnectionString)
Dim table1 As New DataTable()
table1.Locale = System.Globalization.CultureInfo.InvariantCulture
dataAdapter1.Fill(table1)
Me.BindingSource1.DataSource = table1
DataGridView1.DataSource = BindingSource1
disconnect()
我得到的是一个空格的Datagridview,标量错误。
答案 0 :(得分:1)
您发布的代码中存在一些问题, 试试这个:
'SQL Connection
Dim sqlCon As New SqlConnection("Server=.;Database=dummy;Trusted_Connection=True;")
'SQL Command
Dim sqlCmd As New SqlCommand("", sqlCon)
sqlCmd.CommandText = "SELECT board, defect, date, detail_x, detail_y, detail_width, detail_height FROM [sqlccmdefects] WHERE [line] = @line and date >= @startdata AND date < @enddata"
'SQL Command Params
sqlCmd.Parameters.Add("@line", SqlDbType.VarChar, 30).Value = "WHATEVER"
sqlCmd.Parameters.Add("@startdata", SqlDbType.DateTime).Value = "2015-07-21"
sqlCmd.Parameters.Add("@enddata", SqlDbType.DateTime).Value = "2015-07-23"
'Data Adapters
Dim dataAdapter1 = New SqlDataAdapter(sqlCmd)
Dim table1 As New DataTable()
'NOT SURE WHAT THIS DOES?
table1.Locale = System.Globalization.CultureInfo.InvariantCulture
'Attach to the GV
dataAdapter1.Fill(table1)
DataGridView1.AutoGenerateColumns = True
BindingSource1.DataSource = table1
DataGridView1.DataSource = BindingSource1
答案 1 :(得分:0)
cmd.ExecuteScalar()
将执行命令 - 消耗参数 - 并丢弃任何结果(当没有结果时使用ExecuteNonQuery
:保存设置以返回值)。
当您填写数据适配器时,该命令将再次运行。但是这次没有参数,并且SQL在第一个未定义的标识符上失败。
所以:不要执行命令,而是将(未执行的)命令传递给(单个参数)数据适配器构造函数。
答案 2 :(得分:0)
ExecuteScalar
。如果它返回更多,则结果是第一行的第一列。
使用cmd.ExecuteReader()
或cmd.ExecuteNonQuery()
代替cmd.ExecuteScalar()