【发布时间】: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 参数时会出现这种情况。不知道有没有其他的编码方式。
【问题讨论】:
-
与论坛网站不同,我们不使用“谢谢”、“感谢任何帮助”或Stack Overflow 上的签名。请参阅“Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?.
标签: c# sql-server ms-access stored-procedures