我在我的项目中安装了 MySql.Data NuGet 包 并尝试使用 ExecuteNonQuery 创建表。
using (MySqlConnection con = new MySqlConnection(connectionString))
{
con.Open();
MySqlCommand sqlCommand = new MySqlCommand();
sqlCommand.Connection = con;
string cmd = @"CREATE TABLE [TABLENAME] (
TIMESTAMP VARCHAR(30) NOT NULL,
TAGNAME NVARCHAR(250) NOT NULL,
MESSAGE NVARCHAR(1000) NOT NULL,
LIMITTYPE NVARCHAR(100) NOT NULL,
CLASSNAME NVARCHAR(100) NOT NULL,
STATE NVARCHAR(20) NOT NULL,
PRIMARY KEY (TIMESTAMP, TAGNAME),
KEY IDX_[TABLENAME] (TIMESTAMP, TAGNAME)
) ENGINE=InnoDB DEFAULT CHARSET=utf8";
sqlCommand.CommandText = cmd.Replace("[TABLENAME]", tableName);
sqlCommand.ExecuteNonQuery();
}
你可以看到上面的代码。 但是,当我执行该命令时,它会从
sqlCommand.ExecuteNonQuery();
抛出 NullReferenceException。
而且,当我进入 MySql 工作台时,我可以发现该表已创建,但也有一行包含所有空值,这是不允许的。 像这样:
为什么会发生这种情况,我该如何阻止它?
我从工作台本身执行查询,并且没有插入行。 我只想创建一个表而不插入一行。
编辑
at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)
at MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int64& insertedId)
at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
at MySql.Data.MySqlClient.MySqlDataReader.Close()
at MySql.Data.MySqlClient.MySqlDataReader.Dispose(Boolean disposing)
at MySql.Data.MySqlClient.MySqlDataReader.Dispose()
at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
这是堆栈跟踪。
好的...我找到了解决方法。
我认为的原因是
NVARCHAR
并且
ENGINE=InnoDB DEFAULT CHARSET=utf8
部分。
我将
NVARCHAR
替换为 VARCHAR
并删除了 ENGINE=InnoDB DEFAULT CHARSET=utf8
。
现在它不会抛出
NullReferenceException
。我认为这是因为MySQL版本的差异。
我之前用的是5.7,升级到8.0了。
不知道确切原因,但希望这个答案可以帮助像我这样的人。 感谢所有评论的人。