【问题标题】:Getting exception when trying to insert or update multiple rows in the table尝试在表中插入或更新多行时出现异常
【发布时间】:2013-08-12 05:51:23
【问题描述】:

我正在尝试将数据表中的多行插入和更新到数据库表中。 下面是将 Datatable 传递给存储过程的代码:

 DataTable dtUserRights = new DataTable();
        PropertyInfo[] piT = typeof(clsRightsAL).GetProperties(); //Gets all column values with there datatype
        foreach (PropertyInfo pi in piT)
        {
              //create a datacolumn for each property
              DataColumn dc = new DataColumn(pi.Name, pi.PropertyType);
              dtUserRights.Columns.Add(dc);

        }

        try
        {
            if (con.State == ConnectionState.Closed)
            {
                con.Open();
            }
            for (int item = 0; item < objUserRightsALLst.Count; item++)
            {
                DataRow dr = dtUserRights.NewRow();


                for (int property = 0; property < dtUserRights.Columns.Count; property++)
                {
                    dr[property] = piT[property].GetValue(objUserRightsALLst[item], null);
                }

                dtUserRights.Rows.Add(dr);
            }
            objCmd = new SqlCommand();
            objCmd.CommandText = "sp_AD_InsertUpdateGroupRights";
            objCmd.CommandType = CommandType.StoredProcedure;
            objCmd.Connection = con;
            objCmd.Parameters.Clear();
            SqlParameter tableParameter =  objCmd.Parameters.AddWithValue("@GroupRightslist", dtUserRights);
            tableParameter.SqlDbType = SqlDbType.Structured;
 intCount = objCmd.ExecuteNonQuery();

            if (con.State == ConnectionState.Open)
            {
                con.Close();
            }
        }
        catch (Exception e)
        {
            throw e;
        }

下面是我调用的 SP:

CREATE PROCEDURE [dbo].[sp_AD_InsertUpdateGroupRights]  
@GroupRightslist as  [dbo].[GroupRightsList] ReadOnly  
AS  
BEGIN   
if Not Exists(Select intID from tblADGroupRights where intID = (Select l.intID from @GroupRightslist l))  
Begin  
  insert into tblADGroupRights(IntGroupID,intMenuID,blAdd,blEdit,blView,blGrant,blStatus,strUserCreated
) Select l.IntGroupID,l.intMenuID,l.blAdd,l.blEdit,l.blView,l.blGrant,l.blStatus,
l.strBy from GroupRightslist l   

End     
 else    

  begin  
update A set blAdd = l.blAdd,blEdit = l.blEdit,blView = l.blView,blGrant = l.blGrant   
 FROM  tblADGroupRights A INNER JOIN @GroupRightslist l on A.intID = l.intID  
where A.intID = l.intID     
end
END

当我将单行传递给存储过程时,数据被插入,但是当数据表有多个记录时,我得到异常:

子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

而且我的更新查询根本不起作用。

我的用户定义表类型:

CREATE TYPE [dbo].[GroupRightsList] AS TABLE(
[intID] [int] NULL,
[intProfileID] [int] NULL,
[IntGroupID] [int] NULL,
[intMenuID] [int] NULL,
[blAdd] [bit] NULL,
[blEdit] [bit] NULL,
[blView] [bit] NULL,
[blGrant] [bit] NULL,
[blStatus] [bit] NULL,
[strBy] [nvarchar](max) NULL
) 

我知道,当 Select 查询返回超过 1 个值并且我们没有正确处理它时,通常会引发此异常,但在我使用用户类型表的情况下,我已经看到许多网站在其中显示了它和我做的一样。

【问题讨论】:

    标签: c# sql-server-2008


    【解决方案1】:

    子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

    这纯粹是一个 sp 错误。这意味着在您的 sp 中,您有一个子查询返回多个不允许的记录。下面最有可能是这一行

    Select intID from tblADGroupRights where intID = (Select l.intID from @GroupRightslist l)
    

    要么改成

    Select intID from tblADGroupRights where intID = (Select Top 1 l.intID from @GroupRightslist l)
    

    Select intID from tblADGroupRights where intID in (Select l.intID from @GroupRightslist l)
    

    【讨论】:

    • 非常感谢,我可以插入,但我的更新查询仍然无法正常工作。
    • 我没有收到任何错误,但似乎控件没有到达更新查询。现在已经解决了。谢谢
    猜你喜欢
    • 2011-04-24
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多