【问题标题】:SQLite command.Parameters.Add() not workingSQLite command.Parameters.Add() 不起作用
【发布时间】:2020-04-25 10:59:55
【问题描述】:

这是我的代码。

public void setUpdate(List<string> code, string tableName)
{
            SQLiteConnection con = new SQLiteConnection(connection);
            SQLiteCommand UPDATE = new SQLiteCommand("UPDATE @TableName SET @ColumnName = @Value WHERE Key = @PK", con);
            UPDATE.Parameters.AddWithValue("@TableName", "TEST");
            UPDATE.Parameters.AddWithValue("@ColumnName", code[1]);
            UPDATE.Parameters.AddWithValue("@Value", code[2]);
            UPDATE.Parameters.AddWithValue("@PK", code[0]);
            using (con)
            {
                con.Open();
                UPDATE.ExecuteNonQuery();
            }
}

我遇到了这个异常

System.Data.SQLite.SQLiteException: 'SQL logic error
near "@TableName": syntax error'

我已经尝试过使用

UPDATE.Parameters.Add(new SQLiteParameter("@TableName", DbType.String) .Value = tableName);

仍然遇到同样的异常。

我不知道如何解决这个问题了。 我不想使用串联,因为当您传递如下值时,它会搞砸查询。

Smith's

编辑:

我在

上放了一个断点
using (con)

然后检查命令文本。结果是:

"UPDATE @TableName SET @ColumnName = @Value WHERE Key = @PK"

【问题讨论】:

  • 据我所知,您无法通过提供表和列来尝试参数化。您必须将这些部分构建为命令的直接部分。您显然可以添加设置值和位置的参数。如果通过将字符串部分添加在一起来构建查询,请注意 SQL 注入。
  • 我已经试过了。它给了我同样的错误,但在@value 上。
  • 我认为您不能在命令对象中参数化表名或列名。
  • 我尝试硬编码表名和列名仍然相同的错误:( .

标签: c# sqlite


【解决方案1】:

我认为表名作为参数存在问题。 因此,首先尝试保留除表名之外的所有参数(暂时将“测试”硬编码到查询中),如果可行,请查看以下内容: C# query with dynamic tablename

【讨论】:

  • 更新了我的帖子。
【解决方案2】:

再次尝试使用您不能作为 PARAMETER 执行的 from 和列名称构建查询。它们需要固定在字符串中。但要小心。不要让您构建的表/列/等部分来自不受信任的来源,尤其是网络,以免损坏 SQL 注入。

如果您的系统正在控制来源和限定,或者以其他方式在内部控制传入的表名,并且您控制/限定传入的列名,我将调整您的函数如下:

public void setUpdate(List<string> code, string tableName)
{
   SQLiteConnection con = new SQLiteConnection(connection);
   SQLiteCommand UPDATE = new SQLiteCommand(
"UPDATE " + tableName + " set " + code[1] + " = @Value WHERE Key = @PK", con);

   UPDATE.Parameters.AddWithValue("@Value", code[2]);
   UPDATE.Parameters.AddWithValue("@PK", code[0]);
   using (con)
   {
      con.Open();
      UPDATE.ExecuteNonQuery();
      con.Close();
   }
}

同样,这是在您控制和清理 tableName 参数的来源和您的代码数组的前提下,第二个元素通过 [1] 表示列名。参数设置值 EQUAL TO 和其中的 EQUALS 键都可以。 如果这不起作用,我会从一个您知道合法/清晰的查询开始,只是为了测试带有参数的功能。

"UPDATE YourTable set YourColumn = @Value WHERE Key = @PK"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 2017-10-13
    • 2018-07-22
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多