我有一个sql过程,但由于access只接受单个语句,我想通过代码端使用C#和Dbcommand控制differents语句...以便找到等效语句。这是sql程序,我要告诉你C#代码,但我收到了一个错误。
CREATE PROCEDURE CreateOrders
(@cartId char(36))
As
/*insert a new record into Commande étape 1 :"PasserCommande1"*/
DECLARE @CmdID int
INSERT INTO Commande DEFAULT VALUES
/*save the new commande id*/
SET @CmdID = @@IDENTITY
/*Add the order detail to DetailsCommande(orderdetails table) étape 2 :"PasserCommande2"*/
INSERT INTO DetailsCommande ( CmdID, ProduitID, ProduitTitre, Quantite, CoutUnitaire )
SELECT [@CmdID], livres.NumLivre, livres.titre, ShoppingCart.Quantite, livres.prix
FROM livres INNER JOIN ShoppingCart ON livres.NumLivre = ShoppingCart.ProduitID
WHERE ShoppingCart.CartID=[@CartID]
/*Clear the shopping Cart étape 3 :"PasserCommande3"*/
DELETE FROM ShoppingCart
WHERE CartID = @CartID
/*return the order id étape 4:"PasserCommande4"*/
SELECT @CmdID;
所以我在4个不同的语句中分离了这个程序,这样我就可以用c#逐一调用它们,但是当从Commande表中检索@@ identity值并将它放在DetailsCommande中时我得到了一个错误。 CmdID在表Commande中有一个标识属性。这是我在C#中尝试做的事情:
public static string PasserCommande()
{
//étape 1
//on obtient l'objet configuré DbCommande
DbCommand m_cmd = LibAccesGenerique.CreerCmd();
//on définit la procédure stockée
m_cmd.CommandText = "PasserCommande_1";
LibAccesGenerique.ExecuteNonQuery(m_cmd);
//étape 2
DbCommand m_cmd1 = LibAccesGenerique.CreerCmd();
m_cmd1.CommandText = "PasserCommande_2";
//on crée un nouveau paramètre
DbParameter m_param = m_cmd1.CreateParameter();
m_param.ParameterName = "@CmdID";
m_param.Value = "@@IDENTITY";
m_param.DbType = DbType.Int32;
m_cmd1.Parameters.Add(m_param);
//2ème param
m_param = m_cmd1.CreateParameter();
m_param.ParameterName = "@CartID";
m_param.Value = ShoppingCartId;
m_param.DbType = DbType.String;
m_param.Size = 36;
m_cmd1.Parameters.Add(m_param);
LibAccesGenerique.ExecuteNonQuery(m_cmd1);
//étape3
DbCommand m_cmd2 = LibAccesGenerique.CreerCmd();
m_cmd2.CommandText = "PasserCommande3";
DbParameter m_param2 = m_cmd2.CreateParameter();
m_param2 = m_cmd1.CreateParameter();
m_param2.ParameterName = "@CartID";
m_param2.Value = ShoppingCartId;
m_param2.DbType = DbType.String;
m_param2.Size = 36;
m_cmd2.Parameters.Add(m_param);
LibAccesGenerique.ExecuteNonQuery(m_cmd2);
//étape 4
DbCommand m_cmd3 = LibAccesGenerique.CreerCmd();
m_cmd3.CommandText = "PasserCommande_4";
//on créer un nouveau paramètre
DbParameter m_param1 = m_cmd3.CreateParameter();
m_param1.ParameterName = "@CmdID";
m_param1.Value = "@@IDENTITY";
//m_param1.Direction = ParameterDirection.InputOutput;
m_param1.DbType = DbType.Int32;
m_cmd3.Parameters.Add(m_param1);
return LibAccesGenerique.ExecuteScalar(m_cmd3);
}
我在评论中提到了etape 2的错误。例外情况说输入字符串的格式不正确...我确定当我尝试将@@身份分配给@cmdID参数时。我不知道是否有另一种编码方式。
答案 0 :(得分:1)
@@IDENTITY
适用于访问,但它有点普通。尝试将其作为直接命令发送
SELECT @@IDENTITY;
使用ExecuteScalar
将结果分配给变量,然后将该变量分配给参数。另请注意,访问时,@@IDENTITY
仅适用于普通AutoNumber
,而非ReplicationID
(GUID)。
答案 1 :(得分:0)
您应该将@@Identity
作为'输出'参数返回。将输出参数添加到存储过程,并使用Direction = ParameterDirection.Output
将相同的参数添加到C#代码中。
请参阅此答案,以获得一个很好的例子:Using stored procedure output parameters in C#
此外,作为最佳做法,请考虑将@@Identity
更改为Scope_Identity()
。