加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:43:30 所属栏目:百科 来源:网络整理
导读:我试图使用一个准备好的语句,而 MySqlCommand执行得很好,执行时间是糟糕的.我把它的cmd.IsPrepared的结果写入控制台,确实是错误的.这里是我设置MySqlCommand的地方: MySqlCommand cmd = con.CreateCommand();cmd.CommandText = @"INSERT INTO dict (pre,dis
我试图使用一个准备好的语句,而 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应该只包含参数所在的问号,并且需要按照该顺序添加参数对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读