【问题标题】:Stored procedure doesn't insert into table存储过程不插入到表中
【发布时间】:2014-05-03 02:10:23
【问题描述】:

我在名为 AddNewStudent 的数据库中有一个简单的存储过程:

    CREATE PROCEDURE dbo.AddNewStudent(
    @fName nvarchar(20),
    @sName nvarchar(20),
    @lName nvarchar(20),
    @faculty nvarchar(10),
    @specialty nvarchar(50),
    @OKS smallint,
    @StudentStat smallint,
    @fak nvarchar(50),
    @Course smallint,
    @Porok nvarchar(5),
    @Group int
    )
    AS
    INSERT INTO [Students] (FirstName, SecondName, LastName, Faculty,
    Specialty, OKS, StudentStatus, FakNumber, Course, Potok, [[Group]]])
    VALUES (@fName , @sName, @lName, @faculty, @specialty, @OKS,
    @StudentStat, @fak, @Course, @Porok, @Group)
    RETURN 2;

当我通过 DatabaseExplorer (VS2013) 测试该过程时,一切正常,记录被插入到表中。但是当我在 c# 中调用该过程时,什么也没有发生。下面是我用来调用该过程的方法的代码:

    public static bool InsertStudent (Student student)
    {
        StudentDataClassesDataContext dc = new StudentDataClassesDataContext();
        try
        {
           int returnValue = dc.AddNewStudent(student.FirstName, student.SecondName, student.LastName, student.Faculty, student.Specialty, student.OKS, student.StudentStatus,
                student.FakNumber, student.Course, student.Potok, student._Group_);
            dc.SubmitChanges();
            MessageBox.Show("Return Value : " + returnValue, "Info", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
        catch (Exception e)
        {
            MessageBox.Show("Exception : " + e.Message, "Info", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            return false;
        }
        return true;
    }

返回值为 2 表示程序正常工作,但为什么表中没有插入记录?我读到使用 dc.SubmitChanges() 而不是 Commit。

【问题讨论】:

  • 你看到带有Return Value: 2的消息框吗?
  • 您使用的是什么连接字符串
  • 你在存储过程结束时提交了吗?
  • 从 SSME 配置您的数据库,然后通过您的服务器资源管理器连接它,它会工作。我在 .net 中创建基于窗口的项目时遇到了同样的问题,所以这就是我摆脱它的方式..试试吧
  • Hamlet Hakobyan :是的,我收到 2 作为返回值,我在消息框中看到它 marc_s :我不使用连接字符串,因为我使用 DataContext 建立连接 Ramie :我没有提交,但是当从数据库调用该过程时,我也没有提交,但插入了记录。 dc.SubmitChanges() 也不做提交吗? SKT:你能告诉我如何从 SSME 配置我的数据库吗?

标签: c# sql .net sql-server stored-procedures


【解决方案1】:

你可以启动Sqlserver Profiler看看会发生什么,看看有没有没有commit的事务启动? 您也可以在 dc.submitchanges() 之后设置一个断点,当您的应用程序遇到断点时,转到 sql server 并运行此查询

Select * from [Students] with (nolock)

并确保数据在您的表中,然后继续运行您的应用程序并再次运行该查询,如果数据在您的表中并且没有它已经消失,则存在未提交的事务。要解决这个问题,只需使用 TransactionScope。如果数据从一开始就不在您的表中,您可能会在另一个数据库上运行您的代码。您可以在 datacontext 构造函数中传递连接字符串。

【讨论】:

  • 嗨 RezaRahmati,感谢您的回答。我确实在 dc.submitchanges() 之后设置了一个断点,我检查了数据库但没有插入任何记录。我尝试了另一种方法,但结果是一样的——没有插入记录。但是,当涉及从数据库中选择查询时,它会返回信息。特权可能有问题吗? Bellow是我使用的新方法。如您所见,我尝试使用 TransactionScope,但没有任何改变
  • 只是为了确定您是否在cmd.ExecuteNonQuery() 之后的查询中设置了with(nolock),因为您的数据在事务中,除非您使用with(nolock),否则数据在提交事务之前不会显示
  • 不,我没有在我的查询中设置with(nolock)。 scope.Complete() 不是在提交事务吗?
  • 我的意思是当你到达断点时(正如我之前提到的)事务还没有提交,为了检查记录是否真的在表中,你必须使用 with(nolock) 来获取脏也有记录。因为我想知道你说你检查了数据库并且断点处没有插入记录
  • 您也可以将 sql profiler 跟踪发送给我,看看发生了什么(因为您的代码似乎是正确的)
【解决方案2】:

代码一切正常。问题在于数据库和项目本身之间的链接。

【讨论】:

  • 需要详细说明吗?
猜你喜欢
  • 2016-09-05
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
相关资源
最近更新 更多