插入sql-数据库,报告成功但没有行

Inserting into sql-database, reporting success but no rows

我是一名尝试自学 C#/.NET 的大学生(遗憾的​​是我的流不教它),但在插入 SQL 数据库(在此示例中我使用的是 Sql 服务器)。令我困惑的是代码报告成功,但是当我检查 table 的数据时,什么也没有。这是我尝试写入数据库的代码:

public bool AddStaff(Staff s)
{

    String query = @"INSERT into Staff (firstname, surname, email, phone, notes, status)";
    query +=       @" VALUES (@_firstname, @_surname, @_email, @_phone, @_notes, @_status)";


    SqlCommand myCommand = new SqlCommand(query, _db);

    myCommand.Parameters.AddWithValue("@_firstname", s.FirstName);
    myCommand.Parameters.AddWithValue("@_surname", s.Surname);
    myCommand.Parameters.AddWithValue("@_email", s.Email);
    myCommand.Parameters.AddWithValue("@_phone", s.Phone);
    myCommand.Parameters.AddWithValue("@_notes", s.Notes);
    myCommand.Parameters.AddWithValue("@_status", s.StatusToString());

    int res = 0;

    _db.Open();
    res = myCommand.ExecuteNonQuery();   // Run the statement.
    _db.Close();

    if (res == 1) return true;           // Should only update one row.
    else return false;
}

我在发帖前阅读了这里的几个主题,我使用了参数,因为这里的很多示例都使用了它,并且因为它使代码更具可读性。另外,最后 res == 1 ,表示更新了一行。

当我调用这个方法时,它在 try/catch 块内,没有捕获到任何异常。更令人困惑的是,我可以通过右键单击数据库并转到 'new query' 来原始执行 sql 语句,并且它有效。如果您能帮助我理解我在这里做错了什么,我将不胜感激。

编辑:

这是相关table的架构:

CREATE TABLE [dbo].[Staff] (
    [Id]        INT            IDENTITY (1, 1) NOT NULL,
    [firstname] NVARCHAR (50)  NOT NULL,
    [surname]   NVARCHAR (50)  NOT NULL,
    [email]     NVARCHAR (75)  NOT NULL,
    [phone]     NVARCHAR (25)  NOT NULL,
    [notes]     NVARCHAR (250) NULL,
    [status]    NVARCHAR (20)  NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

语句返回的行数是检查是否成功的不可靠方法。这取决于会话 SET NOCOUNT 设置。

只要相信语句,如果它没有抛出则插入成功。

我根据您提供的详细信息创建了样本。请尝试与此匹配。这在我的本地工作没有任何问题。

using System;
using System.Data.SqlClient;

namespace TestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            Staff s = new Staff();

            s.FirstName = "abc";
            s.Surname = "xyz";
            s.Email = "a@a.com";
            s.Phone = "1234";
            s.Notes = "testnotes";

            bool isInserted = AddStaff(s);            
        }

        public static bool AddStaff(Staff s)
        {
            SqlConnection _db = new SqlConnection("Initial Catalog=XXXXXX;Data Source=localhost;Integrated Security=SSPI;");

            String query = @"INSERT into Staff (firstname, surname, email, phone, notes, status)";
            query += @" VALUES (@_firstname, @_surname, @_email, @_phone, @_notes, @_status)";


            SqlCommand myCommand = new SqlCommand(query, _db);

            myCommand.Parameters.AddWithValue("@_firstname", s.FirstName);
            myCommand.Parameters.AddWithValue("@_surname", s.Surname);
            myCommand.Parameters.AddWithValue("@_email", s.Email);
            myCommand.Parameters.AddWithValue("@_phone", s.Phone);
            myCommand.Parameters.AddWithValue("@_notes", s.Notes);
            myCommand.Parameters.AddWithValue("@_status", s.StatusToString());

            int res = 0;

            _db.Open();
            res = myCommand.ExecuteNonQuery();   // Run the statement.
            _db.Close();

            if (res == 1) return true;           // Should only update one row.
            else return false;
        }

    }

    class Staff
    {
        private string _firstname;
        private string _surname;
        private string _email;
        private string _phone;
        private string _notes;
        private string _status;

        public string FirstName
        {
            get
            {
                return _firstname;
            }
            set
            {
                _firstname = value;
            }
        }

        public string Surname
        {
            get
            {
                return _surname;
            }
            set
            {
                _surname = value;
            }
        }

        public string Email
        {
            get
            {
                return _email;
            }
            set
            {
                _email = value;
            }
        }

        public string Phone
        {
            get
            {
                return _phone;
            }
            set
            {
                _phone = value;
            }
        }

        public string Notes
        {
            get
            {
                return _notes;
            }
            set
            {
                _notes = value;
            }
        }

        public string StatusToString()
        {
            return "Valid";
        }

    }
}

好的,所以我终于弄明白为什么它不起作用了。

正在 /bin/Database/model.mdf 更新数据库。为了解决这个问题,我只查看我的服务器资源管理器中与 that 数据库相关的表。我还更改了 /Database/model.mdf 属性 [复制到输出目录] = 'copy if newer''always copy'.

问题已解决。感谢您的所有帮助,很抱歉这是一个微不足道的解决方案。