小弟尝试在OleDB下连接MySQL,按照网上的提示,去装了一个Oledb的驱动,MyOLEDB3,是从mysql.com下载的,然后问题也来了,查询正常,但是删改都出错,我将代码最简化,如下            OleDbConnection con = new OleDbConnection("Provider=MySqlProv.3.0;Server=localhost;User ID=root;Data Source=test;");
            con.Open();
            string cmdText = "Delete From Test Where Id = ? ";
            OleDbCommand command = new OleDbCommand(cmdText, con);
            command.Parameters.Add("@Id", OleDbType.Integer).Value = 15;
            command.ExecuteNonQuery();最后在command.ExecuteNonQuery();这一句报错,错误信息:“MySqlProv.3.0”失败,没有可用的错误消息,结果代码: E_ABORT(0x80004004)。很奇怪,不知道为什么,同样的代码在SQL下面不会有问题,也很惊讶为什么添加没有出错,后来发现,添加只有一个varchar的传值,Id是自增的,所以不会出错,于是我尝试在 command.Parameters.Add("@Id", OleDbType.Integer).Value = 15 中将OleDbType.Integer改为OleDbType.Varchar,居然通过了,功能也实现了,但是我的Id确实是Int型的呀,这怎么会通过呢?
太奇怪了不死心,于是我写死 string cmdText = "Delete From Test Where Id = 15 "; 不传参,正确,没有问题,然后,我改成 int i = 15;
                   string cmdText = "Delete From Test Where Id = " + i ; 也正确
那好,现在问题锁定在 command.Parameters.Add("@Id", OleDbType.Integer).Value = 15; 这一句上了,难道MySQL的传参有特殊的写法?同样的写法在SQL下面没有任何问题呀。

解决方案 »

  1.   

    是不是整数位数不一致呢,MySql不是32位的整数?
      

  2.   

    我查了一下MySql的INT类型和C#的是一样的,都是范围都是-2,147,483,648 到 2,147,483,647是不是楼和在MySql里使用的不是Int类型呢?
      

  3.   

    我也碰到过呀,很奇怪为什么mysql里面int可以定义长度,我试了一下楼主的方法,和我原来的差不多,我原来将mysql里面int定义为4,然后试过 command.Parameters.Add("@Id", OleDbType.Integer,4,"Id").Value = 15; 也没有任何作用,当年就没找到解决的办法
      

  4.   

    据说mysql的要写成 command.Parameters.Add("?Id", OleDbType.Integer,4,"Id").Value = 15; //用?而不是 @ 
    但是我试过,也不行,不知道有没有即懂mysql又懂C#的大哥呀
      

  5.   

    datetime也有问题:(
    不知道应该如何正确写
      

  6.   

    我怀疑除了和string相对应的类型,比如varchar,正常以外,其他的都会有问题的,比如bool,还有楼主说的date
      

  7.   

    string cmdText = "Delete From Test Where Id = ? ";应该是string cmdText = "Delete From Test Where Id = ?id ";
    吧~
      

  8.   

    不是,我都试过,sql本身是没有问题的,有问题的就是那个 Parameters
      

  9.   

    恩,看到老外有这种写法
                OleDbParameter p = new OleDbParameter();
                p.Value = 14;
                p.DbType = DbType.Int32;
                p.Direction = ParameterDirection.Input;
    但是试了一下,好像也不行,不知道是不是mysql版本的问题
      

  10.   

    按下面的地址下载一个MySql的驱动:ADO.NET Driver for MySQL (Connector/NET)
    http://www.mysql.com/products/connector/
    挺好用的。
      

  11.   

    恩,谢谢hbxtlhx了,这个驱动我试过了,就不是OLEDB的了,是用了一个专门的借口MySqlClient,类似SqlClient