C# 插入,更新错误:子查询在C中返回了超过1行#
我已经用C#在存储过程和查询中编写了一个SQL脚本 但它抛出了一个错误: 子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时 据我所知,问题在于子查询向主查询返回了多行。我可以知道怎么解决吗?多谢各位C# 插入,更新错误:子查询在C中返回了超过1行#,c#,sql,sql-server,stored-procedures,C#,Sql,Sql Server,Stored Procedures,我已经用C#在存储过程和查询中编写了一个SQL脚本 但它抛出了一个错误: 子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时 据我所知,问题在于子查询向主查询返回了多行。我可以知道怎么解决吗?多谢各位 public void insertData(string TransID, string Item, string FromLocation, string Qty, string Requestor, string RefNum, string Remark, string R
public void insertData(string TransID, string Item, string FromLocation, string Qty, string Requestor, string RefNum, string Remark, string ReasonID, string ReasonRemark, string CreateDate, string CreateUser, string ToLocation)
{
string constr = ConfigurationManager.ConnectionStrings["CIMProRPT01ConnectionString"].ConnectionString;
using (SqlConnection _cn = new SqlConnection(constr))
{
using (SqlCommand _cmd = new SqlCommand("MMSIssue_InsertOrUpdate", _cn))
{
using (SqlDataAdapter da = new SqlDataAdapter(_cmd))
{
_cn.Open();
_cmd.CommandType = CommandType.StoredProcedure;
_cmd.Parameters.AddWithValue("@INV_TRANS_ID", TransID);
_cmd.Parameters.AddWithValue("@INV_ID", Item);
_cmd.Parameters.AddWithValue("@INV_LOCATION", FromLocation);
_cmd.Parameters.AddWithValue("@INV_QTY", Qty);
_cmd.Parameters.AddWithValue("@INV_TRANS_REQUESTOR", Requestor);
_cmd.Parameters.AddWithValue("@INV_TRANS_REFNO", RefNum);
_cmd.Parameters.AddWithValue("@INV_TRANS_REMARK", Remark);
_cmd.Parameters.AddWithValue("@INV_REASON_ID", ReasonID);
_cmd.Parameters.AddWithValue("@INV_REASON_REMARK", ReasonRemark);
_cmd.Parameters.AddWithValue("@INV_CREATE_DATE", CreateDate);
_cmd.Parameters.AddWithValue("@INV_CREATE_USER", CreateUser);
_cmd.Parameters.AddWithValue("@INV_FROMLOC", ToLocation);
_cmd.Parameters.Add("@RecordFound", SqlDbType.Int, 0);
_cmd.Parameters["@RecordFound"].Direction = ParameterDirection.Output;
_cmd.ExecuteNonQuery();
string DeleteWMMRSQL = "DELETE FROM [CIMProRPT01].[dbo].[OTH_INV_QTY_LOC] WHERE INV_QTY = 0 OR INV_QTY is null OR INV_QTY <= '-1'";
SqlCommand cmd3 = new SqlCommand(DeleteWMMRSQL, _cn);
cmd3.ExecuteNonQuery();
_cn.Close();
float INV_QTY = Convert.ToInt32(_cmd.Parameters["@RecordFound"].Value.ToString());
if (INV_QTY == 2)
{
//QTY is more Than existing QTY !!");
Response.Write("QTY is more Than existing QTY !!");
Response.Redirect("MMS_LocationTrans.aspx");
}
else
{
//QTY not able to key in 0
Response.Write("QTY not able to key in 0!!");
}
}
}
}
}
存储过程中的这一行存在问题:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[MMSIssue_InsertOrUpdate]
@INV_TRANS_ID VARCHAR(40),
@INV_ID VARCHAR(40),
@INV_LOCATION VARCHAR(40),
@INV_QTY FLOAT,
@INV_TRANS_REQUESTOR VARCHAR(40),
@INV_TRANS_REFNO VARCHAR(40),
@INV_TRANS_REMARK VARCHAR(255),
@INV_REASON_ID VARCHAR(40),
@INV_REASON_REMARK VARCHAR(255),
@INV_CREATE_DATE DATETIME,
@INV_CREATE_USER VARCHAR (255),
@INV_FROMLOC VARCHAR (40),
@RecordFound INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS(SELECT * FROM OTH_INV_QTY_LOC
WHERE INV_ID = @INV_ID AND INV_LOCATION = @INV_LOCATION)
BEGIN
UPDATE OTH_INV_QTY_LOC
SET [INV_ID] = @INV_ID,
INV_LOCATION = @INV_LOCATION,
INV_QTY = INV_QTY - @INV_QTY
WHERE INV_ID = @INV_ID
AND INV_LOCATION = @INV_LOCATION
INSERT INTO OTH_INV_TRANSACTION (INV_TRANS_ID, INV_ID, INV_TRANS_LOCATION, INV_TRANS_QTY, INV_TRANS_REQUESTOR, INV_TRANS_REFNO, INV_TRANS_REMARK, INV_REASON_ID, INV_REASON_REMARK, INV_CREATE_DATE, INV_CREATE_USER, INV_FROMLOC)
VALUES (@INV_TRANS_ID, @INV_ID, @INV_LOCATION, @INV_QTY, @INV_TRANS_REQUESTOR, @INV_TRANS_REFNO, @INV_TRANS_REMARK, @INV_REASON_ID, @INV_REASON_REMARK, @INV_CREATE_DATE, @INV_CREATE_USER, @INV_FROMLOC)
DECLARE @InvFindQTY FLOAT
SET @InvFindQTY = (SELECT INV_QTY FROM OTH_INV_QTY_LOC)
IF @InvFindQTY >= @INV_QTY
BEGIN
SELECT @RecordFound = 2
END
ELSE
BEGIN
SELECT @RecordFound = 1
END
END
ELSE
BEGIN
SELECT @RecordFound = 0
END
END
DECLARE @InvFindQTY FLOAT
SET @InvFindQTY = ( SELECT INV_QTY FROM OTH_INV_QTY_LOC)
如果您在其他库存数量LOC中有多条记录,您将收到此错误
看起来您应该能够通过添加
WHERE INV_ID = @INV_ID
确保只选择一条记录,即:
SET @InvFindQTY = ( SELECT INV_QTY FROM OTH_INV_QTY_LOC WHERE INV_ID = @INV_ID)
因为您没有提供存储过程,所以我无法确定您的问题到底是什么。如果您认为子查询向主查询返回了多个结果,您可以尝试使用
选择top 1
来限制子查询返回的结果,以查看这是否确实是子查询本身的问题,并查看结果。决定你想要哪一个。写代码来获得它。非常非常感谢兄弟。我已经搜索了大部分帖子,但没有解决。