DataAdapter不会删除数据库行

时间:2018-03-25 07:26:24

标签: c# sql-server dataadapter framework3.5

我正在使用DataSets和SQL Server处理.Net Framework 3.5这个非常古老的项目。所以我需要做点什么。

我遇到了从数据库中删除行的问题。这是我的测试代码:

using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TypedDataSetTest.UsersDataSetTableAdapters;

namespace TypedDataSetTest
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var userAdapter = new UserTableAdapter())
            {
                var users = userAdapter.GetData();

                userAdapter.DeleteAll();
                users.Clear();    

                PopulateUsers(users, userAdapter);
                PrintData(users);

                var user1 = users.Single(user => user.Name == "user1");
                user1.Delete();
                user1.AcceptChanges();
                //users.AcceptChanges();
                //userAdapter.Update(user1);

                var user2 = users.Single(user => user.Name == "user2");
                user2.Name = "user3";
                //mary.AcceptChanges();
                //users.AcceptChanges();
                //userAdapter.Update(user2);

                userAdapter.Update(users);

                PrintData(users);
            }

            Console.ReadLine();
        }

        private static void PrintData(UsersDataSet.UserDataTable users)
        {
            users.ToList().ForEach(user => Console.WriteLine("{0} {1} {2} {3:dd/MM/yyyy} {4}", user.Id, string.IsNullOrWhiteSpace(user.Field<string>("Name")) ? "" : user.Field<string>("Name"), user.Surname, user.Field<DateTime?>("BirthDate").GetValueOrDefault(), user.TIN));
            Console.WriteLine();
        }


        private static void PopulateUsers(UsersDataSet.UserDataTable users, UserTableAdapter userAdapter)
        {
            var user1 = users.NewUserRow();
            user1.Name = "user1";
            user1.Surname = "user1 surname";
            user1.BirthDate = new DateTime(1970, 12, 03);
            user1.TIN = "123123";

            var user2 = users.NewUserRow();
            user2.Name = "user2";
            user2.Surname = "user2 surname";
            user2.BirthDate = new DateTime(1974, 2, 14);
            user2.TIN = "456456";

            var newUsers = new UsersDataSet.UserRow[] { user1, user2 };
            userAdapter.Connection.Open();

            newUsers.ToList().ForEach(user =>
            {
                if (userAdapter.InsertUser(user) > 0)
                {
                    users.AddUserRow(user);
                    users.AcceptChanges();
                }                
            });

            userAdapter.Connection.Close();
        }
    }
}

所有数据库操作都是通过存储过程执行的:

CREATE PROCEDURE [dbo].[User_Delete]
    (@Id INT)
AS
    --set nocount on;
    DELETE FROM [dbo].[User] 
    WHERE (Id = @Id);
GO

CREATE PROCEDURE [dbo].[User_DeleteAll]
AS
    SET NOCOUNT ON;

    DELETE FROM [dbo].[User];
GO

CREATE PROCEDURE [dbo].[User_Insert](
    @Name NVARCHAR(50),
    @Surname NVARCHAR(50),
    @BirthDate DATETIM2(7),
    @TIN NVARCHAR(50))
AS
    SET NOCOUNT ON;

    INSERT INTO [dbo].[User] ([Name], [Surname], [BirthDate], [TIN])
    VALUES (@Name, @Surname, @BirthDate, @TIN);

    SELECT SCOPE_IDENTITY();   
GO

CREATE PROCEDURE [dbo].[User_SelectAll]
AS 
    SET NOCOUNT ON;

    SELECT    
        [Id], [Name], [Surname], [BirthDate], [TIN]
    FROM 
        [dbo].[User];
GO

CREATE PROCEDURE [dbo].[User_Update]
    (@Id INT,
     @Name NVARCHAR(50),
     @Surname NVARCHAR(50),
     @BirthDate DATETIME2(7),
     @TIN NVARCHAR(50))
AS
     SET NOCOUNT ON;

     UPDATE [dbo].[User]
     SET [Name] = @Name,
         [Surname] = @Surname,
         [BirthDate] = @BirthDate,
         [TIN] = @TIN
     WHERE (Id = @Id)
GO

这里还有我的xsd和表适配器信息,全都是本书(我认为):

enter image description here

此代码似乎在控制台上运行,user1从DataTable中删除,user2名称更改为&#34; user3&#34;。

但是在数据库表中,只保留名称的更改。 User1未被删除。

如果我致电userAdapter.Update(user1);一切都很好。我尝试过在互联网上发现的几件事,但似乎没什么用。

看起来userAdapter无法找到DeleteCommand行的user1。没有例外,只是它不会从数据库中删除它。

我错过了什么吗?有什么我做错了吗?

1 个答案:

答案 0 :(得分:0)

我发现了问题。这段代码工作正常:

using (var userAdapter = new UserTableAdapter())
            {
                var users = userAdapter.GetData();

                userAdapter.DeleteAll();
                users.Clear();    

                PopulateUsers(users, userAdapter);
                PrintData(users);

                var user1 = users.Single(user => user.Name == "user1");
                var user2 = users.Single(user => user.Name == "user2");

                user1.Delete(); 
                user2.Name = "user3";

                userAdapter.Update(users);

                PrintData(users);
            }

在之前的版本中,如果user2被“标记”为删除,我找不到user1,因此我致电AcceptChanges以便能够遍历users获取user2的数据表。调用user1.AcceptChanges();更改了user1行的状态,因此没有删除信息。

所以一切都很好!