【发布时间】: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