我正在学习如何在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')
看起来我错过了要做的事情,这就是为什么我的代码对桌子没有影响。
答案 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();
乔伊