100分请教:添加sql语句后返回主键值的问题

dzswej 2008-08-08 12:48:27
.cs里面的代码:
public int AddOrder(string orderNo,int userID,int totalNumber,decimal totalMoney)
{ ///获取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].ConnectionString;
///创建连接
SqlConnection con = new SqlConnection(connectionString);
///设置被执行存储过程的名称

string cmdText = "INSERT INTO sc_order(orderno,userid,totalsl,totalmo,shij)VALUES(@orderNo,@UserID,@totalNumber,@totalMoney,GETDATE()) RETURN @@Identity";
///创建SqlCommand
SqlCommand cmd = new SqlCommand(cmdText,con);

///创建参数并赋值
cmd.Parameters.Add("@orderNo",SqlDbType.VarChar,50);
cmd.Parameters.Add("@UserID",SqlDbType.Int,4);
cmd.Parameters.Add("@totalNumber",SqlDbType.Int,4);
cmd.Parameters.Add("@totalMoney",SqlDbType.Money);
cmd.Parameters[0].Value = orderNo;
cmd.Parameters[1].Value = userID;
cmd.Parameters[2].Value = totalNumber;
cmd.Parameters[3].Value = totalMoney;

cmd.Parameters.Add("@RETURN", SqlDbType.Int, 4);
cmd.Parameters[4].Direction = ParameterDirection.ReturnValue;

int result = -1;
try
{ ///打开连接
con.Open();
///操作数据
result = cmd.ExecuteNonQuery();
}
catch(Exception ex)
{ ///抛出异常
throw new Exception(ex.Message,ex);
}
finally
{ ///关闭连接
con.Close();
}

return (int)cmd.Parameters[4].Value;
}

调用页面中的代码:
int orderID = order.AddOrder(orderNo,userID,totalNumber,totalMoney);
错误提示:在此上下文中不能使用带有返回值的 RETURN 语句
...全文
378 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanchao1988 2009-12-14
  • 打赏
  • 举报
回复
谢谢
Feiin 2008-08-08
  • 打赏
  • 举报
回复
cmd.Parameters[4].Direction = ParameterDirection.Output
downmoon 2008-08-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dandanmei 的回复:]
把RETURN @@Identity 改为 select @@identity

[/Quote]
xiaolei1982 2008-08-08
  • 打赏
  • 举报
回复
不好意思,看差了
!-_-
dzswej 2008-08-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dandanmei 的回复:]
把RETURN @@Identity 改为 select @@identity
[/Quote]

还是不能
amandag 2008-08-08
  • 打赏
  • 举报
回复
1.如果要使用返回值,返回值的参数必须要第一个添加
2. 这个案例用输出参数更合适

    public int AddOrder(string orderNo, int userID, int totalNumber, decimal totalMoney)
{ ///获取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].ConnectionString;
///创建连接
SqlConnection con = new SqlConnection(connectionString);
///设置被执行存储过程的名称

string cmdText = "INSERT INTO sc_order(orderno,userid,totalsl,totalmo,shij)VALUES(@orderNo,@UserID,@totalNumber,@totalMoney,GETDATE());set @id = scope_identity()";
///创建SqlCommand
SqlCommand cmd = new SqlCommand(cmdText, con);

cmd.Parameters.Add("@id", SqlDbType.Int, 4).Direction = ParameterDirection.Output;

///创建参数并赋值
cmd.Parameters.AddWithValue("@orderNo", orderNo);
cmd.Parameters.AddWithValue("@UserID", userID);
cmd.Parameters.AddWithValue("@totalNumber", totalNumber);
cmd.Parameters.AddWithValue("@totalMoney", totalMoney);

try
{ ///打开连接
con.Open();
///操作数据
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{ ///抛出异常
throw new Exception(ex.Message, ex);
}
finally
{ ///关闭连接
con.Close();
}

return (int)cmd.Parameters["@id"].Value;
}
Feiin 2008-08-08
  • 打赏
  • 举报
回复
设置@RETURN为输出参数
然后

set @RETURN=@@identity

xiaolei1982 2008-08-08
  • 打赏
  • 举报
回复
try
{ ///打开连接
con.Open();
///操作数据
result = cmd.ExecuteNonQuery();
return (int)cmd.Parameters[4].Value;
}
catch(Exception ex)
{ ///抛出异常
throw new Exception(ex.Message,ex);
}
finally
{ ///关闭连接
con.Close();
}
}
dandanmei 2008-08-08
  • 打赏
  • 举报
回复
把RETURN @@Identity 改为 select @@identity
lovehongyun 2008-08-08
  • 打赏
  • 举报
回复
汗...
lz真厚道,分全给我了.呵呵.

可怜楼上的几位兄弟-_-!!
dzswej 2008-08-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lovehongyun 的回复:]
return result==null?0:Convert.ToInt32(o);
写错了.
-->
return result==null?0:Convert.ToInt32(result);
[/Quote]

好了 可以了 谢谢!
a2068879 2008-08-08
  • 打赏
  • 举报
