Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C Mysql将行移动到另一个表并获取单元格的最大值_C#_Mysql_Row_Move - Fatal编程技术网

C# C Mysql将行移动到另一个表并获取单元格的最大值

C# C Mysql将行移动到另一个表并获取单元格的最大值,c#,mysql,row,move,C#,Mysql,Row,Move,我有一个方法可以将一行从一个表移动到另一个表。这本身就行。我现在要做的是在表回调中选择单元格的最大值。这就是我尝试过的: public static void MoveLead(RadGridView Gridview, RadDropDownList SegmentDropdown, string UniqueID) { try { string Table = SegmentDropdown.Text; using (MySqlConnecti

我有一个方法可以将一行从一个表移动到另一个表。这本身就行。我现在要做的是在表回调中选择单元格的最大值。这就是我尝试过的:

public static void MoveLead(RadGridView Gridview, RadDropDownList SegmentDropdown, string UniqueID)
{
    try
    {
        string Table = SegmentDropdown.Text;
        using (MySqlConnection cn = new MySqlConnection(Varribles.ConString))
        {
            string query = "BEGIN;  select max(UniqueID) from Callbacks;     INSERT INTO Callbacks select * from " + Table + " where UniqueID = " + UniqueID + "; DELETE FROM " + Table + " where UniqueID = " + UniqueID + "; COMMIT;";
            cn.Open();
            using (MySqlCommand cmd = new MySqlCommand(query, cn))
            {
                cmd.CommandText = query;
                cmd.ExecuteNonQuery();

                Console.WriteLine("query" + Convert.ToInt32(cmd.ExecuteScalar()));
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}

提前感谢

您正在使用ExecuteOnQuery和ExecuteReader执行两次命令。
只需删除cmd.ExecuteNonQuery,您就完成了。

您是否尝试过稍微更改代码

public static void MoveLead(RadGridView Gridview, RadDropDownList SegmentDropdown, string UniqueID)
{
    try
    {
        string Table = SegmentDropdown.Text;
        using (MySqlConnection cn = new MySqlConnection(Varribles.ConString))
        {
            cn.Open();

            string query = "select max(UniqueID) from Callbacks;";
            using (MySqlCommand cmd = new MySqlCommand(query, cn))
            {
                // Notice I removed the command text, you are already setting the command text in the constructor for the MySqlCommand
                int UID = Int32.Parse(cmd.ExecuteScalar());

                Console.WriteLine("query" + UID);
            }

            query = "BEGIN;  INSERT INTO Callbacks select * from " + Table + " where UniqueID = ?UniqueID; DELETE FROM " + Table + " where UniqueID = ?UniqueID; COMMIT;";
            using (MySqlCommand cmd = new MySqlCommand(query, cn))
            {
                // Use parameters to sanitize input. There are very rare circumstances where you would want to do a direct concatenation to a query as its susceptible to sql injection
                cmd.Parameters.Add(new MySqlParameter("UniqueID", UniqueID))
                cmd.ExecuteNonQuery();
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}
另外,我强烈建议您阅读SQL注入。构建查询的方式很可怕,这取决于表和UniqueID来自何处。如果表变量无法参数化,则需要特别注意从何处填充该值。
检查&

我忘了提到我从这一行获得的值:Console.WriteLinequey+Convert.ToInt32cmd.ExecuteScalar;witch始终是9这是一种问题您应该真正开始研究如何避免Sql注入我知道如何使用参数化查询,但这不是主题从何处获取变量UniqueID的值gridview包含一个名为UniqueID的列,在提交更改时,witch是唯一的id等。。因此,当当前行更改时,它将检查该行上的唯一idrow@Taco2,很难说UniqueID是如何在数据库中生成的,但请记住,您调用的是Sql命令并将值插入回调中两次—第一次是使用ExecuteOnQuery,第二次在ExecuteScalar上调用相同的查询。您能从插入记录的位置检查表吗?由于UniqueId不是自动递增的,所以对于插入行的表来说,似乎9只是一个最大值。如果是这样,您将始终从回调表中收到9作为max UniqueId。UniqueId实际上与此问题无关,它与我试图实现的目标无关,我只想在表回调中选择最高值,但需要在与上面相同的查询中完成,完全忽略。我在工作中休息一下,回复这个lol。我更正了帖子。是的,现在它更正确了,至少对于表参数,我只是在MySql中的表名backticks周围添加转义字符