日期:2014-05-18  浏览次数:20904 次

使用DataClassesDataContext连接远程数据库问题
使用DataClassesDataContext连接本地数据库时:
C# code

public static DataClassesDataContext dataContext = new DataClassesDataContext();

        private IQueryable<showAuction> getAuctionsInfo(int dayOfWeek, int pageNo, int pageSize, DataClassesDataContext dataContext)
        {
            IQueryable<showAuction> query = from auction in dataContext.showAuctions
                        where auction.DayOfWeek == dayOfWeek
                        select auction;
            foreach(showAuction s in query){
                MessageBox.Show(s.ID+"");
            }
            return query;
        }


 foreach循环正确,没异常。但是

使用DataClassesDataContext连接远程数据库时:
C# code

public static DataClassesDataContext dataContext = new DataClassesDataContext("uid=****;pwd=****;Server=****,****;Database=****");


方法和上面的一样,但是在foreach循环中出现以下异常:
在从服务器接收结果是发生传输级错误。(provider:TCP provider,error:0-指定网络名不再可用)

经调试,发现query中的connection的state是closed状态。但是连接本地时state的状态是open,

为什么会这样哦?

------解决方案--------------------
你先看一下你的远程连接是否真的能连接上。
------解决方案--------------------
基于Linq的迟延执行特性,数据库的查询命令是你的foreach开始迭代时才被生成和执行的。
------解决方案--------------------
探讨
嗯,使用本地的是能连接上的,foreach里面也能正确执行,我调试过了
但是使用远程的就不行,

------解决方案--------------------
你再检查一下服务器的1433端口有无开放,包括防火墙的设置等。

建议你使用SQL Server Management Studio连接你的远程SQL Server服务器试试,有时能连接但会在登录时提示你这样的错误。

之前我们也遇到过同样的问题,Connection.Open()没有问题,但是一执行SQL查询就提示错误。后来就是发现防火墙设置里没有开放SQL Server默认的1433端口。
------解决方案--------------------
1. 比较其他程序的连接串和连接方式
2. 再仔细排查SQL Server服务器的设置

具体问题得你自己解决了,呵呵。祝好运