无法通过SqlDataAdapter插入值
本文关键字:插入 SqlDataAdapter | 更新日期: 2023-09-27 18:29:59
我正在学习如何在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
是在SQLServerManagementStudio:中使用此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')
看起来我错过了一些要做的事情,这就是为什么我的代码对表没有影响的原因。
SqlDataAdapter.Update
将仅对具有RowState = DataRowState.Added
的数据表的行调用其InsertCommand
。
此行状态会自动分配给使用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以获取参考。
为了澄清上一个正确的答案,您需要对命令调用ExecuteNonQuery(),而不是dataAdapter。
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();
Joey