您好,我正在使用以下查询/代码来填充数据网格
Private Sub btnSave_frmCreateInvoice_Click(sender As Object, e As EventArgs) Handles btnSave_frmCreateInvoice.Click
Dim qryGetInvoiceItems as string = "select @s:=@s+1 'SLNO', ini_item_details 'Item Description', ini_item_quantity 'Quantity', ini_item_rate 'Rate', round(ini_item_quantity*ini_item_rate,2) 'Item Amount' from tbl_invoice_items, (SELECT @s:=0) AS s where ini_invoice_no=" & txtInvoiceNumber_frmCreateInvoice.Text & " and ini_status=1 order by ini_id ASC"
fill_datagrid(dgInvoiceItems_frmCreateInvoice, qryGetInvoiceItems)
End Sub
Public Sub fill_datagrid(ByVal datagrid As DataGridView, ByVal query As String)
Using conn As New MySqlConnection
Try
conn.ConnectionString = constr
conn.Open()
Dim sqlcommand As New MySqlCommand(query, conn)
Dim sqlDataAdapter As New MySqlDataAdapter
Dim dt As New DataTable
Dim bSource As New BindingSource
sqlDataAdapter.SelectCommand = sqlcommand
sqlDataAdapter.Fill(dt)
bSource.DataSource = dt
datagrid.DataSource = bSource
sqlDataAdapter.Dispose()
Finally
If conn IsNot Nothing Then
conn.Dispose()
End If
End Try
End Using
End Sub
在 mysql 查询中,我使用@s 来获取每个项目的 SLNO。查询在 MYSQL 控制台中按要求完美运行,但在应用程序中运行时抛出 fatal error
An unhandled exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in MySql.Data.dll
Additional information: Fatal error encountered during command execution.
如果我删除 @s:=@s+1
和 (SELECT @s:=0) AS s
,那么应用程序可以正常工作。
请提出建议。
最佳答案
有几种方法可以形成 SQL 查询,但还需要另一个步骤。使用此 SQL:
Dim SQL = "SET @s=0; SELECT Id, Name, Description, A, B, C, D, @s:=@s+1 As SLNO FROM Alpha"
Using dbcon As New MySqlConnection(MySQLConnStr)
Using cmd As New MySqlCommand(SQL, dbcon)
dbcon.Open()
dtSample = New DataTable
dtSample.Load(cmd.ExecuteReader)
End Using
End Using
dgv2.DataSource = dtSample
请注意,您不需要 DataAdapter
来填充 DataTable
;有比这更繁重的工作。此 SQL 也有效:
Dim SQL = <sql>
SELECT Id, Name, Description, A, B, C, D, @s:=@s+1 As SLNO
FROM Alpha, (SELECT @s :=0) ss
</sql>.Value
XML 文字只是为了消除滚动。 (SELECT @s :=0) ss
部分充当内联初始化,与第一个 (SET @s=0;
) 中的单独语句执行相同的操作。
这就是技巧
默认情况下,MySQL 不允许用户变量(@s
),因此您必须启用它们以避免 fatal error 异常。如果您查看详细信息
,您应该会看到{"Parameter '@s' must be defined."}。通过连接字符串启用用户变量:
"allowuservariables=True;server=...;database=xxx;user id=uuu;password=pppp;port=3306"
MySQL 允许 large number of options您可以根据需要在连接字符串中启用。如果您使用超过一两个,您可能需要使用 MySqlConnectionStringBuilder
来创建它以避免格式错误。
启用用户变量后,结果与任一 SQL (MySQL 6.9.8.0) 相同:
关于mysql - 当@variable 被添加到 mysql 查询时,Vb.net/Mysql 抛出 fatal error ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36964628/