【问题标题】:how to fix SystemArgumentNullException in Visual Studio 2010 based on connectionString如何在 Visual Studio 2010 中基于 connectionString 修复 SystemArgumentNullException
【发布时间】:2013-10-29 17:33:17
【问题描述】:

每当我单击表单上的提交按钮时,我都会收到以下错误消息:

错误:System.ArgumentNullException:值不能为空。参数名称:connectionString at Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteDataset(字符串 连接字符串、命令类型命令类型、字符串命令文本、 SqlParameter[] commandParameters) 在 ClassesnWorkshops._Default.GetHousesBySearchCriteria() 。 . .

我是 C# 和 Visual Studio 的初学者。 谁能告诉我为什么我的连接字符串可能为空? 有什么想法可以解决这个错误吗? 我使用项目属性的设置按钮创建了一个名为 connectionString 的 ConnectionString 连接到我的 Classes 数据库。但这可能是不必要的,因为它没有改变错误。

//Code for my submit button click event:
protected void cmdSearch_Click(object sender, EventArgs e)
        {
            DataTable objDT = null;
            try
            {
                //Query the database for houses
                objDT = GetHousesBySearchCriteria();
                //Any houses found?
                if (objDT.Rows.Count == 0)
                {
                    //None found - hide repeater, show message
                    rptHouses.Visible = false;
                    lblMessage.Text = "No results found";
                }
                else
                {
                    //Houses found - show repeater, hide message
                    rptHouses.DataSource = objDT;
                    rptHouses.DataBind();
                    rptHouses.Visible = true;
                    lblMessage.Text = "";
                }
            }
            catch (Exception ex)
            {
                //Add your own error handling here
                lblMessage.Text = "Error: " + ex.ToString();
            }
            finally
            {
                //Release memory
                objDT = null;
            }
        }
        #endregion


        #region GetHousesBySearchCriteria
        public DataTable GetHousesBySearchCriteria()
        {
            //Use the Microsoft Data Application Blocks to query database
            DataSet objDS = new DataSet();

            SqlParameter[] arParms = new SqlParameter[2];
            arParms[0] = new SqlParameter("@Zipcode", SqlDbType.Char);
            arParms[0].Value = txtZipCode.Text;
            arParms[1] = new SqlParameter("@Miles", SqlDbType.Decimal);
            arParms[1].Value = Int16.Parse(cboWithin.SelectedItem.Value);

            lblTestParms0.Text = txtZipCode.Text;
            lblTestParms1.Text = cboWithin.SelectedValue.ToString();

            //Return a DataTable
            return SqlHelper.ExecuteDataset(ConfigurationManager.AppSettings["ConnectionString"],
                CommandType.StoredProcedure, "spHouses_GetNearZipcode", arParms).Tables[0];


        }
        #endregion

存储过程代码:

CREATE PROCEDURE [dbo].[spHouses_GetNearZipcode]

@Zipcode char(5),
@Miles decimal(11,6)

AS

--Load close zipcodes into temp table
SELECT ZIP.ZipCode, ZIP.City, 
    dbo.DistanceFunc(ZIP.Latitude, ZIP.Longitude, RAD.Latitude, RAD.Longitude) As Distance
    INTO #TempZips
FROM ZipCodes ZIP, RadiusFunc(@ZipCode, @Miles) RAD
WHERE (ZIP.Latitude BETWEEN RAD.MinLatitude AND RAD.MaxLatitude) AND
    (ZIP.Longitude BETWEEN RAD.MinLongitude AND RAD.MaxLongitude) AND
    (dbo.DistanceFunc(ZIP.Latitude,ZIP.Longitude,RAD.Latitude,RAD.Longitude) <= @Miles)

--Search Houses table and JOIN to temp zipcodes table
SELECT H.*, Zips.Distance AS Miles
FROM Schools H INNER JOIN 
    #TempZips Zips ON Zips.ZipCode = H.zip
ORDER BY Zips.Distance
RETURN

【问题讨论】:

  • 如果您将其称为“connectionString”,则可以尝试在 AppSettings 中使用它而不是“ConnectionString”。我很确定这样的事情会区分大小写。
  • 感谢您的建议。不幸的是,这也不起作用。
  • 这是我的 web.config 文件中的 connectionString 代码。你认为这里有什么问题吗?我什至不知道为什么这里有 SQLEXPRESS 信息。

标签: c# sql sql-server visual-studio-2010


【解决方案1】:

我认为 ExecuteDataset 中的 ConfigurationManager 参数应该如下所示:

return SqlHelper.ExecuteDataset(ConfigurationManager.AppSettings["ConnectionString"].ConnectionString, CommandType.StoredProcedure, "spHouses_GetNearZipcode", arParms).Tables[0];

在您的 AppSettings 键后添加“.ConnectionString”

【讨论】:

  • 附加的 .ConnectionString 带有红色下划线,我得到一个错误读取“'string'不包含'ConnectionString'的定义并且没有扩展方法'ConnectionString'接受'string'类型的第一个参数' 可以找到(您是否缺少 using 指令或 assmebly 引用?)
  • 你是对的!有一个额外的变化。我需要将 AppSettings 更改为 ConnectionStrings。所以我的新代码行如下所示: return SqlHelper.ExecuteDataset(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString, CommandType.StoredProcedure, "spHouses_GetNearZipcode", arParms).Tables[0];
  • 现在我得到一个不同的错误。我不知道是因为我拥有不同的代码还是因为我以前的代码的下一个问题?它是:错误:System.NullReferenceException:对象引用未设置为对象的实例。在 ClassesnWorkshops._Default.GetHousesBySearchCriteria() 。 . .
  • 抱歉,复制/粘贴太快了。对我来说,没有什么明显的突出之处,您的参数之一可能为空?也许在您的 GetHousesBySearchCriteria() 方法中放置一个断点并逐步执行,直到它中断以更好地了解正在发生的事情。我在想一个参数可能是空的......
【解决方案2】:

使用ConfigurationManager.AppSettings 时,键值区分大小写。您的连接字符串是否命名为

connectionString or ConnectionString
^                   ^

【讨论】:

  • 很抱歉让我感到困惑。连接字符串的名称是 ConnectionString。
  • 所以,在错误描述中,参数名称是connectionString。在我的 GetHousesbySearchCriteriaMethhod() 中,我调用 ConnectionString。在我的 web.config 文件中,我创建了一个名为 ClassesnWorkshops.Properties.Settings.ConnectionString 的连接字符串。为什么错误提到了小写的connectionString?这可能是问题吗?如果是这样,它来自哪里?
猜你喜欢
  • 1970-01-01
  • 2013-02-06
  • 2012-08-12
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多