主、副键两表,主表的主键是自动生成的,必须先插入主键表,才能插入副表,怎么做?

dahua1980 2005-07-28 09:47:48
比如如下两表,提库单索引表为主表,提库单产品表为副表,提库单号是主键,是流水号,即是自动生成的

提库单索引表(表1) 提库单产品表(表2)

提库单号(PK) 提库时间 提库人 产品编号(PK) 产品名称 数量 提库单号(PK)

说明:表1是用insert语句插入的,而表2是用dataset的update实现的
1.在插入时,必须先插入表1,才能插入表2,如何使得表2获得刚插入的表1的 提库单号?同时还要防止多人操作的情况(好像的用死锁?)
2.删除时,只需删除表1,因为关联,表2会自动删除,同时还要防止多人操作的情况(好像的用死锁?)
3.更新有如何实现呢?

注:假设插入主键表没问题
附一段程序(也许想法不对):
Private Sub PutInDataBase_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PutInDataBase.Click
Dim str As String
Dim cmd As SqlCommand
Dim Con As SqlConnection
Dim count As Integer
Con = New SqlConnection("Server = localhost;uid=sa;pwd=l801231;database=XXDB")

'将数据插入到InWHTableIndex
cmd = New SqlCommand("PickUpWHTableIndexInsert", Con)
cmd.CommandType = CommandType.StoredProcedure

cmd.Parameters.Add("@BillOfLadingID", SqlDbType.Char, 14)
cmd.Parameters("@BillOfLadingID").Value = Session("BillOfLadingID")

cmd.Parameters.Add("@PickDate", SqlDbType.SmallDateTime)
cmd.Parameters("@PickDate").Value = Session("PickDate")
cmd.Parameters.Add("@WHCharger", SqlDbType.Char)
cmd.Parameters("@WHCharger").Value = Session("WHCharger")
Con.Open()

Try
‘插入主键表
cmd.ExecuteNonQuery()
’如何插入副键表,副键表数据在dataset中
Dim adapter As SqlDataAdapter
Dim mybuilder As SqlCommandBuilder
Dim ds As DataSet
Dim i As Integer
Dim mytable As DataTable

ds = CType(Session("a"), DataSet)
mytable = ds.Tables(0)
×××××××××××
如何写?此断程序只是我的想法,也许我的想法根本不对,假设插入主键表没问题
×××××××××××
Page.RegisterStartupScript("", "<script language='javascript'>alert('已成功添加记录!');window.opener.location.href='PickUpWHTransfer.aspx';</script>")

Catch exc As SqlException
' Page.RegisterStartupScript("alert", "<script language='javascript'> alert('出现错误,数据没能被成功录入!')</script>")
'End Try

Con.Close()

End Sub

谢谢大家!!!
...全文
420 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tmeteor 2005-08-07
  • 打赏
  • 举报
回复
public void RunSqlTransaction(string myConnString)
{
SqlConnection myConnection = new SqlConnection(myConnString);
myConnection.Open();

SqlCommand myCommand = myConnection.CreateCommand();
SqlTransaction myTrans;

// Start a local transaction
myTrans = myConnection.BeginTransaction();
// Must assign both transaction object and connection
// to Command object for a pending local transaction
myCommand.Connection = myConnection;
myCommand.Transaction = myTrans;

try
{
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
myCommand.ExecuteNonQuery();
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
myCommand.ExecuteNonQuery();
myTrans.Commit();
Console.WriteLine("Both records are written to database.");
}
catch(Exception e)
{
try
{
myTrans.Rollback();
}
catch (SqlException ex)
{
if (myTrans.Connection != null)
{
Console.WriteLine("An exception of type " + ex.GetType() +
" was encountered while attempting to roll back the transaction.");
}
}

Console.WriteLine("An exception of type " + e.GetType() +
" was encountered while inserting the data.");
Console.WriteLine("Neither record was written to database.");
}
finally
{
myConnection.Close();
}
}
athossmth 2005-07-29
  • 打赏
  • 举报
回复
在数据库那层里定义foreignkey限制操作的前后顺序。@@identity是最新操作的记录号
jimu8130 2005-07-29
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatasqlclientsqltransactionclasstopic.asp
这个是msdn中sqlserver数据库的事务。net实现方法,你参考下,语句格式应该差不多
jimu8130 2005-07-29
  • 打赏
  • 举报
回复
上面还有人提到id产生会有并发性的问题,可以尝试用触发器来做。
jimu8130 2005-07-29
  • 打赏
  • 举报
回复
涉及你这样的多表操作,最好用数据库的存储过程加事务或者。net的事务机制来做。
你要么查询数据库的相关帮助,一般都用到begin/end transaciton ,commit,rollback还有。net的事务建议查下msdn吧,不过估计等下应该有大大会贴相关的资料给你看的
dahua1980 2005-07-29
  • 打赏
  • 举报
回复
是不是应该在插主键表时先将主表锁定,?
大家帮忙呀?
huangkc 2005-07-28
  • 打赏
  • 举报
回复
查询select @@IDENTITY
取得刚新增的ID

若是主从表,建议你不要这样产生ID,自己定义规则,在保存时再生成,
这样安全一些,尤其是多人操作
dahua1980 2005-07-28
  • 打赏
  • 举报
回复
能不能详细点
jsyhello 2005-07-28
  • 打赏
  • 举报
回复
表1insert后获取生成的序列号
表2也改为insert语句
采用事务

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