插入sql-database,报告成功但没有行

时间:2015-07-01 14:41:39

标签: c# sql sql-server visual-studio ado.net

我是那个试图自学C#/ .NET的单身学生(因为我的流不能教它)我在插入SQL时遇到了障碍数据库(我在这个例子中使用的是Sql Server)。令我困惑的是代码报告成功,但是当我检查表中的数据时,没有任何东西存在。这是我尝试写入数据库的代码:

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块内,没有异常被捕获。更令人困惑的是,我可以通过右键单击数据库并执行“新查询”来执行sql语句原始操作。它的工作原理。如果你能帮我理解我在这里做错了什么,我会很感激。

编辑:

这是相关表格的架构:

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)
);

3 个答案:

答案 0 :(得分:0)

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

只需信任该语句,如果它没有抛出,则插入成功。

答案 1 :(得分:0)

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

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";
        }

    }
}

答案 2 :(得分:0)

好的,所以我终于弄清楚它为什么不起作用。

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

问题解决了。感谢您的帮助,对不起,这是一个小小的解决方案。