SELECT @@IDENTITY 绝对奇怪 不信你试试

nbtryy 2010-03-29 09:30:41
今天我在写程序的时候碰到了非常奇怪的问题:也许是ACCSS本身有什么问题
用sqlserver 2000没有出现问题
例子:
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ System.Web.HttpContext.Current.Server.MapPath(ConfigurationManager.ConnectionStrings["DbPath"].ToString());
conn.Open();
OleDbCommand comm = new OleDbCommand();
comm.Connection = conn;
OleDbTransaction tx = conn.BeginTransaction();

//SqlConnection conn = new SqlConnection();

//conn.ConnectionString = "Data Source=(local);Initial Catalog=Demo;User ID=sa;Password=greedisgood";
//conn.Open();
//SqlCommand comm = new SqlCommand();
//comm.Connection = conn;

//SqlTransaction tx = conn.BeginTransaction();
comm.Transaction = tx;
try
{
// class 一对多 完整约束 Product 一对多 完整约束 userTable
string cls = "Insert into Class(class)values('123123');";
string product = "Insert into Product(product,class)values('123123',@Class);";
string user = "Insert Into userTable(username,productID) values('123123123',@Product);";

long cId = 0;
comm.CommandText = cls;
comm.ExecuteNonQuery();
comm.CommandText = "SELECT @@IDENTITY AS ID;";
cId = Convert.ToInt64(comm.ExecuteScalar());

long pId;
comm.CommandText = product;
comm.Parameters.AddWithValue("@Class", cId);
comm.ExecuteNonQuery();
comm.CommandText = "SELECT @@IDENTITY AS ID;";
pId = Convert.ToInt64(comm.ExecuteScalar());

//错误地点 似乎我插入这条数据的时候上一条数据还没有写进数据库中 结果 提示我“由于数据表 'Product' 需要一个相关记录,不能添加或修改记录”,这条错误是因为我 product 对 userTable 是一对多的关系 有完整性约束 ,提示我Product没有对应的数据,但是上条语句PID都可以获得 我已经调试很多边了 你们也可以试试;但是如果我把clsSQL语句去掉 comm.Parameters.AddWithValue("@Class", 1); CID用硬编码从class表上取个ID值 就可以顺利执行,不知道为什么
comm.CommandText = user;
comm.Parameters.AddWithValue("@Product", pId);
comm.ExecuteNonQuery();

tx.Commit();
}
catch (Exception e1)
{

tx.Rollback();
conn.Close();
throw e1;
}
...全文
146 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
nbtryy 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 acmain_chm 的回复:]
不信

改成如下再试,然后再发表你的评论。

string product = "Insert into Product(product,class)values('123123',?);";
comm.Parameters.AddWithValue("?", cId);
[/Quote]


无语 “?”是java的占位符吧 你有没有明白我的意思啊
ACMAIN_CHM 2010-03-29
  • 打赏
  • 举报
回复
不信

改成如下再试,然后再发表你的评论。

string product = "Insert into Product(product,class)values('123123',?);";
comm.Parameters.AddWithValue("?", cId);
nbtryy 2010-03-29
  • 打赏
  • 举报
回复
sqlserver可以的为什么 逻辑的是 就是插入一个CLASS 取出插入值的自增ID,

product 用CLASS的ID 关联

在取出 Product新插入的值的ID

usertable用product 的ID关联
zc_0101 2010-03-29
  • 打赏
  • 举报
回复
不用试,@@IDENTITY的值是当前会话所有作用域中的自增值,你看一下你的逻辑是不是有问题,或者是遗漏了什么
nbtryy 2010-03-29
  • 打赏
  • 举报
回复
你们可以用sqlserver也试一下 我现在理解ACCSS为什么不是数据库了 而是数据文件了。
nbtryy 2010-03-29
  • 打赏
  • 举报
回复
怎么恐怕不能用语言说清楚 你如果有VS的话复制一下再用ACCSS照 我上面的约束建3个表试一下
zc_0101 2010-03-29
  • 打赏
  • 举报
回复
写这么长,倒不如用语言描述一下你到底遇到了什么问题,因为我不懂C#

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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