Mysql 这个SQL命令有什么问题?

Mysql 这个SQL命令有什么问题?,mysql,vb.net,connector,Mysql,Vb.net,Connector,解决方案:我注意到传递的变量Username的长度超过65k。这让我发现我将ReceiveBufferSize设置错了。只有当我需要检查一个唯一的值,并且该值是流中的最后一个值时,这才变得明显。在我的“工作”命令中,Username是第二个命令。如果您处于类似的情况,请使用QuickWatch并密切关注。可能是空格导致这些值不匹配 Public Function Before_Logon(ByVal Username As String) As String Try

解决方案:我注意到传递的变量Username的长度超过65k。这让我发现我将ReceiveBufferSize设置错了。只有当我需要检查一个唯一的值,并且该值是流中的最后一个值时,这才变得明显。在我的“工作”命令中,Username是第二个命令。如果您处于类似的情况,请使用QuickWatch并密切关注。可能是空格导致这些值不匹配

Public Function Before_Logon(ByVal Username As String) As String
            Try
                mySqlCon.Open()
                Dim sqlCommandPreLogon As MySqlCommand = New MySqlCommand("SELECT username FROM user WHERE username=@username", mySqlCon)
                sqlCommandPreLogon.Parameters.AddWithValue("@username", Username)
                Dim dr As MySqlDataReader = sqlCommandPreLogon.ExecuteReader()
                While dr.Read
                    Return dr.Item(0).ToString
                End While
            Catch ex As Exception
            End Try
            Return 6
        End Function
我在另一个函数中有一个类似于此的命令,它运行良好。这个什么也找不到。删除Try/Catch不会显示任何错误

这也不行

 Dim sqlCommandPreLogon As MySqlCommand = New MySqlCommand("SELECT uid FROM user WHERE username='" & Username & "'", mySqlCon)
 Dim sqlCommandPreLogon As MySqlCommand = New MySqlCommand("SELECT uid FROM user WHERE username='" & Username & "'", mySqlCon)
奇怪的是,这确实有效

 Dim sqlCommandPreLogon As MySqlCommand = New MySqlCommand("SELECT uid FROM user WHERE username='user'", mySqlCon)
 Dim sqlCommandPreLogon As MySqlCommand = New MySqlCommand("SELECT uid FROM user WHERE username='user'", mySqlCon)
为什么变量/sql参数值不起作用,但这确实起作用

更新:当我通过QuickWatch查看参数时,似乎没有什么问题。第一个是工作命令,第二个不是

test    {@uname}    MySql.Data.MySqlClient.MySqlParameter
BaseName    uname   String
Collection  {MySql.Data.MySqlClient.MySqlParameterCollection}   MySql.Data.MySqlClient.MySqlParameterCollection
DbType  String {16} System.Data.DbType
Direction   Input {1}   System.Data.ParameterDirection
Encoding    Nothing System.Text.Encoding
IsNullable  FALSE   Boolean
MySqlDbType VarChar {253}   MySql.Data.MySqlClient.MySqlDbType
ParameterName   @uname  String
PossibleValues  Nothing System.Collections.IList
Precision   0   Byte
Precision (DbParameter) 0   Byte
Scale   0   Byte
Scale (DbParameter) 0   Byte
Size    65533   Integer
SourceColumn    Nothing String
SourceColumnNullMapping FALSE   Boolean
SourceVersion   Current {512}   System.Data.DataRowVersion
TypeHasBeenSet  TRUE    Boolean
Value   new {String}    Object
String  new String
ValueObject {MySql.Data.Types.MySqlString}  MySql.Data.Types.IMySqlValue
MySql.Data.Types.MySqlString    {MySql.Data.Types.MySqlString}  MySql.Data.Types.MySqlString
IsNull  TRUE    Boolean
Value       String

test    {@uname}    MySql.Data.MySqlClient.MySqlParameter
BaseName    uname   String
Collection  {MySql.Data.MySqlClient.MySqlParameterCollection}   MySql.Data.MySqlClient.MySqlParameterCollection
DbType  String {16} System.Data.DbType
Direction   Input {1}   System.Data.ParameterDirection
Encoding    Nothing System.Text.Encoding
IsNullable  FALSE   Boolean
MySqlDbType VarChar {253}   MySql.Data.MySqlClient.MySqlDbType
ParameterName   @uname  String
PossibleValues  Nothing System.Collections.IList
Precision   0   Byte
Precision (DbParameter) 0   Byte
Scale   0   Byte
Scale (DbParameter) 0   Byte
Size    3   Integer
SourceColumn    Nothing String
SourceColumnNullMapping FALSE   Boolean
SourceVersion   Current {512}   System.Data.DataRowVersion
TypeHasBeenSet  TRUE    Boolean
Value   new {String}    Object
String  new String
ValueObject {MySql.Data.Types.MySqlString}  MySql.Data.Types.IMySqlValue
MySql.Data.Types.MySqlString    {MySql.Data.Types.MySqlString}  MySql.Data.Types.MySqlString
IsNull  TRUE    Boolean
Value       String
以下是
'user'
'Username&'
之间的区别

