【问题标题】:the equivalent of a sql procedure in access query相当于访问查询中的 sql 过程
【发布时间】:2013-12-06 19:57:52
【问题描述】:

我有一个 sql 过程,但由于 access 只接受单个语句,我想通过代码端使用带有 Dbcommand 的 C# 来控制不同的语句...以便找到等价物。这是 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);

}

当我放入 cmets 时,etape 2 出现错误。异常表示输入字符串的格式不正确...我确定当我尝试将@@identity 分配给@cmdID 参数时会出现这种情况。不知道有没有其他的编码方式。

【问题讨论】:

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


【解决方案1】:

@@IDENTITY 与访问一起工作,但它有点普通。尝试将其作为直接命令发送

SELECT @@IDENTITY;

使用ExecuteScalar 将结果分配给变量,然后将该变量分配给参数。另请记住,在访问时,@@IDENTITY 仅适用于普通 AutoNumber,而不适用于 ReplicationID (GUID)。

【讨论】:

    【解决方案2】:

    您应该将@@Identity 作为“输出”参数返回。向您的存储过程添加一个输出参数,并使用Direction = ParameterDirection.Output 向您的 C# 代码添加一个相同的参数。

    请参阅此答案以获取一个很好的示例:Using stored procedure output parameters in C#

    此外,作为最佳做法,请考虑将 @@Identity 更改为 Scope_Identity()

    【讨论】:

      猜你喜欢
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 2017-11-08
      相关资源
      最近更新 更多