C# SQL Server:表变量继续提供空值
我有一个一直让我悲伤的问题。我正在做这个电子商务项目,它的设置方法是使用一个表变量来创建它,为我正在做的愿望列表功能执行一些比较函数。如果来自C# SQL Server:表变量继续提供空值,c#,sql-server,asp.net-mvc,sql-server-2008,C#,Sql Server,Asp.net Mvc,Sql Server 2008,我有一个一直让我悲伤的问题。我正在做这个电子商务项目,它的设置方法是使用一个表变量来创建它,为我正在做的愿望列表功能执行一些比较函数。如果来自MasterProduct表的最佳价格低于当前存储的价格,则获取该值并存储该ID 问题是,当我尝试使用它时,我总是得到一个空引用错误。我对在SQL中创建表变量非常陌生,所以我完全不知道该怎么做。有谁能帮助我了解如何解决这个问题 CREATE PROCEDURE [dbo].[DAL_Wishlist_SelectAllPersonIDByPriceDrop
MasterProduct
表的最佳价格低于当前存储的价格,则获取该值并存储该ID
问题是,当我尝试使用它时,我总是得到一个空引用错误。我对在SQL中创建表变量非常陌生,所以我完全不知道该怎么做。有谁能帮助我了解如何解决这个问题
CREATE PROCEDURE [dbo].[DAL_Wishlist_SelectAllPersonIDByPriceDrop]
(@iErrorCode INT OUTPUT)
AS
SET NOCOUNT ON
DECLARE @MasterProductIDTable TABLE
(
MasterProductID [int] NOT NULL,
PRIMARY KEY (MasterProductID)
)
INSERT INTO @MasterProductIDTable (MasterProductID)
SELECT DISTINCT [MasterProduct].[MasterProductID]
FROM [dbo].[Wishlist], [dbo].[MasterProduct]
WHERE [MasterProduct].[MasterProductID] = [Wishlist].[MasterProductID]
AND [MasterProduct].[BestPrice] < [Wishlist].[PreviousCost]
SELECT DISTINCT [Wishlist].[PersonID]
FROM [dbo].[Wishlist], @MasterProductIDTable mpt
WHERE [Wishlist].[MasterProductID] = mpt.MasterProductID
SELECT @iErrorCode = @@ERROR
GO
CREATE PROCEDURE[dbo]。[DAL_Wishlist_SelectAllPersonIDByPriceDrop]
(@iErrorCode INT输出)
作为
不计较
声明@MasterProductIDTable表
(
MasterProductID[int]不为空,
主键(MasterProductID)
)
插入@MasterProductID表(MasterProductID)
选择不同的[MasterProduct]。[MasterProductID]
来自[dbo].[Wishlist],[dbo].[MasterProduct]
其中[MasterProduct].[MasterProductID]=[Wishlist].[MasterProductID]
和[主产品].[BestPrice]<[Wishlist].[PreviousCost]
选择不同的[Wishlist]。[PersonID]
来自[dbo].[Wishlist],@MasterProductIDTable mpt
其中[Wishlist].[MasterProductID]=mpt.MasterProductID
选择@iErrorCode=@@ERROR
去
存储过程非常简单,因为它是:
private List<Wishlist> _loadAllFromDataTable(DataTable dt)
{
List<Wishlist> list = new List<Wishlist>();
for (int index = 0; index < dt.Rows.Count; index++)
{
list.Add(_loadFromDTRow(index, dt));
}
return list;
}
private Wishlist _loadFromDTRow(int row, DataTable dt)
{
if (dt.Rows.Count > 0)
{
Wishlist wishlist = new Wishlist();
wishlist.ID = (int)dt.Rows[row]["ID"];
wishlist.PersonID = (int)dt.Rows[row]["PersonID"];
wishlist.MasterProductID = (int)dt.Rows[row]["MasterProductID"];
wishlist.DateAdded = (DateTime)dt.Rows[row]["DateAdded"];
wishlist.PreviousCost = (decimal)dt.Rows[row]["PreviousCost"];
return wishlist;
}
else
return null;
}
私有列表\u loadAllFromDataTable(DataTable dt)
{
列表=新列表();
对于(int index=0;index0)
{
愿望列表愿望列表=新建愿望列表();
wishlist.ID=(int)dt.Rows[row][“ID”];
wishlist.PersonID=(int)dt.Rows[row][“PersonID”];
wishlist.MasterProductID=(int)dt.Rows[row][“MasterProductID”];
wishlist.DateAdded=(DateTime)dt.Rows[row][“DateAdded”];
wishlist.PreviousCost=(十进制)dt.Rows[行][“PreviousCost”];
返回愿望列表;
}
其他的
返回null;
}
以及:
public List SelectAllPersonIDByPriceDrop()
{
SqlCommand scmCmdToExecute=新的SqlCommand();
scmCmdToExecute.CommandText=“dbo.[DAL_Wishlist_SelectAllPersonIDByPriceDrop]”;
scmCmdToExecute.CommandType=CommandType.StoredProcess;
添加(新的SqlParameter(“@iErrorCode”,SqlDbType.Int,4,ParameterDirection.Output,true,10,0,”,DataRowVersion.Proposed,(SqlInt32)0));
DataTable dt=SqlDB.ExecuteQuery(scmCmdToExecute);
List masterProductIDList=新列表();
对于(int index=0;index
任何帮助都将不胜感激
谢谢。您没有指定空值(具体)出现的位置,因此我认为这应该会有所帮助:
var dt = new DataTable();
dt = SqlDB.ExecuteQuery(scmCmdToExecute);
您没有指定空值(具体)出现的位置,因此我怀疑这会有所帮助:
var dt = new DataTable();
dt = SqlDB.ExecuteQuery(scmCmdToExecute);
您的过程可以大大简化为一个select语句,并且没有表变量。我不知道您对@iErrorCode的意图是什么,您的代码中根本没有引用它。此外,还需要选择要在代码中使用的所有列。您正在引用c#中的列,而不是查询中的列。我不确定它们来自哪个表,因此您需要添加它们
CREATE PROCEDURE [dbo].[DAL_Wishlist_SelectAllPersonIDByPriceDrop]
(
@iErrorCode int OUTPUT
) AS
SET NOCOUNT ON;
SELECT w.PersonID
FROM Wishlist w
JOIN dbo.MasterProduct mp ON mp.MasterProductID = w.MasterProductID
AND mp.BestPrice < w.PreviousCost
GROUP BY w.PersonID;
CREATE PROCEDURE[dbo]。[DAL_Wishlist_SelectAllPersonIDByPriceDrop]
(
@iErrorCode int输出
)作为
不计数;
选择w.PersonID
来自愿望者w
在mp.MasterProductID=w.MasterProductID上加入dbo.MasterProduct mp
和mp.BestPrice
您的过程可以大大简化为一个select语句,而无需表变量。我不知道您对@iErrorCode的意图是什么,您的代码中根本没有引用它。此外,还需要选择要在代码中使用的所有列。您正在引用c#中的列,而不是查询中的列。我不确定它们来自哪个表,因此您需要添加它们
CREATE PROCEDURE [dbo].[DAL_Wishlist_SelectAllPersonIDByPriceDrop]
(
@iErrorCode int OUTPUT
) AS
SET NOCOUNT ON;
SELECT w.PersonID
FROM Wishlist w
JOIN dbo.MasterProduct mp ON mp.MasterProductID = w.MasterProductID
AND mp.BestPrice < w.PreviousCost
GROUP BY w.PersonID;
CREATE PROCEDURE[dbo]。[DAL_Wishlist_SelectAllPersonIDByPriceDrop]
(
@iErrorCode int输出
)作为
不计数;
选择w.PersonID
来自愿望者w
在mp.MasterProductID=w.MasterProductID上加入dbo.MasterProduct mp
和mp.BestPrice
我认为您不需要担心select
查询的错误代码,您的过程可以很容易地归结为:
create procedure dbo.dal_Wishlist_SelectAllPersonIDbyPriceDrop as
begin;
set nocount on;
select distinct w.PersonId
from dbo.Wishlist w
inner join dbo.MasterProduct mp
on mp.MasterProductID = w.MasterProductID
where mp.BestPrice < w.PreviousCost
end;
go
我认为您不必担心
select
查询中的错误代码,您的过程可以很容易地归结为:
create procedure dbo.dal_Wishlist_SelectAllPersonIDbyPriceDrop as
begin;
set nocount on;
select distinct w.PersonId
from dbo.Wishlist w
inner join dbo.MasterProduct mp
on mp.MasterProductID = w.MasterProductID
where mp.BestPrice < w.PreviousCost
end;
go
MSSQL不是mysql,我删除了mysql标记词汇表上的快速注释-上面的存储过程使用的是“表变量”而不是“临时表”。这些概念之间有相似之处,但它们不是同一件事。您的sql似乎将@@error变量作为输出返回。尝试设置@iErrorCode=@@error您真的应该学会为表使用别名,并开始使用ANSI-92样式的联接,它们已经存在了25年多了。我会将您的联接更改为ANSI内部联接,而不是旧式联接-请参阅MSSQL不是mysql,我删除了mysql标记词汇表快速注释-上面的存储过程使用的是“表变量”而不是“临时表”。这些概念之间有相似之处,但它们不是同一件事。您的sql似乎返回了@@error变量作为输出。请尝试设置@iErrorCode=@@error您确实应该学习为表使用别名,并开始使用ANSI-92样式