test    {@uname}    MySql.Data.MySqlClient.MySqlParameter
BaseName    uname   String
Collection  {MySql.Data.MySqlClient.MySqlParameterCollection}   MySql.Data.MySqlClient.MySqlParameterCollection
DbType  String {16} System.Data.DbType
Direction   Input {1}   System.Data.ParameterDirection
Encoding    Nothing System.Text.Encoding
IsNullable  FALSE   Boolean
MySqlDbType VarChar {253}   MySql.Data.MySqlClient.MySqlDbType
ParameterName   @uname  String
PossibleValues  Nothing System.Collections.IList
Precision   0   Byte
Precision (DbParameter) 0   Byte
Scale   0   Byte
Scale (DbParameter) 0   Byte
Size    65533   Integer
SourceColumn    Nothing String
SourceColumnNullMapping FALSE   Boolean
SourceVersion   Current {512}   System.Data.DataRowVersion
TypeHasBeenSet  TRUE    Boolean
Value   user {String}   Object
String  user    String
ValueObject {MySql.Data.Types.MySqlString}  MySql.Data.Types.IMySqlValue
MySql.Data.Types.MySqlString    {MySql.Data.Types.MySqlString}  MySql.Data.Types.MySqlString
IsNull  TRUE    Boolean
Value       String

test    {@uname}    MySql.Data.MySqlClient.MySqlParameter
BaseName    uname   String
Collection  {MySql.Data.MySqlClient.MySqlParameterCollection}   MySql.Data.MySqlClient.MySqlParameterCollection
DbType  String {16} System.Data.DbType
Direction   Input {1}   System.Data.ParameterDirection
Encoding    Nothing System.Text.Encoding
IsNullable  FALSE   Boolean
MySqlDbType VarChar {253}   MySql.Data.MySqlClient.MySqlDbType
ParameterName   @uname  String
PossibleValues  Nothing System.Collections.IList
Precision   0   Byte
Precision (DbParameter) 0   Byte
Scale   0   Byte
Scale (DbParameter) 0   Byte
Size    65533   Integer
SourceColumn    Nothing String
SourceColumnNullMapping FALSE   Boolean
SourceVersion   Current {512}   System.Data.DataRowVersion
TypeHasBeenSet  TRUE    Boolean
Value   user {String}   Object
String  user    String
ValueObject {MySql.Data.Types.MySqlString}  MySql.Data.Types.IMySqlValue
MySql.Data.Types.MySqlString    {MySql.Data.Types.MySqlString}  MySql.Data.Types.MySqlString
IsNull  TRUE    Boolean
Value       String
你说

这也不行

 Dim sqlCommandPreLogon As MySqlCommand = New MySqlCommand("SELECT uid FROM user WHERE username='" & Username & "'", mySqlCon)
 Dim sqlCommandPreLogon As MySqlCommand = New MySqlCommand("SELECT uid FROM user WHERE username='" & Username & "'", mySqlCon)
奇怪的是,这确实有效

 Dim sqlCommandPreLogon As MySqlCommand = New MySqlCommand("SELECT uid FROM user WHERE username='user'", mySqlCon)
 Dim sqlCommandPreLogon As MySqlCommand = New MySqlCommand("SELECT uid FROM user WHERE username='user'", mySqlCon)

这个怎么样

Dim sSql1 As String
Dim sSql2 As String

sSql1 = "SELECT uid FROM user WHERE username='" & Username & "'"
sSql2 = "SELECT uid FROM user WHERE username='user'"

在sSql1和sSql2上进行快速监视,并对它们进行比较

定义“不起作用”。您的第一个示例是一个完全没有意义的查询,因为您正在获取一个已经存在的值。您的第二个示例是一个明显的SQL注入漏洞,不应该使用它。第三个示例根本不使用输入值,只使用硬编码值。您想做什么?它以什么方式失败?它不起作用,因为要执行的最终字符串不同或出错,如果您将其保存到字符串并通过调试进行检查,很容易看到这一点。第一个示例可用于验证名称是否存在。然而,我真的在拉另一个专栏。当这不起作用时,我默认了我知道有效的东西。当这起作用时,我变得非常沮丧。显然,第二个示例是开放的SQL注入。示例二和示例三是测试。“我开始使用参数,因为这是编写它的唯一方法。”Drew用QuickWatch结果更新了OP。没什么不对劲的。我想这是个好问题。你表现出研究的努力,并以非常及时的回答支持你的问题。祝你好运按要求更新。第一组,唯一不同的是大小。在这个集合中,所有值都是相同的。至少,根据Excel(如果值重复,则应用填充)。sSql1和sSql2上的quickwatch在哪里。我看不到,我在问另一个问题,然后你需要修剪或者类似的东西,或者你正在处理一个固定空间的数据类型,这是因为缓冲区太大了。这些语句是从客户端(TCPClient/TCPListener)发送的。我仍在学习,但缓冲区大小最大为65k。我没有立即看到它,因为我从未检查过这些值。然而,我确实记得看到我的最终值是数组有大量奇怪的符号。现在,这些字符是空白是有道理的。在这个函数中,我的结束值是Username,这一点现在很明显。