我是那个试图自学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)
);
答案 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'
。
问题解决了。感谢您的帮助,对不起,这是一个小小的解决方案。