【发布时间】:2019-06-04 12:54:46
【问题描述】:
SQL Server 是 2014。Visual Studio 2017。
我正在尝试将 3 个参数传递给 SQL Server,但收到此错误:
System.Data.SqlClient.SqlException: '必须声明标量变量“@Title1Item”。'
我已经包含了 C# 和 SQL Server 端代码。谁能告诉我我做错了什么?
public DataTable GetInventoryByAssetDescription (string Desc, string DispositionText, bool Title1Item) {
DataTable myRecords = new DataTable();
using (SqlConnection cn = new SqlConnection (ConnectionString)) {
// Specify which stored procedure to use and add a parameter.
SqlCommand cmd = new SqlCommand ("GetInventoryByAssetDescription", cn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue ("@SearchString", Desc);
cmd.Parameters.AddWithValue ("@DispositionText", DispositionText);
cmd.Parameters.AddWithValue ("@Title1Item", Title1Item);
SqlDataAdapter da = new SqlDataAdapter (cmd);
cn.Open();
da.Fill (myRecords);
}
ALTER PROCEDURE [dbo].[GetInventoryByAssetDescription] (
@SearchString varchar(30),
@DispositionText varchar(200),
@Title1Item bit
)
我希望将 3 个参数传递给存储过程,但在 da.fill (myRecords) 行上出现此错误:
System.Data.SqlClient.SqlException: '必须声明标量变量“@Title1Item”。'
编辑:很抱歉,伙计们。生锈的老程序员在这里。存储过程代码:
USE [Inventory]
GO
/****** Object: StoredProcedure [dbo].[GetInventoryByAssetDescription] Script Date: 6/4/2019 8:30:15 AM ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER PROCEDURE [dbo].[GetInventoryByAssetDescription]
(
@SearchString varchar(30),
@DispositionText varchar(200),
@Title1Item bit
)
AS
begin
SET NOCOUNT ON
declare @sql nvarchar (2000)
select @SearchString=UPPER(@SearchString)
set @sql = ' select in_eq_ID,
in_eq_TagNumber as TagNumber,
Title1Item,
in_eq_AssetDescription as Description,
in_eq_ExtendedDescription as ExtendedDescription,
in_eq_SerialNumber as SerialNumber,
in_eq_ValuationAmount as TotalValue,
in_eq_CustodianName as Name,
in_eq_ComplexBuilding as ShortLocation,
in_eq_SubLocationCode as ShortRoomNumber,
in_ca_Categories.in_ca_CategoryName as CategoryName,
in_eq_DispositionDate as DispositionDate,
DATEADD (dd, 0, DATEDIFF (dd, 0, in_eq_Equipment.in_eq_AcquisitionDate)) as AcquisitionDate
from in_eq_Equipment
LEFT JOIN in_ca_Categories ON in_eq_Equipment.in_eq_CategoryID_fk = in_ca_Categories.in_ca_CategoryID
where @Title1Item = Title1Item
AND upper (in_eq_AssetDescription) LIKE upper ('''+ @SearchString + ''')'
set @sql=@sql+' ' + ISNULL(@DispositionText,' ') + ' order by in_eq_AssetDescription'
execute (@sql)
return
end
【问题讨论】:
-
你能不能把整个
GetInventoryByAssetDescription程序贴上去,肯定不是这样 -
看起来应该可以工作;随机问题 -
Desc或DispositionText是否可能是null(而不是"")?另外:您是否有可能在存储过程中做一些不平凡的事情,例如EXEC/sp_executesql这实际上是出现错误的事情? -
Desc is "%1%" DispositionText is " and ((in_eq_DispositionDate is null) or (in_eq_DispositionDate = ''))" Title1Item = false
-
" and ((in_eq_DispositionDate is null) or (in_eq_DispositionDate = ''))"建议您使用EXEC,这是 a: 几乎可以肯定是 SQL 注入漏洞,而 b: 几乎可以肯定是您看到这个的原因;你能请发布GetInventoryByAssetDescription的完整代码吗 - 我认为问题是SP写得不好 -
这就是除了return语句之外的整个方法:return myRecords; }
标签: c# sqlexception