【问题标题】:Parameter not being passed with SqlCommand [closed]SqlCommand 未传递参数 [关闭]
【发布时间】:2012-03-27 07:41:12
【问题描述】:

我有一个运行良好的存储过程,但我最近添加了三个新参数:

**@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 出于某种原因没有注册参数。我可以在 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 是布尔值,company.AlternateName 是字符串,company.Notes 是字符串)。

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

【问题讨论】:

  • 您是否注意到在您的 C# 代码中您将参数命名为 HasObituaries 而不是像在存储过程中那样的 HasObits?另外,您能否包含字符串 COMPANY_INSERT 的文本?
  • 检查您正在针对正确的数据库运行程序,而不是具有旧版本存储过程的数据库
  • 请发布您的表格设计。并尝试删除并重新创建表格。有时关闭您的 SSMS 并再次打开可以解决此类问题,因为它有时无法识别它
  • 一些注意事项:您在很多地方都使用null,其中(由于SqlParameter 的工作方式)可能应该是DBNull.Value。另外,就个人而言,我认为空字符串 ("") 和 null 之间存在很大差异,如果 Address 为空,则传递 DBNull.Value,否则: 传递空字符串。
  • 您是否尝试过清除您的解决方案????

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


【解决方案1】:

您的 SP 有一个参数 = @HasObits,但您的 SqlCommand 将参数添加为 HasObituaries。

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

这可能是问题之一。

【讨论】:

  • 这是我写问题时的一个错误。我不得不更改一些代码来隐藏项目的一些细节。正确的参数名称是 HasObituaries,这在整个代码和存储过程中都是一致的,但是在发布我的问题时我一定错过了它。很抱歉造成混乱。
【解决方案2】:

在你的代码中添加

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

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

这样改代码:

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

【讨论】:

  • 这是我写问题时的一个错误。我不得不更改一些代码来隐藏项目的一些细节。正确的参数名称是 HasObituaries,这在整个代码和存储过程中都是一致的,但是在发布我的问题时我一定错过了它。很抱歉造成混乱。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    选择一个名字;使用 HasObits 或 HasObituaries。然后更新代码、存储过程和列名,使其全部匹配。

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 2017-04-02
        • 2017-11-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多