无法通过SqlDataAdapter插入值

时间:2016-01-11 14:20:12

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

我正在学习如何在C#中使用SQL,并且在使用SqlDataAdapter时遇到了麻烦。我试图通过SqlCommand类使用直接查询,一切正常,但是当我重写我的代码以使用SqlDataAdapter时,我的表中没有任何变化。有我的代码:

SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ADO"]
                                                                 .ConnectionString);

connection.Open();

SqlDataAdapter daUser = new SqlDataAdapter("SELECT * FROM Books", connection);

SqlCommand insert = new SqlCommand();
insert.Connection = connection;
insert.CommandText = "INSERT INTO Books (name, author) VALUES (@name, @author);";

SqlParameterCollection pc = insert.Parameters;
pc.Add("@name", SqlDbType.VarChar, 20, "test123");
pc.Add("@author", SqlDbType.VarChar, 20, "test322");
daUser.InsertCommand = insert;

DataSet ds = new DataSet();
daUser.Fill(ds, "Books");
daUser.Update(ds, "Books");

Books是使用SQL Server Management Studio中的SQL查询创建的:

CREATE TABLE Books 
(
    id int PRIMARY KEY IDENTITY(1,1),
    name varchar(MAX) NOT NULL,
    author varchar(MAX) NOT NULL
)

INSERT INTO Books(name, author) 
VALUES('1984', 'George Orwell'), ('Fathers and sons', 'Dostoevski')

看起来我错过了要做的事情,这就是为什么我的代码对桌子没有影响。

2 个答案:

答案 0 :(得分:2)

SqlDataAdapter.Update仅针对具有InsertCommand的数据行行调用其RowState = DataRowState.Added

此行状态将自动分配给使用DataTable.Add方法添加到行集合的数据行(直到下一次调用AcceptChanges方法)。您也可以使用DataRow.SetAdded方法强制执行此状态分配。

由于在使用select命令填充数据表之后没有在数据表中修改/添加任何内容,因此无需插入任何内容。

将您的代码更改为

daUser.Fill(ds, "Books");

var newBook = daUser.Tables[0].NewRow();
newBook["name"] = "New Book";
newBook["author"] = "Author Name";
daUser.Tables[0].Rows.Add(newBook);

daUser.Update(ds, "Books");

,在这种情况下,它应该是添加到数据库表的新行。

请参阅MSDN以供参考。

答案 1 :(得分:-1)

为了澄清之前的答案,这是正确的,你想在命令而不是dataAdapter上调用ExecuteNonQuery()。

SqlCommand insert = new SqlCommand(); 
insert.Connection = connection;
insert.CommandText = "INSERT INTO Books (name, author) VALUES (@name,
@author);";
SqlParameterCollection pc = insert.Parameters;
pc.Add("@name", SqlDbType.VarChar, 20, "test123"); 
pc.Add("@author",
SqlDbType.VarChar, 20, "test322"); 
// you do not need this line if you execute the insert on the command object.
// daUser.InsertCommand = insert;

//Add this line instead:
insert.ExecuteNonQuery();

乔伊