回复
public int AddOrder(string orderNo,int userID,int totalNumber,decimal totalMoney)
{ ///获取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].ConnectionString;
///创建连接
SqlConnection con = new SqlConnection(connectionString);
///设置被执行存储过程的名称

string cmdText = "INSERT INTO sc_order(orderno,userid,totalsl,totalmo,shij)VALUES(@orderNo,@UserID,@totalNumber,@totalMoney,GETDATE()) select @@Identity";
///创建SqlCommand
SqlCommand cmd = new SqlCommand(cmdText,con);

///创建参数并赋值
cmd.Parameters.Add("@orderNo",SqlDbType.VarChar,50);
cmd.Parameters.Add("@UserID",SqlDbType.Int,4);
cmd.Parameters.Add("@totalNumber",SqlDbType.Int,4);
cmd.Parameters.Add("@totalMoney",SqlDbType.Money);
cmd.Parameters[0].Value = orderNo;
cmd.Parameters[1].Value = userID;
cmd.Parameters[2].Value = totalNumber;
cmd.Parameters[3].Value = totalMoney;

object result = null;
try
{ ///打开连接
con.Open();
///操作数据
result = cmd.ExecuteScalar();
}
catch(Exception ex)
{ ///抛出异常
throw new Exception(ex.Message,ex);
}
finally
{ ///关闭连接
con.Close();
}

return result==null?0:Convert.ToInt32(o);
}
这个对
lovehongyun 2008-08-08
  • 打赏
  • 举报
回复
return result==null?0:Convert.ToInt32(o);
写错了.
-->
return result==null?0:Convert.ToInt32(result);
lovehongyun 2008-08-08
  • 打赏
  • 举报
回复
程序我帮你改了,你试一下吧.

public int AddOrder(string orderNo,int userID,int totalNumber,decimal totalMoney)
{ ///获取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].ConnectionString;
///创建连接
SqlConnection con = new SqlConnection(connectionString);
///设置被执行存储过程的名称

string cmdText = "INSERT INTO sc_order(orderno,userid,totalsl,totalmo,shij)VALUES(@orderNo,@UserID,@totalNumber,@totalMoney,GETDATE()) select @@Identity";
///创建SqlCommand
SqlCommand cmd = new SqlCommand(cmdText,con);

///创建参数并赋值
cmd.Parameters.Add("@orderNo",SqlDbType.VarChar,50);
cmd.Parameters.Add("@UserID",SqlDbType.Int,4);
cmd.Parameters.Add("@totalNumber",SqlDbType.Int,4);
cmd.Parameters.Add("@totalMoney",SqlDbType.Money);
cmd.Parameters[0].Value = orderNo;
cmd.Parameters[1].Value = userID;
cmd.Parameters[2].Value = totalNumber;
cmd.Parameters[3].Value = totalMoney;

object result = null;
try
{ ///打开连接
con.Open();
///操作数据
result = cmd.ExecuteScalar();
}
catch(Exception ex)
{ ///抛出异常
throw new Exception(ex.Message,ex);
}
finally
{ ///关闭连接
con.Close();
}

return result==null?0:Convert.ToInt32(o);
}

dzswej 2008-08-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lovehongyun 的回复:]
string cmdText = "INSERT INTO sc_order(orderno,userid,totalsl,totalmo,shij)VALUES(@orderNo,@UserID,@totalNumber,@totalMoney,GETDATE()) RETURN @@Identity";

---------->

string cmdText = "INSERT INTO sc_order(orderno,userid,totalsl,totalmo,shij)VALUES(@orderNo,@UserID,@totalNumber,@totalMoney,GETDATE()) select @@identity";

然后不用return参数.直接用cmd.ExecuteScalar ()执行即可.
[/Quote]

返回OrderID的值为0

数据添加不成功啊~!
lovehongyun 2008-08-08
  • 打赏
  • 举报
回复
declare @table table
(
id int IDENTITY,
v_name varchar(10)
)

insert into @table (v_name) values ('a') select @@identity
insert into @table (v_name) values ('b') select @@identity


你可以在查询分析器里运行上面的脚本试一下

他取出来的就是你插入数据的id,
所以你C#里边取的时候只需要用cmd.ExecuteScalar ()执行即可.返回的数据就是你要得到的值
dzswej 2008-08-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 amandag 的回复:]
1.如果要使用返回值,返回值的参数必须要第一个添加
2. 这个案例用输出参数更合适


C# code public int AddOrder(string orderNo, int userID, int totalNumber, decimal totalMoney)
{ ///获取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].ConnectionString;
///创建连接
SqlConnection con = new SqlConnection(connect…
[/Quote]

提示错误: cmd.ExecuteNonQuery();
但好像没有错误!~
lovehongyun 2008-08-08
  • 打赏
  • 举报
回复
string cmdText = "INSERT INTO sc_order(orderno,userid,totalsl,totalmo,shij)VALUES(@orderNo,@UserID,@totalNumber,@totalMoney,GETDATE()) RETURN @@Identity";

---------->

string cmdText = "INSERT INTO sc_order(orderno,userid,totalsl,totalmo,shij)VALUES(@orderNo,@UserID,@totalNumber,@totalMoney,GETDATE()) select @@identity";

然后不用return参数.直接用cmd.ExecuteScalar ()执行即可.
zpcoder 2008-08-08
  • 打赏
  • 举报
回复


return (select @@Identity)

62,074

社区成员

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

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

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

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