我想动态创建表并用随机数填充它,但是当执行代码时,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附近使用正确的语法......
答案 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();
}
}
}