C# 在SQL Server 2008中更新一个表并插入到另一个表中

C# 在SQL Server 2008中更新一个表并插入到另一个表中,c#,sql-server-2008,merge,insert-update,C#,Sql Server 2008,Merge,Insert Update,我有两个表company和group,CompanyID为{auto increment primary key},GroupID为{auto increment primary key}。在“组”表中,我想在“提交”按钮上插入组详细信息,单击“使用刚刚插入到组表中的GroupID更新公司表的“组”列。请建议我如何使用单独的命令或通过存储过程执行此操作。我在SQL server查询方面有点弱,因此需要一些解释方面的帮助。我做错了什么?它给出了“关键字'inner'附近不正确的语法”。提前谢谢

我有两个表company和group,CompanyID为{auto increment primary key},GroupID为{auto increment primary key}。在“组”表中,我想在“提交”按钮上插入组详细信息,单击“使用刚刚插入到组表中的GroupID更新公司表的“组”列。请建议我如何使用单独的命令或通过存储过程执行此操作。我在SQL server查询方面有点弱,因此需要一些解释方面的帮助。我做错了什么?它给出了“关键字'inner'附近不正确的语法”。提前谢谢

提交按钮点击代码:

protected void btnSubmit_Click(object sender, EventArgs e)
{
    string group = GroupName.Text;
    string dept = Department.Text;
    string company = Session["com"].ToString();

    if ((HttpContext.Current.User != null) && HttpContext.Current.User.Identity.IsAuthenticated && company != null)
    {
        string strcon = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;
        SqlConnection con = new SqlConnection(strcon);
        con.Open();
        DataSet ds = new DataSet();
        SqlDataReader rdr = null;
        SqlCommand cmd1 = new SqlCommand("Insert into Group(GroupName, Department, CompanyID) Values(@groupName, @department, 'Select CompanyID from Company1 where Company.CompanyName=@companyName')", con);
        SqlCommand cmd = new SqlCommand("Update Company1 set Company1.Groups=Group.GroupID inner join Group on Group.CompanyID=Comapny1.CompanyID"
                        +" where Company.CompanyName=@companyName", con);
        cmd1.Parameters.Add("@groupName", SqlDbType.NVarChar).Value = group;
        cmd1.Parameters.Add("@department", SqlDbType.NVarChar).Value = dept;
        cmd1.Parameters.Add("@companyName", SqlDbType.NVarChar).Value = company;
        cmd.Parameters.Add("@companyName", SqlDbType.NVarChar).Value = company;
        //cmd1.Parameters.AddWithValue("@groupName", group);
        //cmd1.Parameters.AddWithValue("@department", dept);
        //cmd.Parameters.AddWithValue("@companyName", company);

        rdr = cmd1.ExecuteReader();
        rdr = cmd.ExecuteReader();
        con.Close();
    }
    else
    {
        Response.Redirect("Account/Login.aspx");
    }
}

关于这一评论:

公司中的GroupID被视为NVARCHAR(30),以方便使用逗号分隔的多个GroupID,我如何实现这一点

答案是不要。您正在复制数据,将关系存储为分隔字符串在关系数据库中是一个好主意。它违背了目的

我认为您需要做的就是在插入组的同时插入
公司ID

INSERT dbo.Group (GroupName, Department, CustomerID)
SELECT  @GroupName, @Department, c.CompanyID
FROM    dbo.Company1 AS c
WHERE   c.CustomerName = @CustomerName;
所以你的c#最终会看起来像:

string sql = @"INSERT dbo.[Group] (GroupName, Department, CustomerID)
                SELECT  @GroupName, @Department, c.CompanyID
                FROM    dbo.Company1 AS c
                WHERE   c.CompanyName = @CompanyName;";
string strcon = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;

using (var connection = new SqlConnection(strcon))
using (var command = new SqlCommand(sql, connection))
{
    connection.Open();
    command.Parameters.Add(@GroupName, SqlDbType.NVarChar, 50).Value = group;
    command.Parameters.Add(@Department, SqlDbType.NVarChar, 50).Value = dept;
    command.Parameters.Add(@CompanyName, SqlDbType.NVarChar, 50).Value = company;
    command.ExecuteNonQuery();
}
注意使用
ExecuteNonQuery()
而不是
ExecuteReader()
,因为您实际上没有读取任何内容,以及使用
使用
块来确保正确处理对象。我还在您的查询中包括了模式前缀(假定为
dbo

如果需要获取与特定公司关联的组,请在查询中执行此操作,以避免在每次插入/更新/删除
时重新计算
列:

SELECT  c.CompanyID,
        c.CompanyName,
        Groups = STUFF((SELECT ',' + CAST(g.GroupID AS VARCHAR(10))
                        FROM    dbo.[Group] AS g
                        WHERE   g.CompanyID = c.CompanyID
                        FOR XML PATH(''), TYPE
                        ).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM    dbo.Company AS c;

有关将行连接到列的更多信息,请参见

您应该签出并停止使用
.AddWithValue()
-这可能会导致意外的结果…是
组。CompanyID
Company1.CompanyID
的外键吗?如果是这样,
公司21组包含什么?如果它需要是刚刚插入的GroupID,为什么它是
NVARCHAR(30)
GroupID
是一个
INT
时?将更新查询更改为下面的“更新公司1设置公司1.Groups=Group.GroupID组上的内部联接组。公司ID=Comapny1.CompanyID”+“其中Company.CompanyName=@CompanyName”谢谢大家。我应用了你所有的建议,但都不起作用,现在的错误是“关键字'Group'附近的语法不正确”。使用程序有什么帮助吗@GarethD公司中的GroupID被视为NVARCHAR(30),以方便使用逗号分隔的多个GroupID,我该如何实现这一点呢?这里我们有UI、视图、业务逻辑和数据层,所有功能都在一个功能中!哇,谢谢@GarethD,插入查询非常有效,但当我对update应用相同的方法时,比如:string updateSql=@“update dbo。[Company1]将Company1.Groups=g.GroupID从dbo中设置为g,其中Company1.CompanyName='BNK'和g.CompanyID=Company1.CompanyID;”;. 查询已运行,但没有任何效果。任何建议。为什么需要针对
公司
存储GroupID?此链接已经存在,因为
表中有一列
公司ID
,如果有多个组与公司相关,则公司中的
中应该显示什么?如果有人更新
组中的
公司ID
,您将如何维护它?然后需要更新
公司
中的两条记录。正如我所解释的,这不是一个好方法,与其浪费时间试图弄清楚如何把一个方形的钉子塞进一个圆形的孔,我会得到一个不同的钉子!哦,现在我明白你的意思了。是的,你是对的,我不需要Company1表中的额外组列。谢谢你的澄清,先生。你太棒了!!