我是绿色的,因为它可以使用C#和存储过程,所以这是一个真正的学习经验,但我几乎在那里。我有两个存储过程(第一个调用第二个然后在第二个完成后完成并返回新创建的记录的文档ID ...'DID')在我的测试之外正常工作C#代码。
这是从我在C#页面后面的ASP.NET Web项目代码中调用的,我基于Microsoft KB文章(kb#320916)的大多数逻辑。如果您查看底部代码段,您将看到我从中提取引用的部分。
当我正在彻底解决这个问题时,它确实非常有意义,直到我找到他们正在撤回一个包含多个记录的数据集的部分,我心里想着'哦,我在这里遇到了麻烦!'因为我只需要一个我需要的值,并且不要期望或者想要比返回的单个值更多。只是那个记录ID。 以下是我到目前为止的情况:
SqlConnection GETTNewDocs = new SqlConnection("server = gbaptccsr01; database = ARFS; Integrated Security=True");
SqlDataAdapter InsertANewDoc = new SqlDataAdapter("putthedatain", GETTNewDocs);
InsertANewDoc.SelectCommand.CommandType = CommandType.StoredProcedure;
InsertANewDoc.SelectCommand.Parameters.Add(new SqlParameter("@EventID", SqlDbType.VarChar(50)));
InsertANewDoc.SelectCommand.Parameters["@EventID"].Value = (EleIDLBL.Text).Trim();
InsertANewDoc.SelectCommand.Parameters.Add(new SqlParameter("@AltSub", SqlDbType.Int));
InsertANewDoc.SelectCommand.Parameters.["@AltSub"].Value = (Convert.ToInt32(Session["AltSubDocIdx"])+5);
InsertANewDoc.SelectCommand.Parameters["@DID"].Direction = ParameterDirection.Output;
正在调用并返回数据的存储过程本身如下所示:
CREATE PROCEDURE [dbo].[NewGETTDoc]
@EventID VARCHAR(50),
@AltSub int,
@DocName VARCHAR(512) = "New",
@new_identity int = NULL OUTPUT,
@param1 VARCHAR(50) = @EventID
AS BEGIN
SET NOCOUNT ON;
INSERT dbo.GETT_Documents(EID, alt_sub_idx, DocName )SELECT @EventID, @AltSub, @DocName;
SET @new_identity = SCOPE_IDENTITY();
EXEC UpdateSubIdx @param1
END
答案 0 :(得分:0)
由于代码不完整而难以说明,所以我在黑暗中拍摄,但尝试删除此行(因为SP没有名为@DID的参数);
InsertANewDoc.SelectCommand.Parameters["@DID"].Direction = ParameterDirection.Output;
并添加这些;
InsertANewDoc.SelectCommand.Parameters.Add(new SqlParameter("@new_identity", SqlDbType.Int));
InsertANewDoc.SelectCommand.Parameters.["@new_identity"].Direction = ParameterDirection.Output;
在数据库调用之后,你可以使用它来获取C#中的新ID;
int newID = int.Parse(InsertANewDoc.SelectCommand.Parameters.["@new_identity"].Value);
答案 1 :(得分:0)
您的代码中存在错误,可以在此处使用一些更好的做法。
首先(错误),您应该准确地命名参数,因为存储过程期望它们被命名并使用正确的语法来构建它们(SqlDbType.NVarChar(50)将被错误地解释为对名为的方法的调用SqlDbType类中的NVarChar ???)
其次,您不需要SqlDataAdapter。您只是插入一个新行,因此不需要使用专门为返回记录而构建的类。一个简单的SqlCommand就可以了。
第三,一次性物品应使用using
声明
using(SqlConnection con = new SqlConnection(.....))
using(SqlCommand cmd = new SqlCommand("NewGETTDoc", con))
{
con.Open();
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@EventID", SqlDbType.VarChar, 50).Value = EleIDLBL.Text.Trim();
cmd.Parameters.Add("@AltSub", SqlDbType.Int).Value = Convert.ToInt32(Session["AltSubDocIdx"])+5;
SqlParameter p = cmd.Parameters.Add("@new_identity", SqlDbType.Int)
p.Direction = ParameterDirection.Output;
int rowsAffected = cmd.ExecuteNonQuery();
if(rowsAffected > 0)
{
int newID = Convert.ToInt32(p.Value);
... do your task with the newID ....
}
}