在数据库中我想删除一些数据,我调用的方法如下: public bool DeleteCustomer(string CustomerIDs)
        {
            string sql = "delete from Customer where CustomerID in (@CustomerIDs)";
            SQLiteParameter[] param = new SQLiteParameter[] { 
                new SQLiteParameter("@CustomerIDs",CustomerIDs )
            };
            return sqlhelp.execSql(sql, param);
        }调用到的方法如下: public bool execSql(string sql, SQLiteParameter[] param)
        {
            int i;
            cmd = new SQLiteCommand(sql, getCon());
            cmd.Parameters.AddRange(param);
            i = cmd.ExecuteNonQuery();
            closeCon();
            return (i > 0 ? true : false);
        }其中getCon是获取连接,  closeCon是关闭连接,我一路调试发现一个很诡异的问题,因为我的主键是用INT自增值,当我传入一个值,如ID值为"7"的时候就正常,数据库中数据能正常的删除,但是如果我传入的值是"7,8"的时候就操作失败,找了半天也没有找出是什么原因,当然上面的举例中并不包含两侧的引号,困挠了半天了,实在是找不出什么原因来,值一直都是正常的传的,但就是在 i = cmd.ExecuteNonQuery();这句的时候好返回的值是0,查看了cmd的一些相关东西,一切都是正常的,包含它的参数,请问一下各位遇到过这种问题吗,是不是我哪里写错了?

解决方案 »

  1.   

    string sql = "delete from Customer where CustomerID in ("+CustomerIDs+")";
      

  2.   

    command.CommandText = "delete test where CharIndex( ',' + Cast(fieldname As Varchar) + ',', ',' + @param + ',') > 0";
    SqlParameter param = new SqlParameter();   
    param.ParameterName = "@param";   
    param.Value = "1,2,3,4,5";
    command.Parameters.Add(param);  
      

  3.   

    一楼正解
    string sql = "delete from Customer where CustomerID in ("+CustomerIDs+")";sql语句的问题!
      

  4.   

    应该是ado.net在参数化查询时,对你输入的参数值进行了编码(就如同我们一般情况下防止sql注入那样),所以虽然你输入的值是“7,8”,但是没有构成你希望的sql语句如:delete from Customer where CustomerID in (7,8);
    如果一定要采用这种方式,就使用”人生如梦“的方法
      

  5.   

    忘记了说了,我用的是SQLITE,也是一样的吗?看来我试试,谢谢各位高手
      

  6.   

    new SQLiteParameter("@CustomerIDs",CustomerIDs )因为没有指定参数类型,自动转换发生的问题,你可以指定下参数类型。最好是采用2楼的方法,分开。
      

  7.   

    string sql = "delete from Customer where CustomerID in ("+CustomerIDs+")";
    此解正确
    如果直接封装参数
    如下:
    string sql = "delete from Customer where CustomerID in (‘7,8’)";
    这样的语句
      

  8.   


    看你的 where CustomerID in (@CustomerIDs)  ,这个参数就是一个常量。SQL根本不支持这类拼字符串语法。对于SQLite,需要首先使用 create temp table 创建临时表,其中只有一个常数字段,然后把数据分别 insert到临时表,然后用你的Customer表跟临时表进行inner join操作,来删除Customer。