我试图使用一个准备好的语句,而
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应该只包含参数所在的问号,并且需要按照该顺序添加参数对象.