【问题标题】:vb.net SQL causing - "Must declare the scalar variable "vb.net SQL 导致 - “必须声明标量变量”
【发布时间】:2015-07-22 12:27:03
【问题描述】:

我在这个错误上停留了一段时间,在 vb.net 中尝试连接到 SQL 并在一天内从表中提取数据,使用参数来执行此操作,一个 datetimepicker - 保存到 SQL 的数据在自定义日期时间格式dd/MM/yyyy HH:mm:ss,

当我执行我的代码时,我得到了

"必须声明标量变量"@line"

当我删除代码“ WHERE [line] = @line and date >= @startdata AND date

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。

【问题讨论】:

    标签: vb.net datagridview


    【解决方案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
    

    【讨论】:

    • 我也给了它一个爆炸,仍然给了我“必须声明标量变量“@line”
    • 听起来 sqlCmd 在尝试 dataAdapter1.Fill(table1) 时正在丢失其参数,请确保您没有使用任何 con.open、cmd.Execute* 内容、dataAdapter1.Fill (table1) 将为您打开连接、执行 T-SQL 并关闭连接
    • ?+ “板、缺陷、日期、detail_x、detail_y、detail_width、detail_height 和 line”都是 sqlccmdefects 表中的列吗?还是 sqlccmdefects 是一个存储过程?
    • 都是表中的列,我再看一遍
    • 确保您使用的是'New SqlDataAdapter(sqlCmd)' 而不是New SqlDataAdapter(cmd.CommandText, con.ConnectionString),传入的文本将不包含参数
    【解决方案2】:

    ExecuteScalar 通常在查询返回单个值时使用。如果返回更多,则结果是第一行的第一列。

    使用cmd.ExecuteReader()cmd.ExecuteNonQuery() 代替cmd.ExecuteScalar()

    【讨论】:

    • 似乎不起作用,但我也尝试了 executereader,仍然得到必须声明标量变量“@line” - 干杯!
    【解决方案3】:

    cmd.ExecuteScalar()

    将执行命令——使用参数——并丢弃任何结果(当没有结果时使用ExecuteNonQuery:保存设置为返回值)。

    当您填充数据适配器时,命令将再次运行。但是这次没有参数,SQL 在第一个未定义的标识符上失败。

    所以:不要执行命令,而是将(未执行的)命令传递给(单参数)数据适配器构造函数。

    【讨论】:

    • 似乎不起作用,仍然得到必须声明标量变量“@line”-为此干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    相关资源
    最近更新 更多