2011-03-30 76 views
0

下面的代碼似乎有問題,我想使用下面的代碼片段在數據庫中插入一個值。SQL數據適配器插入命令

DataTable dtUsers = new DataTable("tblUsers"); 
BindingSource bsUsers = new BindingSource(); 
SqlDataAdapter daUsers = new SqlDataAdapter("usp_GetUsers", Properties.Resources.ConnectionString); 


    daUsers.InsertCommand = new SqlCommand("usp_InsertNewUser"); 
       daUsers.InsertCommand.Connection = new SqlConnection(Properties.Resources.ConnectionString); 
       daUsers.InsertCommand.CommandType = CommandType.StoredProcedure; 
       daUsers.InsertCommand.Parameters.Clear(); 
       daUsers.InsertCommand.Parameters.Add("@username", SqlDbType.VarChar, 50).Value = txtUser.Text; 
       daUsers.InsertCommand.Parameters.Add("@password", SqlDbType.VarChar, 50).Value = txtPass.Text; 
       daUsers.InsertCommand.Parameters.Add("@userType", SqlDbType.Int).Value = cbxUserType.SelectedValue; 
       daUsers.Update(dtUsers); 

而在你問之前,存儲過程工作正常。而且,如果我將上面的InsertCommand更改爲SelectCommand並調用Fill方法,那麼一切正常!這是令人沮喪的,因爲如果使用Select/Fill組合,數據適配器的Insert/update方法不能正常工作。沒有數據行正在插入,因爲我也監視了這一點。也不會產生異常。 Al

回答

1

使用該準確的代碼片段,什麼也不會插入 - SqlDataAdapter.Update()的工作方式是爲所提供的數據表中的每個DataRow(dtUsers)添加一個RowState,它將調用InsertCommand已在數據適配器上定義。同樣,對於每個具有修改行狀態的DataRow,它都會調用已定義的UpdateCommand(如果有的話)。

SqlDataAdapter.Update()的目的是提供一個DataTable(可能包含新的,更新和刪除的行),它將調用適當的定義的sproc。

因此,在您的代碼中,您在添加RowState的dtUsers中沒有任何內容,因此沒有工作要發送到DB ....因此沒有任何內容被插入。

0

將參數設置爲在數據庫中提交插入後,可以使用adapter.InsertCommand.ExecuteNonQuery()

例如:

DataTable dtUsers = new DataTable("tblUsers"); 
BindingSource bsUsers = new BindingSource(); 
SqlDataAdapter daUsers = new SqlDataAdapter("usp_GetUsers",Properties.Resources.ConnectionString); 
daUsers.InsertCommand = new SqlCommand("usp_InsertNewUser"); 
daUsers.InsertCommand.Connection = new SqlConnection(Properties.Resources.ConnectionString); 
daUsers.InsertCommand.CommandType = CommandType.StoredProcedure; 
daUsers.InsertCommand.Parameters.Clear(); 
daUsers.InsertCommand.Parameters.Add("@username", SqlDbType.VarChar, 50).Value = txtUser.Text; 
daUsers.InsertCommand.Parameters.Add("@password", SqlDbType.VarChar, 50).Value = txtPass.Text; 
daUsers.InsertCommand.Parameters.Add("@userType", SqlDbType.Int).Value = cbxUserType.SelectedValue; 
daUsers.InsertCommand.ExecuteNonQuery(); 
daUsers.Update(dtUsers);