【问题标题】:Object fails to instantiate on Win7 x64对象无法在 Win7 x64 上实例化
【发布时间】:2012-01-10 19:33:27
【问题描述】:

我搜索了很多,没有找到任何有用的东西,所以我在这里。

我用 C#(任何 CPU 设置)编写了一个应用程序,该应用程序已经在 Windows 7 和 XP x86 上运行了一段时间,没有出现错误。

最近我的办公室已将我的工作站升级到 Windows 7 x64(从 x86)。

当我在 Visual Studio 2010 中运行我的应用程序时,我在运行或编译时没有收到任何错误。它按设计工作。

我的 VS2010 版本是我们 MSDN 订阅的 10.0.30319.1 RTMRel,框架是 4.0.30319 RTMRel

当我直接运行已编译的应用程序时,我在使用 SqlConnection 对象时收到错误消息。无论我选择任何 CPU 还是 x86 都会发生相同的错误。

在我的类文件中,这是例程:

        public static SqlConnection getDBConnection()
    {
        SqlConnection sqlConn = null;
        try
        {
            sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["KpH2Oprod"].ConnectionString);
            sqlConn.Open();
        }
        catch
        {
            throw;
        }
        finally
        {
            if (sqlConn == null)
            {
                sqlConn.Dispose();
            }
        }

        return sqlConn;
    }

一些手动跟踪我发现错误不是在SqlConnection sqlConn = null; 第一次实例化时而是在我实际设置它时抛出的:

sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["KpH2Oprod"].ConnectionString);

我已将此行更改为:

 sqlConn = new SqlConnection();
 sqlConn.ConnectionString = ConfigurationManager.ConnectionStrings["KpH2Oprod"].ConnectionString;

查看它是 SqlConnection 还是配置管理器,它确实在 sqlConn = new SqlConnection(); 行上抛出。事实上,这是我开始的方式并将其更改为以前的方式,无论如何,在使用新指令时都会抛出错误。

我得到的实际错误消息是(其中一些是我自己的消息):

我相信这可能与 SQL 对象的注册方式有关,但消息在前几行的中心被截断(不是我做的),指向参数 g 为空。这再次完美地在调试器中工作。

RunTimeError : 
Value cannot be null.
Parameter name: g
at System.Guid..ctor(String g)
at kpH2O.frmMain..ctor() (mscorlib)

ACTION : 
UPDATEINCIDENT ()

PROGRESS : 
WORKING ()

RunTimeError : 
Object reference not set to an instance of an object.
at kpH2O.db.getDBConnection()
at kpH2O.db.getIncidentIDFromNumber(String incidentNumber)
at kpH2O.frmMain.updateHeatIncident() (kpH2O)

ERROR : 
Process UPDATEINCIDENT: FAILED (doStartUp)

这是一个开箱即用的 VS2010 安装,没有任何插件。非常感谢任何帮助。

【问题讨论】:

  • 有没有办法只捕获原始异常/堆栈跟踪?
  • 另外 - 拥有一个只包含 throw 语句的 catch 子句没有任何好处。
  • 这里的情况和你weblogs.asp.net/fmarguerie/archive/2004/08/13/214135.aspx的情况一样
  • @DJKRAZE:连接字符串无关紧要,因为他甚至在设置连接字符串属性之前就得到了异常。

标签: c# database x86 64-bit sqlconnection


【解决方案1】:

如何在您的 .config 文件中为初学者定义连接字符串..? 需要看到那么多

我也会考虑像这样定义你的 sqlConn

sqlConn = ConfigurationSettings.AppSettings["connectionString"]; //assuming this is what you named your connection string.. 

其次,我将使用 Try catch {} 以及将 using (){} 放在该 try 中

如果您不想处理该 sqlConn.. 则将其设为静态属性

公共静态 SQLConnection sqlConn = null;

然后,如果您需要使用它.. 如上所述使用 using() {} 中的新构造.. 如果您想使用原始构造 ConfigurationSetting and manager 枚举连接字符串变量,请查看此链接

【讨论】:

  • 抱歉延迟回复。这已成为一个非问题。我的电脑崩溃了......两次......技术人员用 Windows 7 32 位重新安装了它,应用程序再次正常工作。
  • 听起来不错,但我想知道您是否有 win7 64 位的更新问题我只有一个问题..在我的 wind 7 64 位上使用 VS2010 / 2008 敲木头,但安装了 vs 和的更新没有更多的问题..很遗憾听到你的电脑一直崩溃..
【解决方案2】:

为了验证功能,我会用这样的 sn-p 进行测试。您当前的代码在处置逻辑中存在缺陷,这只会使事情复杂化。

string connectionString = ConfigurationManager.ConnectionStrings["KpH2Oprod"].ConnectionString;

using( SqlConnection sc = new SqlConnection( connectionString ) )
{
    sc.Open();
    // perform simple data access
}

【讨论】:

  • 函数的重点是返回一个SqlConnection对象。返回已处置的对象将毫无用处!
  • Gabe 我认为你是在抢先一步。他们说的是他的代码的结构方式..根据他的代码最初编写的方式,他永远无法返回有效的 SQLConnection 对象..@Tim 在我看来可能是迄今为止最好的建议,也让我想知道他的 using 部分在标题中的样子是什么他使用 System.Data.SqlClient;
  • @Gabe - 没错,我是在指出 OP 当前的代码要么在 finally 块中抛出 NullReferenceException,要么(如果更新以修复空检查)将在调用者之前处理连接可以用。
  • @DJKRAZE:当不在调试器下时,OP 的代码 always 在 Win 7 x64 上返回一个有效对象 except(其中 SqlConnection 构造函数抛出异常)。修复异常处理的方法是删除它(因为目前它什么都不做)。提议的“修复”将使他的代码永远工作。
猜你喜欢
  • 2016-01-18
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
相关资源
最近更新 更多