0

我有一个奇怪的问题,我似乎无法弄清楚。我为在服务器上运行的商业应用程序创建了一个 Web 组件。如果我更改cbxGramEnabled.CheckedTrueFalse函数运行正常并进行更改。但是,如果我离开该cbxGramEnabled.Checked功能不会更新数据库。

运行该组件的代码如下所示:

private void WriteToSQL( )
{
    WriteEnableGram( _pkKey, cbxGramEnabled.Checked);
}

cbxGramEnabled.CheckedCheckBox我的 Web 应用程序自定义组件上的一个。

private void WriteEnableGram( int nPKkey, bool bChecked)
{
    string szQuery = string.empty;

    if (bChecked == true)
        szQuery = "UPDATE dbo.CustomKeyAttr SET EnableGram = 1 WHERE pkCustomKeyAttr = " + nPKkey.ToString() + ";";
    else
        szQuery = "UPDATE dbo.CustomKeyAttr SET EnableGram = 0 WHERE pkCustomKeyAttr = " + nPKkey.ToString() + ";";


    try
    {
        string szConString = @"Data Source=.\sqlexpress;Initial Catalog=MetricDB;User ID=webuser;Password=mypass;"; 
        using (var Conn = new SqlConnection(szConString))
        {
            Conn.Open();
            using (SqlCommand dbQuery = new SqlCommand(szQuery, Conn))
            {
                dbQuery.ExecuteNonQuery();
            }
        }
    }
    catch (SqlException)
    {
    }
    catch (Exception)
    {
    }
    finally
    {
        cbxEnableGram.Text = szQuery; // at least display what the query is somewhere on the page....
    }
}
4

1 回答 1

0

首先,让我们假设以下情况为真:

布尔值可以是truefalsenull(未分配)。

复选框的checked属性可以具有这些值。我们也假设

如果在运行时在该行代码中cbxGramEnabled包含对实例的引用,则 的值永远不会是,除非在其框架实现中存在一些奇怪的错误。我假设这是一个 .NET 复选框?说明:仅当该对象的构造函数完成运行并将所有属性设置为不同于 的默认值时,引用才存在。Checkboxcheckednullnull

因为,如果checked属性的值是trueor false,代码将正常执行,正如您尝试使用文字 true/false 值所证明的那样,我们确信实际值为null。语句 2 证明cbxGramEnabled在您的代码中此时不包含对象引用。

本质上,变量cbxGramEnabled没有真正的价值,它包含一个null引用。原因是您的代码是在创建此复选框之前执行的。

通常在 Web 应用程序中,当您的页面仍在加载(创建组件)并且您的代码在页面完全加载之前执行时,就会发生这种情况。这很可能发生在往返服务器之间!我很确定这就是你的问题所在......

于 2012-11-03T01:14:44.277 回答