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 导致 - “必须声明标量变量”的主要内容,如果未能解决你的问题,请参考以下文章