无法通过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插入值

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