vb.net SQL导致 - “必须声明标量变量”

时间:2015-07-22 12:27:04

标签: vb.net datagridview

我一直坚持这个错误,在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,标量错误。

3 个答案:

答案 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()