参数未通过SqlCommand传递

时间:2012-03-27 07:41:12

标签: c# asp.net sql sql-server stored-procedures

我有一个工作正常的存储过程,但我最近添加了三个新的参数:

**@HasObits**, **@AlternateName**, and **@Notes**.

CREATE PROCEDURE dbo.sp_InsertNewRecord 
(
@CountryID int, 
@StateID int, 
@CountyID int, 
@RecordsOnline bit = 0, 
**@HasObits bit = 0,**
@Name varchar(100), 
**@AlternateName varchar(100) = null,**
@Address varchar(50) = null,
@Address2 varchar(50) = null,
@City varchar(50) = null,
@ZipCode varchar(10) = null,
@Phone char(10) = null,
@Fax char(10) = null,
@Email varchar(50) = null,
@Website varchar(100) = null,
@SearchURI varchar(150) = null, 
**@Notes text = null,** 
@AddedBy uniqueidentifier = null
)

AS 

BEGIN 
    SET NOCOUNT ON 

INSERT INTO MyTable (CountryID, StateID, CountyID, RecordsOnline, HasObituaries, [Name], AlternateName, [Address], Address2, City, ZipCode, Phone, Fax, Email, Website, SearchURI, Notes, AddedBy)
    VALUES (@CountryID, @StateID, @CountyID, @RecordsOnline, @HasObits, @Name, @AlternateName, @Address, @Address2, @City, @ZipCode, @Phone, @Fax, @Email, @Website, @SearchURI, @Notes, @AddedBy)

END
GO

此方法由我的数据访问层调用此方法:

public void Insert(Company company)
    {
        // create connection
        SqlConnection conn = new SqlConnection(_connectionString);

        // create command
        SqlCommand cmd = new SqlCommand(COMPANY_INSERT, conn);
        cmd.CommandType = System.Data.CommandType.StoredProcedure;

        // init command params
        cmd.Parameters.AddWithValue("CountryID", company.CountryID);
        cmd.Parameters.AddWithValue("StateID", company.StateID);
        cmd.Parameters.AddWithValue("CountyID", company.CountyID);
        **cmd.Parameters.AddWithValue("HasObituaries", company.HasObituaries);**
        cmd.Parameters.AddWithValue("Name", company.Name);
        **cmd.Parameters.AddWithValue("AlternateName", (string.IsNullOrEmpty(company.AlternateName)) ? null : company.AlternateName);**
        cmd.Parameters.AddWithValue("Address", (company.Address.Length == 0) ? null : company.Address);
        cmd.Parameters.AddWithValue("City", (company.City.Length == 0) ? null : company.City);
        cmd.Parameters.AddWithValue("ZipCode", (company.ZipCode.Length == 0) ? null : company.ZipCode);
        cmd.Parameters.AddWithValue("Phone", (company.Phone.Length == 0) ? null : company.Phone);
        cmd.Parameters.AddWithValue("Fax", (company.Fax.Length == 0) ? null : company.Fax);
        cmd.Parameters.AddWithValue("Website", (company.Website.Length == 0) ? null : company.Website);
        cmd.Parameters.AddWithValue("SearchURI", (company.SearchURI.Length == 0) ? null : company.SearchURI);
        cmd.Parameters.AddWithValue("AddedBy", (company.AddedBy == Guid.Empty) ? null : company.AddedBy.ToString());
        **cmd.Parameters.AddWithValue("Notes", company.Notes);**

        using (conn)
        {
            conn.Open();

            cmd.ExecuteNonQuery();
        }
    }

这个方法一直很好,直到我添加了三个新的参数。现在当这个方法运行时,它一直给我错误:“@ HasObits不是程序sp_InsertNewRecord的参数”如果我注释掉那行,它只​​用@AlternateName表示相同的错误,那么我评论那个和@Notes说的相同,所以我评论出来,然后成功插入记录。

如果我不得不猜测,我会说SqlCommand由于某种原因没有注册param。我可以在SQL Server 2008中运行以下SQL命令,它完全符合我的预期:

exec sp_InsertNewRecord @CountryID = 1, @StateID = 13, @CountyID = 1, @Name = 'TESTING', @HasObits = 1, @Notes = 'testing notes', @AlternateName = 'alternate name'

我现在处于亏损状态。我从来没有这样的问题,现在花了大约5个小时试图找到答案,所以任何帮助都将不胜感激!

传入的参数的数据类型(company.HasObits是bool,company.AlternateName是字符串,company.Notes是字符串)。

提前感谢您的帮助!我对此感到非常沮丧,并希望有人能够对此有所了解。

5 个答案:

答案 0 :(得分:1)

您的SP有一个参数= @HasObits但您的SqlCommand正在将参数添加为Hash Obituaries。

    **cmd.Parameters.AddWithValue("HasObituaries", company.HasObituaries);**

这可能是其中一个问题的根源。

答案 1 :(得分:1)

在您的代码中添加

cmd.Parameters.AddWithValue("HasObituaries", company.HasObituaries);

但在您的商店中,您的参数是@HasObits。

以这种方式更改代码:

cmd.Parameters.AddWithValue("HasObits", company.HasObituaries);

答案 2 :(得分:0)

即使您拥有这些参数的默认值,也需要将它们添加到cmd.Parameters集合中。 (您可以指定DBNull.Value)。

答案 3 :(得分:0)

说出一个名字;使用HasObits或HasObituaries。然后将代码,存储过程和列名更新为所有匹配。

答案 4 :(得分:0)

这个问题归咎于托管公司移动数据库服务器,因为我正在测试应用程序,它不再指向正确的数据库了。

所有代码都是/是正确的(这让我感觉更好),但它只是指向错误的数据库服务器。大约5个小时后,我收到了一封电子邮件,告诉我它已被切换,我需要更新对旧服务器的任何引用。