A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 卢京 中级黑马   /  2012-9-28 13:19  /  3217 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


选择省时报异常

可是我明明传了参数啊!!!

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

13 个回复

倒序浏览
首先要确定sql语句含有@proid
回复 使用道具 举报
许庭洲 发表于 2012-9-28 13:49
首先要确定sql语句含有@proid

有的啊                          
回复 使用道具 举报
问题在 DBHelper 中,发来瞧瞧
回复 使用道具 举报
李阳_TickTock 发表于 2012-9-28 20:22
问题在 DBHelper 中,发来瞧瞧

  public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] param)
        {
            SqlConnection conn = new SqlConnection(connString);

            SqlCommand cmd = new SqlCommand(sql, conn);

            if (param != null && param.Length > 0)
            {
                cmd.Parameters.AddRange(param);
            }
            conn.Open();
            SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            return dr;
        }

        public static SqlDataReader ExecuteReader(string sql)
        {
            return ExecuteReader(sql, null);
        }
回复 使用道具 举报
卢京 发表于 2012-9-28 22:18
public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] param)
        {
    ...

加参数的方法好像错了,没用过这个方法,待会查查

改成这样试试
  1. if (param.Length > 0)
  2.             {
  3.                 for(int i = 0;i<param.length;i++){
  4. //cmd.Parameters.AddRange(param);
  5. cmd.Parameters.add(param[i]);
  6. }

  7. }
复制代码
回复 使用道具 举报
卢京 中级黑马 2012-9-28 22:57:41
7#
李阳_TickTock 发表于 2012-9-28 22:33
加参数的方法好像错了,没用过这个方法,待会查查

改成这样试试

还是不行,相同的报错原因
回复 使用道具 举报
public static int ExecuteCommand(string sql, params SqlParameter[] p)
        {
            SqlCommand cmd = new SqlCommand(sql, Connection);
            cmd.Parameters.AddRange(p);
            return cmd.ExecuteNonQuery();
        }

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
卢京 中级黑马 2012-9-29 08:57:33
9#
晋志强 发表于 2012-9-29 00:03
public static int ExecuteCommand(string sql, params SqlParameter[] p)
        {
            SqlComm ...

这个不对吧,我要读出一行数据,你返回ExecuteNonQuery,返回的受影响的行数
回复 使用道具 举报
李阳_TickTock 发表于 2012-9-28 22:33
加参数的方法好像错了,没用过这个方法,待会查查

改成这样试试

我昨天改了一下,首先原因出在cboProvince.SelectValue返回的是object类型,而PronviceId要的是int类型,但是我把object转换成int类型,还是不行,最后我吧SelectedValue转换成SelectedIndex就可以了,但是SelectedIndex返回的是索引,刚好主键连续,SelectValue和SelectedIndex相同,要是主键不连续,就出问题了,不知道还要怎么解决
回复 使用道具 举报
本帖最后由 李阳_TickTock 于 2012-9-29 09:23 编辑
卢京 发表于 2012-9-29 09:03
我昨天改了一下,首先原因出在cboProvince.SelectValue返回的是object类型,而PronviceId要的是int类型, ...

老师一再强调过,主键不能有意义,所以这种做法其实也是错的

既然找到问题原因,那既然SelectedIndex可以传一个整形进去,SelectedValue转成整形一定也可以传进去。

说到这我好像想起来了,这个项目我也做过,那个ComboBox有两个值,一个是items,一个是value,一个item对应一个value,你在初始化的时候,应该把省的名字赋给item,然后把省的id赋给value。这样取值的时候,就可以通过value取出省的id,不知道你是不是这么做的?

我是这么赋值的
  1. //获取并设置省
  2.             string sql = null;
  3.             DataSet ds = null;
  4.             sql = "select id,ShengName from T_Sheng";
  5.             ds = ConnectSQLServer(sql);
  6.             cmbSheng.DataSource = ds.Tables[0];
  7.             cmbSheng.DisplayMember = "ShengName";
  8.             cmbSheng.ValueMember = "id";
复制代码
之后获取省的ID,在数据库中搜索对应的市并赋值
  1. /// <summary>
  2.         /// 获取并设置市和区号
  3.         /// </summary>
  4.         void showShi() {
  5.             string sql = null;
  6.             DataSet ds = null;
  7.             sql = "select Id,ShiName,QuHao from T_Shi where ShengID =" + cmbSheng.SelectedValue;
  8.             ds = ConnectSQLServer(sql);
  9.             cmbShi.DataSource = ds.Tables[0];
  10.             cmbShi.DisplayMember = "ShiName";
  11.             cmbShi.ValueMember = "id";
复制代码
当然,我没有用那种传参数的方法防注入,那时候做这项目的时候也没注意这点。但是我觉得既然selectedIndex可以传整形进去,只要selectedValue搜出来的真的是个整形,那么把它转成整形传进去也应该没有问题,你可以设断点看一下,selectedValue里面返回的值到底是什么。

说错了不是selected,搞成HTML了,是ComboBox控件,就是你的cbo什么什么,我命名不规范,写成cmb了呵呵


刚看了你的代码,你好像也跟我一样是这么赋值的,我待会也转成参数瞧瞧,可能哪个环节出错了
回复 使用道具 举报
本帖最后由 卢京 于 2012-9-29 10:40 编辑
李阳_TickTock 发表于 2012-9-29 09:15
老师一再强调过,主键不能有意义,所以这种做法其实也是错的

既然找到问题原因,那既然SelectedIndex可以 ...


我就是这么做的,而且我用了两种方法在做这个省市县三级联动,当然最简单的就是和你写的一样,用DataSet,这个我做出来了,没什么问题。后来我想,DataSet不是要把数据库里的数据全部取出来放到DataSet上,要是数据多,打个比方,如果要做 州——国家——省——市——县——镇——乡 的多级联动(当然有点夸张)就最好用SqlCommand的ExecuteReader方法做,不用把数据全部取出来了,但是就出现了我上面的这个问题
回复 使用道具 举报
卢京 发表于 2012-9-29 10:39
我就是这么做的,而且我用了两种方法在做这个省市县三级联动,当然最简单的就是和你写的一样,用DataSet ...

概念错了:L

连接数据库远比全部取出来耗费资源的多,不然dataSet也没有存在的意义了

要追求尽可能少的读取数据库,因为当连上互联网的时候,网速是未知的,每获取一个数据就读一次数据库,而且还不是长连接,每次都要打开关闭连接,用户很快就崩溃了。
回复 使用道具 举报
李阳_TickTock 发表于 2012-9-29 10:53
概念错了

连接数据库远比全部取出来耗费资源的多,不然dataSet也没有存在的意义了

哈哈,既然做了,就把它做对吧,就当是一次练习SqlDataReader也行,现在我还不知道错哪呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马