C# 和 MySQL - 语法不正确?

标签 c# mysql syntax

假设我的这个方法来 self 的 MySQLOperations 类:

    public bool checkIfRowExists(string tableName, string columnToLookIn, string dataToLookFor)
    {
        string myConnectionString = "Server = " + server + "; Database = " + dbName + "; UID = " + user + "; Password = " + password + ";";
        int isExisting = 0;
        using (MySqlConnection myConnection = new MySqlConnection(myConnectionString))
        {
            using (MySqlCommand myCommand = new MySqlCommand("SELECT EXISTS (SELECT 1 FROM @tablename WHERE @columnname = @data);", myConnection))
            {
                myCommand.Parameters.AddWithValue("@tablename", tableName);
                myCommand.Parameters.AddWithValue("@columnname", columnToLookIn);
                myCommand.Parameters.AddWithValue("@data", dataToLookFor);
                try
                {
                    myConnection.Open();
                    isExisting = (int)myCommand.ExecuteScalar();
                    myConnection.Close();
                }
                catch (Exception ex)
                {
                    myConnection.Close();
                    MessageBox.Show(ex.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                return (isExisting == 1);
            }
        }
    }

在另一个类中,我创建了一个 MySQLOperations 对象。 我在 if 语句中调用了此方法:if(objSQLOperations.checkIfRowExists("tblInventory", "ItemID", txtItemID.Text))。我们假设 txtItemID 包含有效的 10 位数字。在我的数据库中,我有一个名为 tblInventory 的表,其中有一列 ItemID

我的问题是我的 catch block 中的语句执行时显示我的 SQL 语法有错误。 “您的 SQL 语法有错误;请检查与您的 MySQL 服务器版本相对应的手册,了解在第 1 行 ''tblInventory' WHERE 'ItemID' = '11111111111'' 附近使用的正确语法。”当我的 txtItemID 包含文本“1111111111”时,会在 MessageBox 中弹出。

我相信我的 SELECT EXISTS 语句是正确的。

最佳答案

不,您不能使用表名或列名的参数。您必须通过连接动态构建 SQL 字符串。

喜欢:

var sql = "SELECT EXISTS(SELECT 1 FROM " + tablename + 
           " WHERE " + columnNameToLookIn + " = @data);"
using (MySqlCommand myCommand = new MySqlCommand(sql, myConnection))

这当然会让你进入 SQL injection如果tableNamecolumnNameToLookIn可以由用户输入。但是,如果 tableNamecolumnNameToLookIn 仅在代码中设置(如示例中所示),那么这不是问题。

相关:

use a variable for table name in mysql sproc

Dynamic table names in stored procedure function

关于C# 和 MySQL - 语法不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25829661/

相关文章:

MySQL触发器更新语法错误

c# - 需要一些解释这是什么 C# 奇怪的语法

c# - DotNetOpenAuth 是否有更好的替代品?

c# - 如何在列表框中显示文件名但使用 openfiledialog 保留相对路径?

php - MySQL order by DESC 挂起; ASC 还不错

Mysql 使用时间戳和条件查询当前日期?

java - 计算数组中的字母(java)

c# - 我可以在 c# .NET 中强制使用 'this' 关键字吗?

C# 文件名比较列表

c# - ASP.NET 用户控件的编辑、插入、更新模式