相当于访问查询中的sql过程

时间:2013-12-06 19:57:53

标签: c# sql-server ms-access stored-procedures

我有一个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参数时。我不知道是否有另一种编码方式。

2 个答案:

答案 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()