列“proId”不属于表 Table。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 程序是VS2005做的,运行一段时间 ,经常出现 列“”不属于"Table”,并且所有的用户均访问不了系统,但过一段时间又好了 .各位大哥帮忙,是什么原因啊,  
但是上述错误是间断性的出现啊,有时候是好好的,好像突然一瞬间就有那个错误了,而且出错后每个与数据库打交道的页面都有了这种错误。重启系统后又正常了、重启SQL服务也正常了。!!帮帮忙异常详细信息: System.ArgumentException: 列“proId”不属于表 Table。
以下是我连库业务类大家看看有没有问题!
 public static UserLogin GetUserByUnameAndPwd(string username,string pwd)
        {
            //string sql = "select * from UserLogin where UserName=@username and Password=@password";
           
                string ConnectionStringLocalTransaction = ConfigurationManager.ConnectionStrings["soo56"].ConnectionString;//读取配置文件中的连接字符
                SqlConnection can = new SqlConnection(ConnectionStringLocalTransaction);//创建连接
                can.Open();//打开连接                SqlParameter[] parm ={ 
                            new SqlParameter("@username", SqlDbType.VarChar,50),
                            new SqlParameter("@password", SqlDbType.VarChar,50)
                             };
                parm[0].Value = username;
                parm[1].Value = pwd;
                DataSet ds = SqlHelper.ExecuteDataset(can, CommandType.StoredProcedure, "Sp_GUser", parm);//设置参数并用存储过程Sp_GUser查询数据库
                can.Close();//关闭连接
                can.Dispose();//释放连接                List<UserLogin> list = new List<UserLogin>();                if (ds.Tables.Count > 0)
                {
                    try
                    {
                       
                        DataTable table = ds.Tables[0];                        foreach (DataRow row in table.Rows)
                        {
                            UserLogin userLogin = new UserLogin();                            userLogin.UserId = (int)row["UserId"];
                            userLogin.UserName = (string)row["UserName"];
                            userLogin.Password = (string)row["Password"];
                            userLogin.RightId = (int)row["RightId"];
                            userLogin.Mark1 = (string)row["1"];
                            userLogin.Mark2 = (string)row["2"];
                            userLogin.Mark3 = (string)row["3"];
                            userLogin.Mark4 = (string)row["4"];                            list.Add(userLogin);
                        }
                        IList<UserLogin> users = list;
                        if (users.Count > 0)
                        {
                            return users[0];
                        }
                        else
                        {
                            return null;
                        }
                    }
                    catch (Exception e)
                    {
                        if (ds.Tables[0].Rows[0][0] == null)
                        {
                            throw new Exception("Id为空"); 
                        }
                        throw e.Message.ToString();
                        
                    }
                }        }

