Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL Server:表变量继续提供空值_C#_Sql Server_Asp.net Mvc_Sql Server 2008 - Fatal编程技术网

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样式