c#sql存储过程是';不承诺
每当我运行下面的代码时,我都会得到预期的输出c#sql存储过程是';不承诺,c#,sql,sql-server,stored-procedures,commit,C#,Sql,Sql Server,Stored Procedures,Commit,每当我运行下面的代码时,我都会得到预期的输出 private int NewBorrower(string givenName, string surname) { int returnValue = 0; using (conn) { conn.Open(); string sql = "AddBorrower"; cmd = new SqlCommand(sql, conn); cmd.CommandT
private int NewBorrower(string givenName, string surname)
{
int returnValue = 0;
using (conn)
{
conn.Open();
string sql = "AddBorrower";
cmd = new SqlCommand(sql, conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@givenName", SqlDbType.NVarChar).Value = givenName;
cmd.Parameters.Add("@surname", SqlDbType.NVarChar).Value = surname;
SqlParameter id = cmd.Parameters.Add("@id", SqlDbType.Int);
id.Direction = ParameterDirection.ReturnValue;
try
{
cmd.ExecuteNonQuery();
returnValue = (int)cmd.Parameters["@id"].Value;
}
catch (Exception e)
{
Console.WriteLine("Commit Exception Type: {0}", e.GetType());
Console.WriteLine(" Message: {0}", e.Message);
}
}
return returnValue;
}
当从前端运行时,我得到了我想要的结果,但是当我检查数据库时,它不会显示在表中
为了便于测量,这也是正在使用的存储过程
CREATE PROCEDURE [dbo].[AddBorrower]
@givenName nvarchar(50),
@surname nvarchar(50),
@id int = NULL OUTPUT
AS
INSERT INTO llBorrowers (givenName, surname)
VALUES (@givenName, @surname);
SET @id = SCOPE_IDENTITY();
RETURN @id
我曾尝试在c#和sql端使用事务,但根本不起作用。
我还应该提到它是一个本地数据库,但我不确定这是否会影响它。您可以尝试在C#part中创建一个SQLTransaction 另外,尝试更改代码,如-
//Just create a SQL connection - cmd = new SqlCommand(conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "AddBorrower";
在WinForms应用程序中使用DataDirectory替换字符串时,其实际值会根据调试或发布配置而变化 在调试中,DataDirectory指向PROJECTFOLDER\BIN\DEBUG(如果是x86变体)。
所以很容易被这个愚弄。您在服务器资源管理器中创建了一个连接,但在其他数据库上工作的代码会忽略此连接 您可以在服务器资源管理器中创建另一个连接,并将其命名为DebugConnection,在使用DebugConnection检查代码是否按预期执行时,仍保留原始连接以进行架构更改 作为旁注,请特别注意MDF文件上的属性
复制到输出目录
属性(如果该属性列在项目项之间)。如果将其设置为Copy Always
,则每次启动调试会话时,都会将数据库的新副本从项目目录复制到输出目录,从而有效地销毁代码执行的更新。我建议将其设置为Copy Never
,并手动处理数据库架构更改
参考资料:@CyanideGiraffe-尝试上述解决方案我尝试创建一个事务,但没有成功。其次,在初始化对象时,我已经设置了命令文本。请参见第9行和第10行,从中删除设置命令文本-按照上面的答案添加。另外,您可以调试并查看存储过程正在运行的ReturnedValues的值是多少。它正在返回数字2。因为这将是下一个逻辑ID,因为此表中只有记录。是否在LL借款人上定义了任何触发器?是否正在查看正确的数据库?另外,如果您使用的是那些不推荐使用的用户实例的.mdf文件,并且该文件包含在您的项目中,且“复制到输出目录”设置为true,则每次生成项目时,该副本都将覆盖bin文件夹中的一个。如果出现此问题,如何将其设置为false?我不知道该设置在哪里。如果您的项目中包含了.mdf,请在解决方案资源管理器中单击它,然后按alt+enter(至少这是“常规开发”的设置),您应该会看到项目属性。如果您尝试了该设置,它并没有解决问题。不,它是不同的。检查你的BIN\DEBUG\DATA文件夹,你会发现那里有一个MDF+1,用和你一样多的词说“你需要查看正确的数据库,不要每次都覆盖它…”。@ta.speot.is是的,甚至我妻子说我太冗长:-)(这里没有提供关闭开关)