解决方案 »

  1.   

    异常的特点: 
    一:最大的特点是随机性。会突然报错,说不定是什么时候,有可能是你下一个点击,或者刷新一下页面之后,总之就是出现在数据库有联系的地方(查询,绑定数据控件时)。 
    二:报错的多样性。一报错后,千奇百怪的错误也就喷井式爆发,如“列不属于表”,“找不到表0”,“数据转换不成功”等,各种各样都有,但都是与数据库的数据有关。 
    三:持续时间比较短。很多页面报错后,刷新几次,或者是等一阵,又正常了,又可以使用了,但可能下一个点击,刷新,就又报错了 
    四:越多人使用,网络情况越差,就越频繁。我的系统在公司内部几个开发人员测试没有问题,但上线后,客户公司很多人用,就不断有这个错。而且,有几天网络比较好,就没有发生这错,我以为换了dbhelper已经搞掂了,但这几天又继续报错。 1、法名: getList 异常信息: 列“productId”不属于表 Table
    lz我公司的网站不知道出现了多少次了,我以前也发过这样的帖子,不过那个时候我解决了
    原因是全局变量的问题,因为我的sql是拼接的,而在一些方法中设置了那个全局变量的值,
    然后第二次再调用其他方法,因为字段被设置过,所以错了,最后我把那个全局变量全部改成局部变量
    就不会错了。NND,过一段时间又出现这样的问题,以为还是那个全局变量的问题,但是整个项目都没有全局变量了
    现在还没有解决这个问题,但从我的日志记录来看,1、我的项目的数据层都有记录异常日志,在页面Global.aspx里也有记录异常日志。而且数据层都是记录日志后抛出的,所以正常情况数据层出现错误的话
    那么就会有2个日志记录,一个是数据层的,该日志有记录参数的值,另一个是页面的,该日志直接记录异常信息,但是每次都只有页面的日志,所以怀疑与数据绑定有关 2、SqlConnection 不要用全局或静态或单例模式 , 否则会出现不同进程进下共用connection的情况 , 特别是在web环境下 , 这将导致使用者获取的dataset不正确 , 从而引发上面我提出的问题 , 解决的方法是在需要做数据连接的地方new connection来使用 , 用后close , 这样就可以避免出现类似于 “xxxxx不属于表 Table ”等一系列的问题了 3、这个问题可能是由于并发的时候取的数据出了问题,很难找出问题,所以, 
    最后在这个经常容易出错的地方,加上try catch,然后在catch中加日志,把这个表的所有字段列出来,看到底是什么东西.  4、到数据库里看看日志,出错就会影响应用池,要重新启动 
    是否是并发操作问题 5、呵呵,应该是并发问题导致数据超时 
    你可以将数据库的连接池放大一些。 6、建议LZ将上线的东西加上一个日志,因为上线的东西有时错误是很难跟踪的,那你看到的问题又不全面。。 
    之前因为上线后网站出现问题,老大要原因,我说我也不知道,后来他才让我加日志跟踪。 
    这样以后出现问题都可以有据可查。我现在使用的是log4net  7、先确定下,你报的这些错不属于连接超时所带来的问题。这些问题归根结底的原因还是在与你代码的问题。 
    1.加日志记录记录SQL语句和连接字符串 
    2.查是否有垃圾数据 
    3.检查代码。(数据库连接,你的DBHELPER,查询语句)8、
    数据库ADO.NET的连接操作不正确,我也遇到了这样的问题,原来的DBHelp类中用的是静态的一个Connection对象,现在不采用静态的,在使用时全部重新创建对象,问题解决。 
    代码如下: 
      public static int ExecuteCommand(string safeSql) 
            { 
                using (SqlConnection Connection = new SqlConnection(connectionString)) 
                {                 SqlCommand cmd = new SqlCommand(safeSql, Connection); 
                    int result = cmd.ExecuteNonQuery(); 
                    Connection.Close(); 
                    return result; 
                } 
            }
      

  2.   

    会不会是你的Sp_GUser这个存储过程里面的字段名写错了,检查下。数据库里测试下...
      

  3.   

    本帖最后由 net_lover 于 2010-09-03 14:47:15 编辑
      

  4.   

    我没遇到过,遇到也是我SQL语句问题!
      

  5.   

    出现问题刷新一下就好了。不知道是不是static 的原因,我试试先!
      

  6.   

    列“proId”不属于表 Table。------------------------我想问你下,你的 table中有 proid 这个字段吗???从你的这个userLogin.UserId = (int)row["UserId"];
      userLogin.UserName = (string)row["UserName"];
      userLogin.Password = (string)row["Password"];
      userLogin.RightId = (int)row["RightId"];
      userLogin.Mark1 = (string)row["1"];
      userLogin.Mark2 = (string)row["2"];
      userLogin.Mark3 = (string)row["3"];
      userLogin.Mark4 = (string)row["4"];我就找不到这个  proid 啊!!!---------------------------------------你是不是在 某个页面做了个什么查询,然后查询中有这个 proid字段,数据库中没有。或者你的 datatable 中要得到  dt.rows[i]["proid"].tostring() 时, 存储过程中并没有查询proid这个字段。------------------多测试几次 就出来。
      

  7.   

    ds.Tables[0].Rows[0][0] == null最好把 Rows[0][0]的第二个"[0]"换成 列名而不用索引 用索引的话有时会出现莫名其妙的错
      

  8.   

    一般是SqlHelper写的代码不过关,
    如果把所有的static去掉,并且缓存没冲突或者不用缓存,保证不会有问题。使用 static ,一定要仔细
      

  9.   

    这个该是表不对,才会找不到列的。
    DataTable table = ds.Tables[0]像这种你改成
    DataTable table = ds.Tables[“表名”]
    试试看会有会出问题