用事务同时插入数据到两个父子关系的表

xiaoym1116 2008-04-21 11:15:12
建立一条信息,有名字、图片。


因为图片数是不固定的,所以打算另外建立一个photo表,把公司名插入到图片存到Company表中,并立刻取得自动增加的ID,把图片名插入到Photo表中,并把Company中新添加的ID记录到Photo表中的parentid中。

上网看了很多,都说是要用事务防止多用户同时操作造成的问题。事务还从来没有用过。

@@IDENTITY 比如这个,都不知道该用在哪里?CS里还是写在存储过程里?

网上给的都是简单几句最关键的部分,实在是没看懂,希望能给我几段完整简单,但是详细点的例子学习一下,谢谢了


修改的表结构

Company表

ID SchIndustry CompanyName Picture

Photo表

pid parentid path



以下是没分表之前的实现办法,只能插固定的图片数

cs部分

SqlCommand cmd = new SqlCommand("inserCompany", dbcom.conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter spr = new SqlParameter("@SchIndustry", SqlDbType.VarChar, 50);
spr.Value = this.SchIndustry.SelectedValue.ToString();
cmd.Parameters.Add(spr);

spr = new SqlParameter("@CompanyName", SqlDbType.VarChar, 50);
spr.Value = this.addCompanyName.Text;
cmd.Parameters.Add(spr);

spr = new SqlParameter("@Picture", SqlDbType.VarChar, 5000);
spr.Value = "Upload/" + UploadFileName + FU.FileName;
cmd.Parameters.Add(spr);

cmd.ExecuteNonQuery();


存储过程

CREATE procedure inserCompany
@SchIndustry varchar(50),@CompanyName varchar(50),@Picture varchar(50)

as
insert into Company (SchIndustry,CompanyName,Picture) values (@SchIndustry,@CompanyName,@Picture)
GO
...全文
682 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序员老干部 2008-04-22
  • 打赏
  • 举报
回复
set id=@@IDENTITY
insert 子表
lovehongyun 2008-04-22
  • 打赏
  • 举报
回复
cs里搞:


private static void ExecuteSqlTransaction(string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();

SqlCommand command = connection.CreateCommand();
SqlTransaction transaction;

// Start a local transaction.
transaction = connection.BeginTransaction("SampleTransaction");

// Must assign both transaction object and connection
// to Command object for a pending local transaction
command.Connection = connection;
command.Transaction = transaction;

try
{
command.CommandText =
"Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
command.ExecuteNonQuery();
command.CommandText =
"Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
command.ExecuteNonQuery();

// Attempt to commit the transaction.
transaction.Commit();
Console.WriteLine("Both records are written to database.");
}
catch (Exception ex)
{
Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
Console.WriteLine(" Message: {0}", ex.Message);

// Attempt to roll back the transaction.
try
{
transaction.Rollback();
}
catch (Exception ex2)
{
// This catch block will handle any errors that may have occurred
// on the server that would cause the rollback to fail, such as
// a closed connection.
Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
Console.WriteLine(" Message: {0}", ex2.Message);
}
}
}
}
lovehongyun 2008-04-22
  • 打赏
  • 举报
回复
事务的(数据库中):

CREATE PROCEDURE dbo.usp_xxxx
(
@xxx int
)
AS
BEGIN

BEGIN TRAN
.........
..........
insert into ....
IF @@ERROR<>0 GOTO ERROR

COMMIT TRAN--提交事务
RETURN

ERROR:
ROLLBACK TRAN--回滚
RETURN

END
lovehongyun 2008-04-22
  • 打赏
  • 举报
回复
先来个返回自动增长id的存储过程:


CREATE PROCEDURE dbo.usp_Area_Insert
(
@AreaID int OUTPUT,
@AreaName varchar(20) = NULL
)
AS
BEGIN
SET NOCOUNT ON

INSERT INTO [Area]
(
[AreaName]
)
VALUES
(
@AreaName
)

SET @AreaID = SCOPE_IDENTITY()

SET NOCOUNT OFF
END
xiaoym1116 2008-04-22
  • 打赏
  • 举报
回复
能给几行最关键的示例吗?比如我上面那段。麻烦了,谢谢
nghf102 2008-04-22
  • 打赏
  • 举报
回复
收藏,学习了
nghf102 2008-04-22
  • 打赏
  • 举报
回复
收藏,学习了
cat_hsfz 2008-04-22
  • 打赏
  • 举报
回复
@@IDENTITY用在存储过程里。
xiaoym1116 2008-04-22
  • 打赏
  • 举报
回复
事务的问题也解决了

现在就是多用户同时操作的话,不知道会不会有错误
xiaoym1116 2008-04-22
  • 打赏
  • 举报
回复

as
insert into Picnews (picclass,pictitle,piccontent,onoff) values (@ProductsClass,@Title,@Content,@State)

insert into photo (picid,path) values (@@Identity,@Picture)

GO

谢谢楼上朋友帮忙。终于实现同时插入了,有个问题

@@Identity是取得当前发布的ID,可是如果多用户操作,并发数大了会出问题么?

看了网上资料说,最好把操作锁定,事务完成后再解锁

这个改如何实现呢?分不够再加,麻烦大家了
qituoshi 2008-04-21
  • 打赏
  • 举报
回复
编程/JAVA/.NET/C++ 群号:38850938
HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. 部署与测试 1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual)Session 3. 配置 3.1. 可编程的配置方式 3.2. 获得SessionFactory 3.3. JDBC连接 3.4. 可选的配置属性 3.4.1. SQL方言 3.4.2. 外连接抓取(Outer Join Fetching) 3.4.3. 二进制流 (Binary Streams) 3.4.4. 二级缓存与查询缓存 3.4.5. 查询语言中的替换 3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 3.8.4. JMX部署 4. 持久化类(Persistent Classes) 4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的(即无参数的)构造方法(constructor) 4.1.2. 提供一个标识属性(identifier property)(可选) 4.1.3. 使用非final的类 (可选) 4.1.4. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选) 4.2. 实现继承(Inheritance) 4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (可选) 5.1.9. property 5.1.10. 多对一(many-to-one) 5.1.11. 一对一 5.1.12. 自然ID(natural-id) 5.1.13. 组件(component), 动态组件(dynamic-component) 5.1.14. properties 5.1.15. 子类(subclass) 5.1.16. 连接的子类(joined-subclass) 5.1.17. 联合子类(union-subclass) 5.1.18. 连接(join) 5.1.19. 键(key) 5.1.20. 字段和规则元素(column and formula elements) 5.1.21. 引用(import) 5.1.22. any 5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5

62,046

社区成员

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

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

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

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