我正在努力理解在 MySql bool 和 C# bool 之间转换的正确方法。
它对使用 MySql.Data v8.0 的代码没有帮助。21 不再适用于 v8.0。22.
在下面的代码中,为什么我(现在)需要将 MySqlDbType
指定为 Byte
? Bit
确实是 bool 值的更好表示吗?
为什么cmd.Parameters["success"].Value
的类型是ulong
或sbyte
?不应该是bool
吗?
[TestFixture]
public class MySqlTests
{
private const string connString = "server=localhost;database=mysql;user=root;password=";
[SetUp]
public void SetUp()
{
using var cnn = new MySqlConnection(connString);
cnn.Open();
var cmd = cnn.CreateCommand();
cmd.CommandText = @"
DROP PROCEDURE IF EXISTS Test;
CREATE PROCEDURE Test (OUT success BOOL)
BEGIN
SET success = true;
END
";
cmd.ExecuteNonQuery();
}
[TestCase(MySqlDbType.Bit, typeof(ulong))] // succeeds with MySql.Data v8.0.21, fails with v8.0.22
[TestCase(MySqlDbType.Byte, typeof(sbyte))]
public void Test(MySqlDbType mySqlDbType, Type expectedType)
{
using var cnn = new MySqlConnection(connString);
cnn.Open();
var cmd = cnn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "Test";
cmd.Parameters.Add(new MySqlParameter("success", mySqlDbType) {Direction = ParameterDirection.Output});
cmd.ExecuteNonQuery();
var success = cmd.Parameters["success"].Value;
Assert.AreEqual(expectedType, success.GetType(), "Unexpected Type");
}
}
如果重要的话,我正在运行 MySql:5.7
最佳答案
Mysql没有真正的 bool 数据类型,bool只是一个alias of tinyint 。 Tinyint 是 stored on 1 byte ,因此它映射到 C# 的 sbyte 数据类型。
为什么不同版本的mysql数据对这个映射的处理方式不同,我也说不出来,你需要问开发者。
关于c# - 在 MySql bool 和 C# bool 之间转换的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64491910/