mysql - 当@variable 被添加到 mysql 查询时,Vb.net/Mysql 抛出 fatal error

标签 mysql vb.net fatal-error

您好,我正在使用以下查询/代码来填充数据网格

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) 相同:

enter image description here

关于mysql - 当@variable 被添加到 mysql 查询时,Vb.net/Mysql 抛出 fatal error ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36964628/

相关文章:

android - NullPointerException:尝试在空对象引用上调用虚方法 enableForegroundDispatch(...)

mysql - 在 mySql 中找到类似的条目

vb.net - 获取下一个工作日(跳过周末)的日期以在 HTML 中显示数据

c# - .NET - 可以禁用 IIf 吗?

php - 如何捕获特征未找到错误 PHP 7

android - java.lang.RuntimeException : Could not open input channel pair

mysql - 使用 SQL 查询对列表中的项目重新编号?

mysql - 从 MySQL 存储过程 Ping 网站

MySQL 生成的 UID

.net - 对数据源组合框进行排序?