插入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'
.
问题已解决。感谢您的所有帮助,很抱歉这是一个微不足道的解决方案。
我是一名尝试自学 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'
.
问题已解决。感谢您的所有帮助,很抱歉这是一个微不足道的解决方案。