c# – MySql语句准备“不粘”

前端之家收集整理的这篇文章主要介绍了c# – MySql语句准备“不粘”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图使用一个准备好的语句,而 MySqlCommand执行得很好,执行时间是糟糕的.我把它的cmd.IsPrepared的结果写入控制台,确实是错误的.这里是我设置MysqLCommand的地方:
MysqLCommand cmd = con.CreateCommand();
cmd.CommandText = @"INSERT INTO dict (pre,dist,dict.char,score) VALUES(@pre,@dist,@char,@score) ON DUPLICATE KEY UPDATE score = score + @score";
cmd.Parameters.Add("@pre",MysqLDbType.VarChar,32);
cmd.Parameters.Add("@dist",MysqLDbType.Int32);
cmd.Parameters.Add("@char",1);
cmd.Parameters.Add("@score",MysqLDbType.Double);
cmd.Prepare();

添加具有相同结果的参数之前,我也尝试执行Prepare().

然后我有一个循环的代码,做一些计算和设置变量,如下所示:

cmd.Parameters[3].Value = score;

…并没有任何其他的命令,直到它运行时间:

Console.WriteLine(cmd.IsPrepared);
cmd.ExecuteNonQuery();

控制台的结果总是错误的.这一切都是在一个基本的交易中完成的,但这似乎不应该使事情变得困扰.在我设置MysqLCommand之前,我打开事务.

任何想法,这是怎么回事?

编辑:我在java中复制了代码,并且准备好的语句工作正常.所以这不是我的数据库服务器本身的问题,它在.net中是一个特别的问题.当然,每个人都不会破坏.net /连接器,那么这可能是什么呢?

它绝对没有准备好,根本没有设置bool值,在.net中运行的时间在某些测试输入是如此之长我没有耐心等待它,但在java中相同的输入运行在〜3分钟.两者使用基本相同的代码.

这是一个简单的测试,我在.net中,所以你可以看到我正在尝试的完整代码(我从连接字符串中删除了UID和密码,但在正常的代码,他们在那里,建立一个连接,该语句将数据输入数据库):

using (MysqLConnection con = new MysqLConnection(@"SERVER=localhost;DATABASE=rb;UID=;PASSWORD=;"))
        {
            con.Open();

            using (MysqLCommand cmd = con.CreateCommand())
            {
                cmd.CommandText = @"INSERT INTO test (test.test) VALUES(?asdf)";
                cmd.Prepare(); //doesn't work

                cmd.Parameters.AddWithValue("?asdf",1);

                cmd.ExecuteNonQuery();
            }
        }

我在C#2010中使用MysqL.Data.dll版本6.4.4.0和v4.0.30319的运行时版本.我还包括上述示例代码MysqL.Data.MysqLClient.

解决方法

看起来你正在使用MysqLCommand对象,至少在第二个例子中.为了获得准备好的语句的好处,您不需要处理连接和命令对象.在设置CommandText之后还要设置任何参数之前,您还需要调用prepare.

https://dev.mysql.com/doc/connector-net/en/connector-net-programming-prepared-preparing.html

MysqL中的准备语句参数也没有命名,它们是根据顺序指定的. CommandText应该只包含参数所在的问号,并且需要按照该顺序添加参数对象.

猜你在找的C#相关文章