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

Posted

技术标签:

【中文标题】vb.net SQL 导致 - “必须声明标量变量”【英文标题】:vb.net SQL causing - "Must declare the scalar variable " 【发布时间】: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。

【问题讨论】:

【参考方案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”-为此干杯!

以上是关于vb.net SQL 导致 - “必须声明标量变量”的主要内容,如果未能解决你的问题,请参考以下文章

sql数据库错误“必须声明标量变量”

SQL Server:必须声明标量变量

sql必须声明标量变量错误

尝试在 SQL 中运行 UPDATE 语句时“必须声明标量变量”

不正确的语法必须声明标量变量

必须用参数声明标量变量