【问题标题】:C# How to pass sql variableC#如何传递sql变量
【发布时间】:2015-08-30 07:31:34
【问题描述】:

我正在尝试通过 C# 向 mysql 数据库中插入一些值

INSERT INTO cliente (column1, column2) VALUES (value1, value2);
set @ultima_pk =  LAST_INSERT_ID();
INSERT INTO cliente_ref (refCol1, refCol2) VALUES (refvalue1, (SELECT @ultima_pk));
INSERT INTO cliente_ref (refCol1, refCol2) VALUES (refvalue1, (SELECT @ultima_pk));

当我只在 mysql 中测试它时,可以正常工作,但是当我尝试通过 C# 插入它时,我不能。

错误信息:

Parameter '@ultima_pk' must be defined.

但是@ultima_pk 不是param,是mysql 变量。

下面的插入函数

public bool insert(string query)
{
    this.conectar();

    cmd = new MySqlCommand(query, this.conexion);

    cmd.ExecuteReader();
    //bool retornar = cmd.ExecuteNonQuery() >= 1 ? true : false;
    bool retornar = true;
    this.desconectar();

    return retornar;
}

连接正常。

任何建议如何在 C# 的查询中传递@ultima_pk?

【问题讨论】:

  • 这里的 insert() 方法将迫使您编写极易受到 sql 注入攻击的代码,因为它缺少一种接受与查询字符串分开的参数数据的机制。
  • 你还有什么建议推荐给我的?
  • 查看我的答案以了解如何操作。
  • 谢谢大家。我在这里找到了答案.. stackoverflow.com/questions/21795565/… 将 AllowUserVariables=True 添加到连接字符串

标签: c# mysql sql tsql sqlcommand


【解决方案1】:

你需要声明它,然后你不需要选择它:

DECLARE @ultima_pk int;
INSERT INTO cliente (column1, column2) VALUES (value1, value2);
set @ultima_pk =  LAST_INSERT_ID();
INSERT INTO cliente_ref (refCol1, refCol2) VALUES (refvalue1, @ultima_pk);
INSERT INTO cliente_ref (refCol1, refCol2) VALUES (refvalue1, @ultima_pk);

这样称呼它:

public bool insert_cliente(string value1, string value2, string refvalue, string refvalue2)
{
    string query = @"
    DECLARE @ultima_pk int;
    INSERT INTO cliente (column1, column2) VALUES (@value1, @value2);
    set @ultima_pk =  LAST_INSERT_ID();
    INSERT INTO cliente_ref (refCol1, refCol2) VALUES (@refvalue1, @ultima_pk);
    INSERT INTO cliente_ref (refCol1, refCol2) VALUES (@refvalue2, @ultima_pk);";

    cmd = new MySqlCommand(query, this.conexion);

    //I had to guess at parameter types/lengths. Use the actual column definitions from your database for this
    cmd.Parameters.Add("@value1", MySqlDbType.VarChar, 50).Value = value1;
    cmd.Parameters.Add("@value2", MySqlDbType.VarChar, 50).Value = value2;
    cmd.Parameters.Add("@refvalue", MySqlDbType.VarChar, 50).Value = refvalue;
    cmd.Parameters.Add("@refvalue2", MySqlDbType.VarChar, 50).Value = refvalue2;

    try 
    { 
        this.conectar();
        return (cmd.ExecuteNonQuery() >= 1);
    }
    finally
    {
        this.desconectar();
    } 
}

【讨论】:

  • 对于 mysql DECLARE @ultima_pk int;这是无效的。你只需要使用 set @ultima_pk = LAST_INSERT_ID();根据参考手册。我在帖子中显示的 sql 代码已用 mysql(C# 外)进行了测试,并且运行良好。这里的问题是 C#。
  • 您这么说,但错误消息告诉您@ultima_pk 变量未定义。让我们尝试定义它。
  • 我证明了你的建议,但我得到了同样的错误{“必须定义参数'@ultima_pk'。”}。这对我来说没有意义,在 mysql 中工作而不是在 C# 中工作。
猜你喜欢
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 2021-11-14
相关资源
最近更新 更多