2014-09-24 7 views
0

Я хочу вставить новую запись в DataTable с помощью DataAdapter. В таблице Person есть 2 столбца. Имя и фамилия.
У меня есть код, как показано ниже.Невозможно вставить в базу данных с SqlDataAdapter и MSSqlServer в C#

SqlConnection connection; 
DataSet dsPerson; 
SqlDataAdapter adapter; 
string connectionString = Properties.Resources.ConnectionString; 
connection = new SqlConnection(connectionString); 

dsPerson = new DataSet("PersonDataSet"); 
adapter = new SqlDataAdapter(); 
SqlCommand selectCommand = new SqlCommand("SELECT * FROM Person", connection); 
adapter.SelectCommand = selectCommand; 
adapter.Fill(dsPerson, "Person"); 

string insertQuery = "INSERT INTO Person(FirstName, LastName) VALUES (@FirstName, @LastName)"; 
SqlCommand insertCommand = new SqlCommand(insertQuery, connection); 

insertCommand.Parameters.Add(new SqlParameter("@FirstName", SqlDbType.NVarChar)); 
insertCommand.Parameters["@FirstName"].SourceVersion = DataRowVersion.Current; 
insertCommand.Parameters["@FirstName"].SourceColumn = "FirstName"; 

insertCommand.Parameters.Add(new SqlParameter("@LastName", SqlDbType.NVarChar)); 
insertCommand.Parameters["@LastName"].SourceVersion = DataRowVersion.Current; 
insertCommand.Parameters["@LastName"].SourceColumn = "LastName"; 

adapter.InsertCommand = insertCommand; 

Но когда я пытаюсь вставить новую запись в DataSet, она появляется в DataSet. Но он не вставляет новую запись в DataBase.
Код для вставки приведен ниже.

connection.Open(); 
DataRow newRow = dsPerson.Tables["Person"].NewRow(); 
newRow["FirstName"] = "Joseph"; 
newRow["LastName"] = "Sword"; 
dsPerson.Tables["Person"].Rows.Add(newRow); 
dsPerson.Tables["Person"].AcceptChanges(); 
dsPerson.AcceptChanges(); 
adapter.Update(dsPerson, "Person"); 
connection.Close(); 

Я даже пытаюсь отследить запросы, отправленные на сервер sql С помощью Express Profiler. И я увидел, что он не отправляет команду вставки в базу данных.
В чем проблема? Как его решить?
Спасибо.

ответ

2

Вы не должны называть AcceptChanges методы набора данных и DataTable, потому что метод DataAdapter.Update влияет только на измененные/добавленные/удаленные строки из datatable.

Но после вызова AcceptChanges все ваши DataRows будут иметь состояние Unchanged.

См MSDN для справки о DataAdapter:

Когда приложение вызывает метод Update, то DataAdapter рассматривает свойство RowState, и выполняет требуемую INSERT, UPDATE или ВЕЬЕТЕ итерационно для каждой строки, на основе порядка индексов , настроенных в DataSet.