使用c#中的MySQL命令动态创建表

时间:2015-10-15 17:17:44

标签: c# mysql

我想动态创建表并用随机数填充它,但是当执行代码时,MySQL会抛出有关语法的错误。

 for (int i = 0; i < 100; i++)
        {
            //gameSession is int, i tried use Parameters.AddWithValue but still have same problem.
            MySqlCommand dice = new MySqlCommand("INSERT INTO "+gameSession.ToString()+" (Dice1,Dice2) Values (@dice1,@dice2)", myConnection);


            Random dice1 = new Random();
            dice.Parameters.AddWithValue("@dice1", dice1.Next(1, 7));
            Random dice2 = new Random();
            dice.Parameters.AddWithValue("@dice2", dice2.Next(1, 7));
            if (myConnection.State == ConnectionState.Closed)
            {
                myConnection.Open();
            }
            dice.ExecuteNonQuery();
        }
  

您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在INSERT INTO'7571877附近使用正确的语法......

2 个答案:

答案 0 :(得分:2)

语法错误的一个主要原因是该表未引用。查看MySQL manual for identifiers(包括表名)。

就像您在默认情况下无法使用数字来表示变量一样,您无法在不转义标识符的情况下对表执行相同的操作。为您提供的几个解决方案是在表名前加上一个字母或使用单个表。

回答标题中的问题:

如果使用&#34; IF NOT EXISTS&#34;它不存在create a table。条款。 SQL看起来像这样:

CREATE TABLE table_name IF NOT EXISTS (
    dice1 INTEGER,
    dice2 INTEGER
);

如果您坚持沿着这条路线前进,则应使用标准前缀字母创建表名:

"s" + gameSession.ToString()
  

请注意,为每个会话设置一个单独的表会使数据库维护需求变得复杂,特别是对于处理被放弃的会话。删除单个表中的行要比查找所有被放弃的表容易得多。

另一个严重问题与数据库安全性有关。在针对数据库构建应用程序时,最好只向用户授予插入和更新权限,而不是授予他们创建和删除数据库中任何表的能力。由于表名是动态创建的,因此您无法轻松地维护每个表的权限。如果这是面向网络的,那么你将面临一些严重的责任,但收益甚微。

满足需求:

更好的设计是创建一个具有会话ID的单个表。否则,您将拥有任意数量的表,每个表都有一个记录。您可以像这样创建一次表:

CREATE TABLE DiceRolls IF NOT EXISTS (
    session INTEGER,
    dice1 INTEGER,
    dice2 INTEGER
);

您的插入只需稍微更改一下:

 for (int i = 0; i < 100; i++)
    {
        //gameSession is int, i tried use Parameters.AddWithValue but still have same problem.
        MySqlCommand dice = new MySqlCommand("INSERT INTO DiceRolls (Session, Dice1,Dice2) Values (@session,@dice1,@dice2)", myConnection);

        dice.Parameters.AddWithValue("@session", gameSession);
        Random dice1 = new Random();
        dice.Parameters.AddWithValue("@dice1", dice1.Next(1, 7));
        Random dice2 = new Random();
        dice.Parameters.AddWithValue("@dice2", dice2.Next(1, 7));
        if (myConnection.State == ConnectionState.Closed)
        {
            myConnection.Open();
        }
        dice.ExecuteNonQuery();
    }

这使得清理工作变得更加容易,因为您可以批量处理删除当前会话中不存在的所有内容。

答案 1 :(得分:0)

问题出在表名上。确保表名正确,然后使用此功能:

void InsertDiece(string connectionString, string tableName, int count)
{
    var commandText = String.Format("INSERT INTO `{0}` (Dice1, Dice2) Values (@dice1, @dice2)", tableName);
    var random = new Random(DateTime.Now.Milliseconds);
    using(var connection = new MySqlConnection(connectionString))
    using(var command = connection.CreateCommand())
    {
        connection.Open();
        command.CommandText = commandText;
        for(int i = 0; i < count; i++)
        {
            command.Parameters.AddWithValue("@dice1", random.Next(1, 7));
            command.Parameters.AddWithValue("@dice2", random.Next(1, 7));
            command.ExecuteNonQuery();
            command.Parameters.Clear();
        }
    }
}