C# 在SQL Server 2008中更新一个表并插入到另一个表中
我有两个表company和group,CompanyID为{auto increment primary key},GroupID为{auto increment primary key}。在“组”表中,我想在“提交”按钮上插入组详细信息,单击“使用刚刚插入到组表中的GroupID更新公司表的“组”列。请建议我如何使用单独的命令或通过存储过程执行此操作。我在SQL server查询方面有点弱,因此需要一些解释方面的帮助。我做错了什么?它给出了“关键字'inner'附近不正确的语法”。提前谢谢 提交按钮点击代码: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'附近不正确的语法”。提前谢谢
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表中的额外组列。谢谢你的澄清,先生。你太棒了!!